[LLVMdev] identifing mallocs with constant sizes

John Criswell criswell at cs.uiuc.edu
Fri May 11 12:24:20 PDT 2007

Ryan M. Lefever wrote:
> I am writing some code to identify malloc instructions with constant 
> request sizes and to determine the request size if it is constant.  I 
> have two questions.
> 1) If a malloc is for an array allocation and the array size is a 
> ConstantExpr, how can I obtain the value of the ConstantExpr?
The only way I know of is to determine what type of constant expression
it is and then evaluate it yourself.  So, you'd have something like this:

if (is a negation constantexpr)
    figure out the negated value of the operand
if (is a cast constantexpr)
    figure out the result of the operand casted to the new type
etc, etc.

If anyone knows of a more efficient way, I'd be curious, too.  I've had
to write code that determines the value of a constant expression, too.
> 2) I am using the following logic to determine if the malloc is for a 
> constant request size and to determine what is that size.  Does the 
> logic make sense?
> ============================================================
> if (malloc is for non-array allocation){
>    -- the request size is constant and is equal to the size of
>       allocated type
> }
> else{
>    // this is an array allocation
>    if(array size is a Constant){
>      -- the request size is constant and equal to the size of the
>         allocated type times the constant array size
>      if(the array size is a ConstantInt){
>        -- the array size can be obtained using getLimitedValue()
>      }
>      else if(the array size is a ConstantExpr){
>        -- there should be some way to evaluate the constant
>           expression???
>      }
>      else if(the array size is a ConstantAggregateZero){
>        -- the malloc is for size 0
>      }
>      else if(the array size is a ConstantFP){
>        -- I don't believe this case should happen but if it did,
>           the array size could be obtained by calling getValue()
>      }
>      else if(the array size is a ConstantArray or ConstantPointerNull
>              or ConstantStruct or ConstantVector or GlobalValue
>              or UndefValue){
>        -- this should not happen!
>      }
>    }
> }
> in all other cases, the malloc is for a non-constant request size
At a glance, this looks good, except that a ConstantInt is also a
Constant, so I don't see the difference between the two cases.

-- John T.

> =============================================================
> Regards,
> Ryan
> _______________________________________________
> 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