//===- llvm/Analysis/MallocHelper.h ---- Identify malloc calls --*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This family of functions identifies calls to malloc, bitcasts of malloc // calls, and the types and array sizes associated with them. // //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_MALLOCHELPER_H #define LLVM_ANALYSIS_MALLOCHELPER_H namespace llvm { class BitCastInst; class CallInst; class Instruction; class PointerType; class Twine; class Type; class Value; //===----------------------------------------------------------------------===// // malloc Call Utility Functions. // /// isMalloc - Returns true if the the value is either a malloc call or a /// bitcast of the result of a malloc call bool isMalloc(const Value* I); bool isMalloc(Value* I); /// extractMallocCall - Returns the corresponding CallInst if the instruction /// is a malloc call. Since CallInst::CreateMalloc() only creates calls, we /// ignore InvokeInst here. const CallInst* extractMallocCall(const Value* I); CallInst* extractMallocCall(Value* I); /// extractMallocCallFromBitCast - Returns the corresponding CallInst if the /// instruction is a bitcast of the result of a malloc call. const CallInst* extractMallocCallFromBitCast(const Value* I); CallInst* extractMallocCallFromBitCast(Value* I); /// isArrayMalloc - Returns the corresponding CallInst if the instruction /// matches the malloc call IR generated by CallInst::CreateMalloc(). This /// means that it is a malloc call with one bitcast use AND the malloc call's /// size argument is: /// 1. a constant not equal to the malloc's allocated type /// or /// 2. the result of a multiplication by the malloc's allocated type /// Otherwise it returns NULL. /// The unique bitcast is needed to determine the type/size of the array /// allocation. CallInst* isArrayMalloc(Value* I); const CallInst* isArrayMalloc(const Value* I); /// getMallocType - Returns the PointerType resulting from the malloc call. /// This PointerType is the result type of the call's only bitcast use. /// If there is no unique bitcast use, then return NULL. const PointerType* getMallocType(const CallInst* CI); /// getMallocAllocatedType - Returns the Type allocated by malloc call. This /// Type is the result type of the call's only bitcast use. If there is no /// unique bitcast use, then return NULL. const Type* getMallocAllocatedType(const CallInst* CI); /// getMallocArraySize - Returns the array size of a malloc call. The array /// size is computated in 1 of 3 ways: /// 1. If the element type if of size 1, then array size is the argument to /// malloc. /// 2. Else if the malloc's argument is a constant, the array size is that /// argument divided by the element type's size. /// 3. Else the malloc argument must be a multiplication and the array size is /// the first operand of the multiplication. /// This function returns constant 1 if: /// 1. The malloc call's allocated type cannot be determined. /// 2. IR wasn't created by a call to CallInst::CreateMalloc() with a non-NULL /// ArraySize. Value* getMallocArraySize(CallInst* CI); } // End llvm namespace #endif