[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