[llvm-dev] Force casting a Value*
Dipanjan Das via llvm-dev
llvm-dev at lists.llvm.org
Sun Jun 11 18:05:22 PDT 2017
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>
More information about the llvm-dev
mailing list