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