MemoryBuiltins.h revision 9e72a79ef4a9fcda482ce0b0e1f0bd6a4f16cffd
1//===- llvm/Analysis/MemoryBuiltins.h- Calls to memory builtins -*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This family of functions identifies calls to builtin functions that allocate
11// or free memory.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_ANALYSIS_MEMORYBUILTINS_H
16#define LLVM_ANALYSIS_MEMORYBUILTINS_H
17
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/SmallPtrSet.h"
20#include "llvm/Operator.h"
21#include "llvm/Support/DataTypes.h"
22#include "llvm/Support/InstVisitor.h"
23#include "llvm/Support/IRBuilder.h"
24#include "llvm/Support/TargetFolder.h"
25
26namespace llvm {
27class CallInst;
28class PointerType;
29class TargetData;
30class Type;
31class Value;
32
33
34/// \brief Tests if a value is a call to a library function that allocates or
35/// reallocates memory (either malloc, calloc, realloc, or strdup like).
36bool isAllocationFn(const Value *V, bool LookThroughBitCast = false);
37
38/// \brief Tests if a value is a call to a function that returns a NoAlias
39/// pointer (including malloc/calloc/strdup-like functions).
40bool isNoAliasFn(const Value *V, bool LookThroughBitCast = false);
41
42/// \brief Tests if a value is a call to a library function that allocates
43/// uninitialized memory (such as malloc).
44bool isMallocLikeFn(const Value *V, bool LookThroughBitCast = false);
45
46/// \brief Tests if a value is a call to a library function that allocates
47/// zero-filled memory (such as calloc).
48bool isCallocLikeFn(const Value *V, bool LookThroughBitCast = false);
49
50/// \brief Tests if a value is a call to a library function that allocates
51/// memory (either malloc, calloc, or strdup like).
52bool isAllocLikeFn(const Value *V, bool LookThroughBitCast = false);
53
54/// \brief Tests if a value is a call to a library function that reallocates
55/// memory (such as realloc).
56bool isReallocLikeFn(const Value *V, bool LookThroughBitCast = false);
57
58
59//===----------------------------------------------------------------------===//
60//  malloc Call Utility Functions.
61//
62
63/// extractMallocCall - Returns the corresponding CallInst if the instruction
64/// is a malloc call.  Since CallInst::CreateMalloc() only creates calls, we
65/// ignore InvokeInst here.
66const CallInst *extractMallocCall(const Value *I);
67static inline CallInst *extractMallocCall(Value *I) {
68  return const_cast<CallInst*>(extractMallocCall((const Value*)I));
69}
70
71/// extractMallocCallFromBitCast - Returns the corresponding CallInst if the
72/// instruction is a bitcast of the result of a malloc call.
73const CallInst *extractMallocCallFromBitCast(const Value *I);
74static inline CallInst *extractMallocCallFromBitCast(Value *I) {
75  return const_cast<CallInst*>(extractMallocCallFromBitCast((const Value*)I));
76}
77
78/// isArrayMalloc - Returns the corresponding CallInst if the instruction
79/// is a call to malloc whose array size can be determined and the array size
80/// is not constant 1.  Otherwise, return NULL.
81const CallInst *isArrayMalloc(const Value *I, const TargetData *TD);
82
83/// getMallocType - Returns the PointerType resulting from the malloc call.
84/// The PointerType depends on the number of bitcast uses of the malloc call:
85///   0: PointerType is the malloc calls' return type.
86///   1: PointerType is the bitcast's result type.
87///  >1: Unique PointerType cannot be determined, return NULL.
88PointerType *getMallocType(const CallInst *CI);
89
90/// getMallocAllocatedType - Returns the Type allocated by malloc call.
91/// The Type depends on the number of bitcast uses of the malloc call:
92///   0: PointerType is the malloc calls' return type.
93///   1: PointerType is the bitcast's result type.
94///  >1: Unique PointerType cannot be determined, return NULL.
95Type *getMallocAllocatedType(const CallInst *CI);
96
97/// getMallocArraySize - Returns the array size of a malloc call.  If the
98/// argument passed to malloc is a multiple of the size of the malloced type,
99/// then return that multiple.  For non-array mallocs, the multiple is
100/// constant 1.  Otherwise, return NULL for mallocs whose array size cannot be
101/// determined.
102Value *getMallocArraySize(CallInst *CI, const TargetData *TD,
103                          bool LookThroughSExt = false);
104
105
106//===----------------------------------------------------------------------===//
107//  calloc Call Utility Functions.
108//
109
110/// extractCallocCall - Returns the corresponding CallInst if the instruction
111/// is a calloc call.
112const CallInst *extractCallocCall(const Value *I);
113static inline CallInst *extractCallocCall(Value *I) {
114  return const_cast<CallInst*>(extractCallocCall((const Value*)I));
115}
116
117
118//===----------------------------------------------------------------------===//
119//  free Call Utility Functions.
120//
121
122/// isFreeCall - Returns non-null if the value is a call to the builtin free()
123const CallInst *isFreeCall(const Value *I);
124
125static inline CallInst *isFreeCall(Value *I) {
126  return const_cast<CallInst*>(isFreeCall((const Value*)I));
127}
128
129
130//===----------------------------------------------------------------------===//
131//  Utility functions to compute size of objects.
132//
133
134/// \brief Compute the size of the object pointed by Ptr. Returns true and the
135/// object size in Size if successful, and false otherwise.
136/// If RoundToAlign is true, then Size is rounded up to the aligment of allocas,
137/// byval arguments, and global variables.
138bool getObjectSize(const Value *Ptr, uint64_t &Size, const TargetData *TD,
139                   bool RoundToAlign = false);
140
141
142
143typedef std::pair<APInt, APInt> SizeOffsetType;
144
145/// \brief Evaluate the size and offset of an object ponted by a Value*
146/// statically. Fails if size or offset are not known at compile time.
147class ObjectSizeOffsetVisitor
148  : public InstVisitor<ObjectSizeOffsetVisitor, SizeOffsetType> {
149
150  const TargetData *TD;
151  bool RoundToAlign;
152  unsigned IntTyBits;
153  APInt Zero;
154
155  APInt align(APInt Size, uint64_t Align);
156
157  SizeOffsetType unknown() {
158    return std::make_pair(APInt(), APInt());
159  }
160
161public:
162  ObjectSizeOffsetVisitor(const TargetData *TD, LLVMContext &Context,
163                          bool RoundToAlign = false);
164
165  SizeOffsetType compute(Value *V);
166
167  bool knownSize(SizeOffsetType &SizeOffset) {
168    return SizeOffset.first.getBitWidth() > 1;
169  }
170
171  bool knownOffset(SizeOffsetType &SizeOffset) {
172    return SizeOffset.second.getBitWidth() > 1;
173  }
174
175  bool bothKnown(SizeOffsetType &SizeOffset) {
176    return knownSize(SizeOffset) && knownOffset(SizeOffset);
177  }
178
179  SizeOffsetType visitAllocaInst(AllocaInst &I);
180  SizeOffsetType visitArgument(Argument &A);
181  SizeOffsetType visitCallSite(CallSite CS);
182  SizeOffsetType visitConstantPointerNull(ConstantPointerNull&);
183  SizeOffsetType visitExtractValueInst(ExtractValueInst &I);
184  SizeOffsetType visitGEPOperator(GEPOperator &GEP);
185  SizeOffsetType visitGlobalVariable(GlobalVariable &GV);
186  SizeOffsetType visitIntToPtrInst(IntToPtrInst&);
187  SizeOffsetType visitLoadInst(LoadInst &I);
188  SizeOffsetType visitPHINode(PHINode&);
189  SizeOffsetType visitSelectInst(SelectInst &I);
190  SizeOffsetType visitUndefValue(UndefValue&);
191  SizeOffsetType visitInstruction(Instruction &I);
192};
193
194typedef std::pair<Value*, Value*> SizeOffsetEvalType;
195typedef IRBuilder<true, TargetFolder> BuilderTy;
196typedef DenseMap<const Value*, SizeOffsetEvalType> CacheMapTy;
197typedef SmallPtrSet<const Value*, 8> PtrSetTy;
198
199
200/// \brief Evaluate the size and offset of an object ponted by a Value*.
201/// May create code to compute the result at run-time.
202class ObjectSizeOffsetEvaluator
203  : public InstVisitor<ObjectSizeOffsetEvaluator, SizeOffsetEvalType> {
204
205  const TargetData *TD;
206  LLVMContext &Context;
207  BuilderTy Builder;
208  ObjectSizeOffsetVisitor Visitor;
209  IntegerType *IntTy;
210  Value *Zero;
211  CacheMapTy CacheMap;
212  PtrSetTy SeenVals;
213
214  SizeOffsetEvalType unknown() {
215    return std::make_pair((Value*)0, (Value*)0);
216  }
217  SizeOffsetEvalType compute_(Value *V);
218
219public:
220  ObjectSizeOffsetEvaluator(const TargetData *TD, LLVMContext &Context);
221  SizeOffsetEvalType compute(Value *V);
222
223  bool knownSize(SizeOffsetEvalType &SizeOffset) {
224    return SizeOffset.first;
225  }
226
227  bool knownOffset(SizeOffsetEvalType &SizeOffset) {
228    return SizeOffset.second;
229  }
230
231  bool anyKnown(SizeOffsetEvalType &SizeOffset) {
232    return knownSize(SizeOffset) || knownOffset(SizeOffset);
233  }
234
235  bool bothKnown(SizeOffsetEvalType &SizeOffset) {
236    return knownSize(SizeOffset) && knownOffset(SizeOffset);
237  }
238
239  SizeOffsetEvalType visitAllocaInst(AllocaInst &I);
240  SizeOffsetEvalType visitCallSite(CallSite CS);
241  SizeOffsetEvalType visitGEPOperator(GEPOperator &GEP);
242  SizeOffsetEvalType visitIntToPtrInst(IntToPtrInst&);
243  SizeOffsetEvalType visitLoadInst(LoadInst &I);
244  SizeOffsetEvalType visitPHINode(PHINode &PHI);
245  SizeOffsetEvalType visitSelectInst(SelectInst &I);
246  SizeOffsetEvalType visitInstruction(Instruction &I);
247};
248
249} // End llvm namespace
250
251#endif
252