<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 11 June 2017 at 12:05, Tim Northover <span dir="ltr"><<a href="mailto:t.p.northover@gmail.com" target="_blank">t.p.northover@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 11 June 2017 at 11:56, Dipanjan Das via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
> I can't pass var_value to a function accepting uint64_t. LLVM complains<br>
> about broken function call.<br>
<br>
Well, yes. var_value has type "ConstantInt *", not uint64_t. Assuming<br>
the value being stored actually is a constant known at compile-time<br>
you should be able to use cast<ConstantInt *>(vo)->getZExtValue() to<br>
retrieve a uint64_t value (careful of i128s!).<br>
<br>
If that cast fails then you're not dealing with a constant store. This<br>
is either a nuisance (if you were expecting the possibility and can<br>
deal with it) or a huge misunderstanding over compile-time vs runtime<br>
values.<br></blockquote><div><br></div><div>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().</div><div><br></div><div>Consider the code snippet below.</div><div><br></div><div>==================================================</div><div><br></div><div><div>if (StoreInst *store_inst = dyn_cast<StoreInst>(&I)) {</div><div>                    Value* vo = store_inst->getValueOperand();</div><div>                     uint64 var_value = /* cast vo to unsigned int 64 bit */</div><div><br></div><div>                   // Pass on this value to external function</div><div>                    IRBuilder<> builder(&I);</div><div><div>                    builder.SetInsertPoint(&B, ++builder.GetInsertPoint());</div></div><div>                    Constant *func = F.getParent()->getOrInsertFunction("instrument_store", </div><div>                                                                  Type::getVoidTy(Ctx), Type::getInt8PtrTy(Ctx), NULL);</div><div>                    Value* args[] = {var_value};</div><div>                    builder.CreateCall(func, args);</div><div> }</div></div><div><br></div><div>==================================================<br></div><div><br></div><div>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.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">If it's a nuisance, you can use "dyn_cast" instead of "cast". That'll<br>
return nullptr if the store wasn't a constant instead of crashing; you<br>
can decide what to do at that point.<br>
<br>
Cheers.<br>
<span class="gmail-HOEnZb"><font color="#888888"><br>
Tim.<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><span><div><div dir="ltr"><p>Thanks & Regards,</p>
<div>Dipanjan</div></div></div></span></div></div>
</div></div>