On 11 June 2017 at 12:05, Tim Northover <t.p.northover at gmail.com> wrote:> On 11 June 2017 at 11:56, Dipanjan Das via llvm-dev > <llvm-dev at lists.llvm.org> wrote: > > I can't pass var_value to a function accepting uint64_t. LLVM complains > > about broken function call. > > Well, yes. var_value has type "ConstantInt *", not uint64_t. Assuming > the value being stored actually is a constant known at compile-time > you should be able to use cast<ConstantInt *>(vo)->getZExtValue() to > retrieve a uint64_t value (careful of i128s!). > > If that cast fails then you're not dealing with a constant store. This > is either a nuisance (if you were expecting the possibility and can > deal with it) or a huge misunderstanding over compile-time vs runtime > values. >I think it's a misunderstanding in may part. Let me explain my intention first. I want to retrieve the value (if isPointerTy() returns true) to be stored by a store instruction at run-time and pass on that value as either an unsigned int (64) or a pointer (char*) to an external function. The call to that function is inserted using IRBuilder.CreateCall(). Consider the code snippet below. ================================================= if (StoreInst *store_inst = dyn_cast<StoreInst>(&I)) { Value* vo = store_inst->getValueOperand(); uint64 var_value = /* cast vo to unsigned int 64 bit */ // Pass on this value to external function IRBuilder<> builder(&I); builder.SetInsertPoint(&B, ++builder.GetInsertPoint()); Constant *func F.getParent()->getOrInsertFunction("instrument_store", Type::getVoidTy(Ctx), Type::getInt8PtrTy(Ctx), NULL); Value* args[] = {var_value}; builder.CreateCall(func, args); } ================================================= To reiterate, I want to wrap up the run-time value (var_value) as a Value* and call the method (instrument_store) with that value as an argument.> If it's a nuisance, you can use "dyn_cast" instead of "cast". That'll > return nullptr if the store wasn't a constant instead of crashing; you > can decide what to do at that point. > > Cheers. > > Tim. >-- Thanks & Regards, Dipanjan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170611/45eba5d1/attachment.html>
Assuming you know it's a 64 bit value, and the function you are calling
takes a uint64_t, try this:
Value* args[] = {store_inst->getOperand(0)};
On Sun, Jun 11, 2017 at 1:16 PM, Dipanjan Das via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
>
>
> On 11 June 2017 at 12:05, Tim Northover <t.p.northover at gmail.com>
wrote:
>
>> On 11 June 2017 at 11:56, Dipanjan Das via llvm-dev
>> <llvm-dev at lists.llvm.org> wrote:
>> > I can't pass var_value to a function accepting uint64_t. LLVM
complains
>> > about broken function call.
>>
>> Well, yes. var_value has type "ConstantInt *", not uint64_t.
Assuming
>> the value being stored actually is a constant known at compile-time
>> you should be able to use cast<ConstantInt
*>(vo)->getZExtValue() to
>> retrieve a uint64_t value (careful of i128s!).
>>
>> If that cast fails then you're not dealing with a constant store.
This
>> is either a nuisance (if you were expecting the possibility and can
>> deal with it) or a huge misunderstanding over compile-time vs runtime
>> values.
>>
>
> I think it's a misunderstanding in may part. Let me explain my
intention
> first. I want to retrieve the value (if isPointerTy() returns true) to be
> stored by a store instruction at run-time and pass on that value as either
> an unsigned int (64) or a pointer (char*) to an external function. The call
> to that function is inserted using IRBuilder.CreateCall().
>
> Consider the code snippet below.
>
> =================================================>
> if (StoreInst *store_inst = dyn_cast<StoreInst>(&I)) {
> Value* vo = store_inst->getValueOperand();
> uint64 var_value = /* cast vo to unsigned int 64 bit
> */
>
> // Pass on this value to external function
> IRBuilder<> builder(&I);
> builder.SetInsertPoint(&B,
++builder.GetInsertPoint());
> Constant *func =
F.getParent()->getOrInsertFunction("
> instrument_store",
>
> Type::getVoidTy(Ctx), Type::getInt8PtrTy(Ctx), NULL);
> Value* args[] = {var_value};
> builder.CreateCall(func, args);
> }
>
> =================================================>
> To reiterate, I want to wrap up the run-time value (var_value) as a Value*
> and call the method (instrument_store) with that value as an argument.
>
>
>
>> If it's a nuisance, you can use "dyn_cast" instead of
"cast". That'll
>> return nullptr if the store wasn't a constant instead of crashing;
you
>> can decide what to do at that point.
>>
>> Cheers.
>>
>> Tim.
>>
>
>
>
> --
>
> Thanks & Regards,
> Dipanjan
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170611/e6f42163/attachment.html>
On 11 June 2017 at 14:04, don hinton <hintonda at gmail.com> wrote:> Assuming you know it's a 64 bit value, and the function you are calling > takes a uint64_t, try this: >The values from the test program are of type: i32/i32*/i32**. Can't I interpret these as uint64_t some way?> > Value* args[] = {store_inst->getOperand(0)}; > > > On Sun, Jun 11, 2017 at 1:16 PM, Dipanjan Das via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> >> >> On 11 June 2017 at 12:05, Tim Northover <t.p.northover at gmail.com> wrote: >> >>> On 11 June 2017 at 11:56, Dipanjan Das via llvm-dev >>> <llvm-dev at lists.llvm.org> wrote: >>> > I can't pass var_value to a function accepting uint64_t. LLVM complains >>> > about broken function call. >>> >>> Well, yes. var_value has type "ConstantInt *", not uint64_t. Assuming >>> the value being stored actually is a constant known at compile-time >>> you should be able to use cast<ConstantInt *>(vo)->getZExtValue() to >>> retrieve a uint64_t value (careful of i128s!). >>> >>> If that cast fails then you're not dealing with a constant store. This >>> is either a nuisance (if you were expecting the possibility and can >>> deal with it) or a huge misunderstanding over compile-time vs runtime >>> values. >>> >> >> I think it's a misunderstanding in may part. Let me explain my intention >> first. I want to retrieve the value (if isPointerTy() returns true) to be >> stored by a store instruction at run-time and pass on that value as either >> an unsigned int (64) or a pointer (char*) to an external function. The call >> to that function is inserted using IRBuilder.CreateCall(). >> >> Consider the code snippet below. >> >> =================================================>> >> if (StoreInst *store_inst = dyn_cast<StoreInst>(&I)) { >> Value* vo = store_inst->getValueOperand(); >> uint64 var_value = /* cast vo to unsigned int 64 bit >> */ >> >> // Pass on this value to external function >> IRBuilder<> builder(&I); >> builder.SetInsertPoint(&B, >> ++builder.GetInsertPoint()); >> Constant *func = F.getParent()->getOrInsertFunc >> tion("instrument_store", >> >> Type::getVoidTy(Ctx), Type::getInt8PtrTy(Ctx), NULL); >> Value* args[] = {var_value}; >> builder.CreateCall(func, args); >> } >> >> =================================================>> >> To reiterate, I want to wrap up the run-time value (var_value) as a >> Value* and call the method (instrument_store) with that value as an >> argument. >> >> >> >>> If it's a nuisance, you can use "dyn_cast" instead of "cast". That'll >>> return nullptr if the store wasn't a constant instead of crashing; you >>> can decide what to do at that point. >>> >>> Cheers. >>> >>> Tim. >>> >> >> >> >> -- >> >> Thanks & Regards, >> Dipanjan >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> >-- Thanks & Regards, Dipanjan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170611/d77c4640/attachment.html>