[LLVMdev] How to lower the intrinsic function 'llvm.objectsize'?

Ahmed Bougacha ahmed.bougacha at gmail.com
Wed Nov 5 14:28:15 PST 2014


On Wed, Nov 5, 2014 at 2:04 PM, Dingbao Xie <xiedingbao at gmail.com> 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:
>
> 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();
>    Value *result = ConstantInt::get(ii->getType(), bit_size);
>    ii->replaceAllUsesWith(result);
>    ii->removeFromParent();
>    delete ii;
>    break;
>   }
>  }
> }
>
> I'm new to LLVM and not sure whether the implementation is correct. Can
> anybody tell me whether the implementation is correct?

If you don't want to do it yourself you can probably just use
getObjectSize, declared in include/llvm/Analysis/MemoryBuiltins.h.

Also, two things regarding your implementation:
- the intrinsic returns the size in bytes, not bits; generally, when
dealing with memory, bytes are the relevant unit anyway.
- llvm.objectsize returns the size of the "object", not just the
pointee type. So for instance, if you have an i8* pointer to a 10 byte
array, it would return 10, not 1. Before what you quoted, the
documentation says "An object in this context means an allocation of a
specific class, structure, array, or other object.".

Good luck,

- Ahmed

> Thanks in advance.
>
>
>
> --
> Dingbao Xie
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



More information about the llvm-dev mailing list