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>