[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