1193323Sed//===- LibCallAliasAnalysis.h - Implement AliasAnalysis for libcalls ------===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10193323Sed// This file defines the LibCallAliasAnalysis class.
11193323Sed//
12193323Sed//===----------------------------------------------------------------------===//
13193323Sed
14252723Sdim#ifndef LLVM_ANALYSIS_LIBCALLALIASANALYSIS_H
15252723Sdim#define LLVM_ANALYSIS_LIBCALLALIASANALYSIS_H
16193323Sed
17193323Sed#include "llvm/Analysis/AliasAnalysis.h"
18193323Sed#include "llvm/Pass.h"
19193323Sed
20193323Sednamespace llvm {
21193323Sed  class LibCallInfo;
22193323Sed  struct LibCallFunctionInfo;
23193323Sed
24193323Sed  /// LibCallAliasAnalysis - Alias analysis driven from LibCallInfo.
25198090Srdivacky  struct LibCallAliasAnalysis : public FunctionPass, public AliasAnalysis {
26193323Sed    static char ID; // Class identification
27193323Sed
28193323Sed    LibCallInfo *LCI;
29193323Sed
30193323Sed    explicit LibCallAliasAnalysis(LibCallInfo *LC = 0)
31218893Sdim        : FunctionPass(ID), LCI(LC) {
32218893Sdim      initializeLibCallAliasAnalysisPass(*PassRegistry::getPassRegistry());
33193323Sed    }
34212904Sdim    explicit LibCallAliasAnalysis(char &ID, LibCallInfo *LC)
35218893Sdim        : FunctionPass(ID), LCI(LC) {
36218893Sdim      initializeLibCallAliasAnalysisPass(*PassRegistry::getPassRegistry());
37193323Sed    }
38193323Sed    ~LibCallAliasAnalysis();
39193323Sed
40212904Sdim    ModRefResult getModRefInfo(ImmutableCallSite CS,
41218893Sdim                               const Location &Loc);
42193323Sed
43212904Sdim    ModRefResult getModRefInfo(ImmutableCallSite CS1,
44212904Sdim                               ImmutableCallSite CS2) {
45193323Sed      // TODO: Could compare two direct calls against each other if we cared to.
46212904Sdim      return AliasAnalysis::getModRefInfo(CS1, CS2);
47193323Sed    }
48193323Sed
49193323Sed    virtual void getAnalysisUsage(AnalysisUsage &AU) const;
50193323Sed
51193323Sed    virtual bool runOnFunction(Function &F) {
52193323Sed      InitializeAliasAnalysis(this);                 // set up super class
53193323Sed      return false;
54193323Sed    }
55193323Sed
56212904Sdim    /// getAdjustedAnalysisPointer - This method is used when a pass implements
57212904Sdim    /// an analysis interface through multiple inheritance.  If needed, it
58212904Sdim    /// should override this to adjust the this pointer as needed for the
59212904Sdim    /// specified pass info.
60212904Sdim    virtual void *getAdjustedAnalysisPointer(const void *PI) {
61212904Sdim      if (PI == &AliasAnalysis::ID)
62212904Sdim        return (AliasAnalysis*)this;
63212904Sdim      return this;
64212904Sdim    }
65212904Sdim
66193323Sed  private:
67193323Sed    ModRefResult AnalyzeLibCallDetails(const LibCallFunctionInfo *FI,
68212904Sdim                                       ImmutableCallSite CS,
69218893Sdim                                       const Location &Loc);
70193323Sed  };
71193323Sed}  // End of llvm namespace
72193323Sed
73193323Sed#endif
74