1 //===- ObjCARCAliasAnalysis.h - ObjC ARC Optimization -*- mode: 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 /// \file 10 /// This file declares a simple ARC-aware AliasAnalysis using special knowledge 11 /// of Objective C to enhance other optimization passes which rely on the Alias 12 /// Analysis infrastructure. 13 /// 14 /// WARNING: This file knows about certain library functions. It recognizes them 15 /// by name, and hardwires knowledge of their semantics. 16 /// 17 /// WARNING: This file knows about how certain Objective-C library functions are 18 /// used. Naive LLVM IR transformations which would otherwise be 19 /// behavior-preserving may break these assumptions. 20 /// 21 //===----------------------------------------------------------------------===// 22 23 #ifndef LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H 24 #define LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H 25 26 #include "llvm/Analysis/AliasAnalysis.h" 27 #include "llvm/Pass.h" 28 29 namespace llvm { 30 namespace objcarc { 31 32 /// \brief This is a simple alias analysis implementation that uses knowledge 33 /// of ARC constructs to answer queries. 34 /// 35 /// TODO: This class could be generalized to know about other ObjC-specific 36 /// tricks. Such as knowing that ivars in the non-fragile ABI are non-aliasing 37 /// even though their offsets are dynamic. 38 class ObjCARCAliasAnalysis : public ImmutablePass, 39 public AliasAnalysis { 40 public: 41 static char ID; // Class identification, replacement for typeinfo ObjCARCAliasAnalysis()42 ObjCARCAliasAnalysis() : ImmutablePass(ID) { 43 initializeObjCARCAliasAnalysisPass(*PassRegistry::getPassRegistry()); 44 } 45 46 private: initializePass()47 virtual void initializePass() { 48 InitializeAliasAnalysis(this); 49 } 50 51 /// This method is used when a pass implements an analysis interface through 52 /// multiple inheritance. If needed, it should override this to adjust the 53 /// this pointer as needed for the specified pass info. getAdjustedAnalysisPointer(const void * PI)54 virtual void *getAdjustedAnalysisPointer(const void *PI) { 55 if (PI == &AliasAnalysis::ID) 56 return static_cast<AliasAnalysis *>(this); 57 return this; 58 } 59 60 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 61 virtual AliasResult alias(const Location &LocA, const Location &LocB); 62 virtual bool pointsToConstantMemory(const Location &Loc, bool OrLocal); 63 virtual ModRefBehavior getModRefBehavior(ImmutableCallSite CS); 64 virtual ModRefBehavior getModRefBehavior(const Function *F); 65 virtual ModRefResult getModRefInfo(ImmutableCallSite CS, 66 const Location &Loc); 67 virtual ModRefResult getModRefInfo(ImmutableCallSite CS1, 68 ImmutableCallSite CS2); 69 }; 70 71 } // namespace objcarc 72 } // namespace llvm 73 74 #endif // LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H 75