blob: c9adf3f36ad74507b077735174f47ee503d40cce [file] [log] [blame]
Chris Lattner5c490612008-06-05 23:45:18 +00001//===- 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
20namespace llvm {
21 class LibCallInfo;
Bill Wendlingb877a1f2009-05-12 21:55:29 +000022 struct LibCallFunctionInfo;
Chris Lattner5c490612008-06-05 23:45:18 +000023
24 /// LibCallAliasAnalysis - Alias analysis driven from LibCallInfo.
Duncan Sands59bf4fc2009-09-06 08:55:57 +000025 struct LibCallAliasAnalysis : public FunctionPass, public AliasAnalysis {
Chris Lattner5c490612008-06-05 23:45:18 +000026 static char ID; // Class identification
27
28 LibCallInfo *LCI;
29
30 explicit LibCallAliasAnalysis(LibCallInfo *LC = 0)
Owen Anderson90c579d2010-08-06 18:33:48 +000031 : FunctionPass(ID), LCI(LC) {
Chris Lattner5c490612008-06-05 23:45:18 +000032 }
Owen Anderson90c579d2010-08-06 18:33:48 +000033 explicit LibCallAliasAnalysis(char &ID, LibCallInfo *LC)
Chris Lattner5c490612008-06-05 23:45:18 +000034 : FunctionPass(ID), LCI(LC) {
35 }
36 ~LibCallAliasAnalysis();
37
Dan Gohman79fca6f2010-08-03 21:48:53 +000038 ModRefResult getModRefInfo(ImmutableCallSite CS,
39 const Value *P, unsigned Size);
Chris Lattner5c490612008-06-05 23:45:18 +000040
Dan Gohman79fca6f2010-08-03 21:48:53 +000041 ModRefResult getModRefInfo(ImmutableCallSite CS1,
42 ImmutableCallSite CS2) {
Chris Lattner5c490612008-06-05 23:45:18 +000043 // TODO: Could compare two direct calls against each other if we cared to.
Dan Gohman79fca6f2010-08-03 21:48:53 +000044 return AliasAnalysis::getModRefInfo(CS1, CS2);
Chris Lattner5c490612008-06-05 23:45:18 +000045 }
46
47 virtual void getAnalysisUsage(AnalysisUsage &AU) const;
48
49 virtual bool runOnFunction(Function &F) {
50 InitializeAliasAnalysis(this); // set up super class
51 return false;
52 }
53
Nick Lewyckyb2bdf942010-07-30 20:19:09 +000054 /// 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.
Owen Anderson90c579d2010-08-06 18:33:48 +000058 virtual void *getAdjustedAnalysisPointer(const void *PI) {
59 if (PI == &AliasAnalysis::ID)
Nick Lewyckyb2bdf942010-07-30 20:19:09 +000060 return (AliasAnalysis*)this;
61 return this;
62 }
63
Chris Lattner5c490612008-06-05 23:45:18 +000064 private:
65 ModRefResult AnalyzeLibCallDetails(const LibCallFunctionInfo *FI,
Dan Gohman79fca6f2010-08-03 21:48:53 +000066 ImmutableCallSite CS,
67 const Value *P, unsigned Size);
Chris Lattner5c490612008-06-05 23:45:18 +000068 };
69} // End of llvm namespace
70
71#endif