1 //===- ObjCARCAliasAnalysis.h - ObjC ARC Optimization -*- 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 42 ObjCARCAliasAnalysis() : ImmutablePass(ID) { 43 initializeObjCARCAliasAnalysisPass(*PassRegistry::getPassRegistry()); 44 } 45 46 private: 47 void initializePass() override { 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. 54 void *getAdjustedAnalysisPointer(const void *PI) override { 55 if (PI == &AliasAnalysis::ID) 56 return static_cast<AliasAnalysis *>(this); 57 return this; 58 } 59 60 void getAnalysisUsage(AnalysisUsage &AU) const override; 61 AliasResult alias(const Location &LocA, const Location &LocB) override; 62 bool pointsToConstantMemory(const Location &Loc, bool OrLocal) override; 63 ModRefBehavior getModRefBehavior(ImmutableCallSite CS) override; 64 ModRefBehavior getModRefBehavior(const Function *F) override; 65 ModRefResult getModRefInfo(ImmutableCallSite CS, 66 const Location &Loc) override; 67 ModRefResult getModRefInfo(ImmutableCallSite CS1, 68 ImmutableCallSite CS2) override; 69 }; 70 71 } // namespace objcarc 72 } // namespace llvm 73 74 #endif // LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H 75