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