<div dir="ltr"><div><div><div><div><div>Thanks for your reply.<br></div>I'm attempting to expand KLEE to support this intrinsic function.<br></div>That's why I need to handle this myself.<br></div>According to the reply, the correct implementation should first find the definition of the object and then determine the <br></div>size of the object. <br></div>BTW, can I just refer to the implementation in InstCombineCalls.cpp.<div><div><div><div><div><div><br></div></div></div></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 5, 2014 at 2:24 PM, Matt Arsenault <span dir="ltr"><<a href="mailto:Matthew.Arsenault@amd.com" target="_blank">Matthew.Arsenault@amd.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><span class="">
<div>On 11/05/2014 02:04 PM, Dingbao Xie
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>
<p>The documentation of LLVM says that "The llvm.objectsize
intrinsic is lowered to a constant representing the size of
the object concerned". I'm attempting to lower this
intrinsic function to a constant in a pass. Below is the
code snippet that I wrote:</p>
</div>
</div>
</blockquote></span>
Why do you need to handle this yourself? This should already be
handled for you (see InstCombineCalls.cpp). However, you have a few
problems with this.<span class=""><br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div>
<pre><code>for (BasicBlock::iterator i = b.begin(), ie = b.end();
(i != ie) && (block_split == false);) {
IntrinsicInst *ii = dyn_cast<IntrinsicInst>(&*i);
++i;
if(ii) {
switch (ii->getIntrinsicID()) {
case Intrinsic::objectsize: {
IRBuilder<> builder(ii->getParent(), ii);
Value *op1 = ii->getArgOperand(0); //i8*
uint64_t bit_size = op1->getType()->getPointerElementType()->getPrimitiveSizeInBits();</code></pre>
</div>
</div>
</blockquote></span>
First, you can't always determine the size. Just looking at the
pointer element type isn't enough. This requires finding the object
definition, which can fail, and the existing handling uses
llvm::getObjectSize to for. In general when looking at type sizes
you don't want to use getPrimitiveSizeInBits, and should use the
DataLayout for various reasons.<span class=""><br>
<br>
<code></code>
<blockquote type="cite">
<div dir="ltr">
<div>
<pre><code>
Value *result = ConstantInt::get(ii->getType(), bit_size);
ii->replaceAllUsesWith(result);
ii->removeFromParent();
delete ii;</code></pre>
</div>
</div>
</blockquote>
</span><code>You shouldn't use delete here. You probably want
ii->eraseFromParent().<br>
</code>
<blockquote type="cite"><span class="">
<div dir="ltr">
<div>
<pre><code>
break;
}
}
}
</code></pre>
<p>I'm new to LLVM and not sure whether the implementation is
correct.
Can anybody tell me whether the implementation is correct?</p>
<p>
Thanks in advance.</p>
</div>
<br clear="all">
<br>
-- <br>
<div>
<div dir="ltr">
<div>Dingbao Xie<br>
</div>
</div>
</div>
</div>
<br>
<fieldset></fieldset>
<br>
</span><pre>_______________________________________________
LLVM Developers mailing list
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a> <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a>
</pre>
</blockquote>
<br>
</div>
</blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div dir="ltr"><div>Dingbao Xie<br></div></div></div>
</div>