Home | History | Annotate | Download | only in Analysis
      1 //===- LibCallAliasAnalysis.h - Implement AliasAnalysis for libcalls ------===//
      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 file defines the LibCallAliasAnalysis class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_ANALYSIS_LIBCALL_AA_H
     15 #define LLVM_ANALYSIS_LIBCALL_AA_H
     16 
     17 #include "llvm/Analysis/AliasAnalysis.h"
     18 #include "llvm/Pass.h"
     19 
     20 namespace llvm {
     21   class LibCallInfo;
     22   struct LibCallFunctionInfo;
     23 
     24   /// LibCallAliasAnalysis - Alias analysis driven from LibCallInfo.
     25   struct LibCallAliasAnalysis : public FunctionPass, public AliasAnalysis {
     26     static char ID; // Class identification
     27 
     28     LibCallInfo *LCI;
     29 
     30     explicit LibCallAliasAnalysis(LibCallInfo *LC = 0)
     31         : FunctionPass(ID), LCI(LC) {
     32       initializeLibCallAliasAnalysisPass(*PassRegistry::getPassRegistry());
     33     }
     34     explicit LibCallAliasAnalysis(char &ID, LibCallInfo *LC)
     35         : FunctionPass(ID), LCI(LC) {
     36       initializeLibCallAliasAnalysisPass(*PassRegistry::getPassRegistry());
     37     }
     38     ~LibCallAliasAnalysis();
     39 
     40     ModRefResult getModRefInfo(ImmutableCallSite CS,
     41                                const Location &Loc);
     42 
     43     ModRefResult getModRefInfo(ImmutableCallSite CS1,
     44                                ImmutableCallSite CS2) {
     45       // TODO: Could compare two direct calls against each other if we cared to.
     46       return AliasAnalysis::getModRefInfo(CS1, CS2);
     47     }
     48 
     49     virtual void getAnalysisUsage(AnalysisUsage &AU) const;
     50 
     51     virtual bool runOnFunction(Function &F) {
     52       InitializeAliasAnalysis(this);                 // set up super class
     53       return false;
     54     }
     55 
     56     /// getAdjustedAnalysisPointer - This method is used when a pass implements
     57     /// an analysis interface through multiple inheritance.  If needed, it
     58     /// should override this to adjust the this pointer as needed for the
     59     /// specified pass info.
     60     virtual void *getAdjustedAnalysisPointer(const void *PI) {
     61       if (PI == &AliasAnalysis::ID)
     62         return (AliasAnalysis*)this;
     63       return this;
     64     }
     65 
     66   private:
     67     ModRefResult AnalyzeLibCallDetails(const LibCallFunctionInfo *FI,
     68                                        ImmutableCallSite CS,
     69                                        const Location &Loc);
     70   };
     71 }  // End of llvm namespace
     72 
     73 #endif
     74