[LLVMdev] Operating on contents of virtual registers

Eli Friedman eli.friedman at gmail.com
Wed Mar 16 21:40:06 PDT 2011


On Wed, Mar 16, 2011 at 9:33 PM, Ashay Rane <ashay.rane at asu.edu> wrote:
> Hi Eli,
> Thanks for the reply. The problem is that getOperand() returns an
> llvm::Instruction (that refers to the definition of the operand). What I am
> trying to find out is how to get the value of the operand. When you refer to
> bitcasting to i8*, do you mean casting the return value from getOperand()
> itself?
> Ashay

I mean calling IRBuilder::CreateBitCast with the return value from getOperand().

-Eli

> On Wed, Mar 16, 2011 at 11:03 PM, Eli Friedman <eli.friedman at gmail.com>
> wrote:
>>
>> On Wed, Mar 16, 2011 at 6:00 PM, Ashay Rane <ashay.rane at asu.edu> wrote:
>> > Hello,
>> > I was facing some difficulty in implementing a transform and I was
>> > wondering
>> > if I could get some help please.
>> > The transform needs to operate on the operands of certain instructions.
>> > For
>> > example, given an instruction, say "%10 = load i32* %9, align 4", I have
>> > to
>> > record the value of %9 and process it. Of course, this is only possible
>> > at
>> > runtime and so I am instrumenting the code such that a particular
>> > function
>> > is invoked just before the instruction of interest is executed.
>> > The problem that I am facing is in getting the value of the operands. As
>> > I
>> > understand, the operands could either be program variables (e.g. in "%6
>> > =
>> > load i32* %old, align 4") or one of the virtual registers (as in the
>> > first
>> > load instruction). For both cases, is it possible to extract the
>> > value/address of the operand (%9 or %old)?
>>
>> Those are both the same case; names for instructions only exist for
>> the sake of readability.
>>
>> > If yes, what should be the best
>> > function type to use so that I can pass this value as an argument to my
>> > function? For now, I am only concerned with load and store instructions
>> > and
>> > so (I suppose) I have to deal with pointers only.
>>
>> If you only need pointers, just use i8* as the type of the argument,
>> and bitcast the value to i8*.
>>
>> > An easy way that I can think of is to directly insert the LLVM IR
>> > (e.g. call
>> > void @my_function(%old)) but because I am using
>> > Module::getOrInsertFunction(), I have to have a function type. So
>> > alternatively, is there a way to insert direct LLVM instructions
>> > (without
>> > going through the type hierarchy)?
>>
>> Your approach of inserting a call is fine; making your own instruction
>> or intrinsic wouldn't make things any simpler.  There aren't any
>> shortcuts here.
>>
>> -Eli




More information about the llvm-dev mailing list