[LLVMdev] How to lower the intrinsic function 'llvm.objectsize'?
Nuno Lopes
nunoplopes at sapo.pt
Wed Nov 5 15:25:47 PST 2014
You may also want to take a look at this:
http://llvm.org/docs/doxygen/html/classllvm_1_1ObjectSizeOffsetEvaluator.html
In summary, this can lower objectsize computation to either a constant (if
possible) or introduce additional instructions in the IR to compute the
value at run time. Sounds pretty much what you would want for KLEE.
This lowering is intra-procedural only. Anything else is too complicated.
Nuno
-----Original Message-----
From: Dingbao Xie
Sent: Wednesday, November 05, 2014 10:37 PM
To: Matt Arsenault
Cc: llvmdev at cs.uiuc.edu
Subject: Re: [LLVMdev] How to lower the intrinsic function
'llvm.objectsize'?
Thanks for your reply.
I'm attempting to expand KLEE to support this intrinsic function.
That's why I need to handle this myself.
According to the reply, the correct implementation should first find the
definition of the object and then determine the
size of the object.
BTW, can I just refer to the implementation in InstCombineCalls.cpp.
On Wed, Nov 5, 2014 at 2:24 PM, Matt Arsenault <Matthew.Arsenault at amd.com>
wrote:
On 11/05/2014 02:04 PM, Dingbao Xie wrote:
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:
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.
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();
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.
Value *result = ConstantInt::get(ii->getType(), bit_size);
ii->replaceAllUsesWith(result); ii->removeFromParent(); delete ii;
You shouldn't use delete here. You probably want ii->eraseFromParent().
break; } } }
I'm new to LLVM and not sure whether the implementation is correct. Can
anybody tell me whether the implementation is correct?
Thanks in advance.
--
Dingbao Xie
More information about the llvm-dev
mailing list