[LLVMdev] access array problem

Duncan Sands baldrick at free.fr
Tue May 17 23:29:21 PDT 2011


Hi Tan Guangming,

> I want to access an array in my instrumentation code. For example:
>
> GlobalVariable:
> int *counter; //counter the number of load/store operations in run-time
> int *counterArray; //record the load/store addresses

strictly speaking these are not arrays, they are pointers.  Also, you have
written them in some kind of C-style idiom.  What are the declarations in
LLVM IR?

> //increase the counter if a load/store is performed
> std::vector<Constant *>index(2);
> index[0] = Constant::getNullvalue(Type:getInt32Ty(Context));
> index[1] = Constant::get(Type::getInt32Ty(Context), 0);

The above two lines both compute the same thing (an i32 constant equal to
zero) in two different ways.

> Constant *ElementPtr = ConstantExpr::getGetElementPtr(counter,
> &index[0], index.size());
> Value *oldcounter = new LoadInst(ElementPtr, "oldcounter", InsertPos);
> Value *newcounter = BinaryOperator::Create(Instruction::Add,
> oldcounter, ConstantInt::get(Type::getInt64Ty(Context), 1),
> "newcounter", InsertPos);
> new StoreInst(newcounter, ElmentPtr, InserPos);
>
> //store the memory address to counterArray[oldcounter]
> std::vector<Constant*>  indexC(2);
> indexC[0] =  Constant::getNullvalue(Type:getInt32Ty(Context));
> indexC[1] = dync_cast(llvm::ConstantInt>(oldcounter);

Since oldcounter is not a constant (its value is not known at compile time...)
this is never going to work.  Declare the vector to be of Value* not Constant*.
Then you don't need the dynamic cast.

> Constant *ElmentPtr = ConstantExpr::getGetElementPtr(counterArray,
> &indexC[0], indexC.size());

This line can then not be a ConstantExpr, it has to be an instruction.  Again,
it cannot be a constant since the address computed isn't constant (it is not
known at compile time...).

Ciao, Duncan.

> ......// other codes
>
> Unfortunately, the oldcounter of Value type can not be cast to
> ConstantInt, dync_cast returns NULL.
> Is there any way to retrieve the integer value from oldcounter?
>
> Thanks!
>




More information about the llvm-dev mailing list