[LLVMdev] need to store the address of a variable
    Paul Arndt 
    arndt at rbg.informatik.tu-darmstadt.de
       
    Sat Jun 28 09:00:28 PDT 2008
    
    
  
Hello everybody,
my problem is, that  I want to get an array of pointers to all local variables 
in a function. This array will be used for transfering these Variables to 
another execution engine. 
I've code which generates this array, and a pointer to the target field of the 
array.
name = variables.fname + "_pointerArray";
Instruction* pointerArray = new 		
		AllocaInst(PointerType::get(Type::Int32Ty,NULL),
		ConstantInt::get(Type::Int32Ty, variables.inst.size()),
		name,
		alloca_point);
		
		// fill array with the addresses of the functions
		for(unsigned int i = 0; i < variables.inst.size(); i++) {
			name = "store_" + variables.inst[i]->getName();
			Value* GEP = new GetElementPtrInst(pointerArray, 
							   ConstantInt::get(Type::Int32Ty, i),
							   name, 
	   						   alloca_point);
		}
the result of this is:
%minPos_pointerArray = alloca i32*, i32 26              ; <i32**> [#uses=26]
%store_tmp1 = getelementptr i32** %minPos_pointerArray, i32 1    ; <i32**> ... 
But I could not find a way to get a pointer to a given variable.
When I translate the following C Code with llvm-gcc 
int a;
int* d;
d = &a;
to LLVM I get the following LLVM Code
%a_addr = alloca i32    ; <i32*> [#uses=2]
%d = alloca i32*    ; <i32**> [#uses=2]
store i32 %a, i32* %a_addr
store i32* %a_addr, i32** %d, align 4							
how can I generate such an Instruction?
When I use
name = variables.inst[i]->getName() + "address_";
Instruction *AD = new AllocaInst(Type::Int32Ty, 
ConstantInt::get(Type::Int32Ty, 1), name, alloca_point);
StoreInst *SI = new StoreInst(variables.inst[i], AD, alloca_point);
StoreInst(SI, GEP, alloca_point);
the compiler is happy, but I get the following error at run time:
Instructions.cpp:904: void llvm::StoreInst::AssertOK(): Assertion 
`getOperand(0)->getType() == 
cast<PointerType>(getOperand(1)->getType())->getElementType() && "Ptr must be 
a pointer to Val type!"' failed.
I hope you understand what I want, and someone knows the right way to do that.
Many thanks for your time.
Paul
    
    
More information about the llvm-dev
mailing list