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? 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 ============================================================ Regards, Ryan
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 >
John, Thanks for the reply! You said you'd written code to evaluate a constant expression, would it be possible for you to post that code? Ryan John Criswell wrote:> 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 >> > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-- Ryan M. Lefever [http://www.ews.uiuc.edu/~lefever]
Seemingly Similar Threads
- [LLVMdev] identifing mallocs with constant sizes
- [LLVMdev] How to force the creation of arrays with zeroes?
- [LLVMdev] How to force the creation of arrays with zeroes?
- [LLVMdev] How to force the creation of arrays with zeroes?
- [LLVMdev] [patch] Writing ConstantUnions