//===- ObjCARCAliasAnalysis.h - ObjC ARC Optimization -*- C++ -*-----------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// \file /// This file declares a simple ARC-aware AliasAnalysis using special knowledge /// of Objective C to enhance other optimization passes which rely on the Alias /// Analysis infrastructure. /// /// WARNING: This file knows about certain library functions. It recognizes them /// by name, and hardwires knowledge of their semantics. /// /// WARNING: This file knows about how certain Objective-C library functions are /// used. Naive LLVM IR transformations which would otherwise be /// behavior-preserving may break these assumptions. /// //===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H #define LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Pass.h" namespace llvm { namespace objcarc { /// \brief This is a simple alias analysis implementation that uses knowledge /// of ARC constructs to answer queries. /// /// TODO: This class could be generalized to know about other ObjC-specific /// tricks. Such as knowing that ivars in the non-fragile ABI are non-aliasing /// even though their offsets are dynamic. class ObjCARCAliasAnalysis : public ImmutablePass, public AliasAnalysis { public: static char ID; // Class identification, replacement for typeinfo ObjCARCAliasAnalysis() : ImmutablePass(ID) { initializeObjCARCAliasAnalysisPass(*PassRegistry::getPassRegistry()); } private: void initializePass() override { InitializeAliasAnalysis(this); } /// This method is used when a pass implements an analysis interface through /// multiple inheritance. If needed, it should override this to adjust the /// this pointer as needed for the specified pass info. void *getAdjustedAnalysisPointer(const void *PI) override { if (PI == &AliasAnalysis::ID) return static_cast<AliasAnalysis *>(this); return this; } void getAnalysisUsage(AnalysisUsage &AU) const override; AliasResult alias(const Location &LocA, const Location &LocB) override; bool pointsToConstantMemory(const Location &Loc, bool OrLocal) override; ModRefBehavior getModRefBehavior(ImmutableCallSite CS) override; ModRefBehavior getModRefBehavior(const Function *F) override; ModRefResult getModRefInfo(ImmutableCallSite CS, const Location &Loc) override; ModRefResult getModRefInfo(ImmutableCallSite CS1, ImmutableCallSite CS2) override; }; } // namespace objcarc } // namespace llvm #endif // LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H