On 11 June 2017 at 11:32, Nikodemus Siivola <nikodemus at random-state.net> wrote:> On Sun, Jun 11, 2017 at 7:49 PM, Dipanjan Das via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> >> >> On 11 June 2017 at 07:53, David Blaikie <dblaikie at gmail.com> wrote: >> >>> Sounds like you're looking for reinterpret_cast: http://en.cp >>> preference.com/w/cpp/language/reinterpret_cast >>> >> >> I tried cast<ConstInt>(vo), but that failed at run-time. >> > > That is not the same as reinterpret_cast<int64>(some_value_star). >None of the following work. Value* var_value = reinterpret_cast<intptr_t>(vo); Value* var_value= reinterpret_cast<uint64_t>(vo); The following worked, still didn't solve the problem: Value* var_value = reinterpret_cast<ConstantInt*>(vo); I can't pass var_value to a function accepting uint64_t. LLVM complains about broken function call.> Or better yet, reinterpret_cast<intptr_t>(some_value_star) > > http://www.cplusplus.com/reference/cstdint/ > > Cheers, > > -- nikodemus > > >> >> >>> >>> On Sun, Jun 11, 2017 at 3:06 AM Dipanjan Das via llvm-dev < >>> llvm-dev at lists.llvm.org> wrote: >>> >>>> >>>> I am trying to cast a Value* irrespective of its underlying subclass >>>> to uint64 and pass it on to a method as an argument. >>>> >>>> if (StoreInst *store_inst = dyn_cast<StoreInst>(&I)) { >>>> Value* vo = store_inst->getValueOperand(); >>>> uint64 value = /* cast vo to unsigned int 64 bit */ >>>> func(value); >>>> } >>>> >>>> How can I force cast 'vo' to unsigned int? >>>> >>>> -- >>>> >>>> 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 >> >> _______________________________________________ >> 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/cb8cd62c/attachment.html>
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. 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.
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>