Home | History | Annotate | Download | only in ObjCARC
      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
     42     ObjCARCAliasAnalysis() : ImmutablePass(ID) {
     43       initializeObjCARCAliasAnalysisPass(*PassRegistry::getPassRegistry());
     44     }
     45 
     46   private:
     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.
     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