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