Coverage Report

Created: 2019-02-15 18:59

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Analysis/GlobalsModRef.h
Line
Count
Source (jump to first uncovered line)
1
//===- GlobalsModRef.h - Simple Mod/Ref AA for Globals ----------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
/// \file
9
/// This is the interface for a simple mod/ref and alias analysis over globals.
10
///
11
//===----------------------------------------------------------------------===//
12
13
#ifndef LLVM_ANALYSIS_GLOBALSMODREF_H
14
#define LLVM_ANALYSIS_GLOBALSMODREF_H
15
16
#include "llvm/Analysis/AliasAnalysis.h"
17
#include "llvm/Analysis/CallGraph.h"
18
#include "llvm/IR/Constants.h"
19
#include "llvm/IR/Function.h"
20
#include "llvm/IR/Module.h"
21
#include "llvm/IR/ValueHandle.h"
22
#include "llvm/Pass.h"
23
#include <list>
24
25
namespace llvm {
26
27
/// An alias analysis result set for globals.
28
///
29
/// This focuses on handling aliasing properties of globals and interprocedural
30
/// function call mod/ref information.
31
class GlobalsAAResult : public AAResultBase<GlobalsAAResult> {
32
  friend AAResultBase<GlobalsAAResult>;
33
34
  class FunctionInfo;
35
36
  const DataLayout &DL;
37
  const TargetLibraryInfo &TLI;
38
39
  /// The globals that do not have their addresses taken.
40
  SmallPtrSet<const GlobalValue *, 8> NonAddressTakenGlobals;
41
42
  /// IndirectGlobals - The memory pointed to by this global is known to be
43
  /// 'owned' by the global.
44
  SmallPtrSet<const GlobalValue *, 8> IndirectGlobals;
45
46
  /// AllocsForIndirectGlobals - If an instruction allocates memory for an
47
  /// indirect global, this map indicates which one.
48
  DenseMap<const Value *, const GlobalValue *> AllocsForIndirectGlobals;
49
50
  /// For each function, keep track of what globals are modified or read.
51
  DenseMap<const Function *, FunctionInfo> FunctionInfos;
52
53
  /// A map of functions to SCC. The SCCs are described by a simple integer
54
  /// ID that is only useful for comparing for equality (are two functions
55
  /// in the same SCC or not?)
56
  DenseMap<const Function *, unsigned> FunctionToSCCMap;
57
58
  /// Handle to clear this analysis on deletion of values.
59
  struct DeletionCallbackHandle final : CallbackVH {
60
    GlobalsAAResult *GAR;
61
    std::list<DeletionCallbackHandle>::iterator I;
62
63
    DeletionCallbackHandle(GlobalsAAResult &GAR, Value *V)
64
544k
        : CallbackVH(V), GAR(&GAR) {}
65
66
    void deleted() override;
67
  };
68
69
  /// List of callbacks for globals being tracked by this analysis. Note that
70
  /// these objects are quite large, but we only anticipate having one per
71
  /// global tracked by this analysis. There are numerous optimizations we
72
  /// could perform to the memory utilization here if this becomes a problem.
73
  std::list<DeletionCallbackHandle> Handles;
74
75
  explicit GlobalsAAResult(const DataLayout &DL, const TargetLibraryInfo &TLI);
76
77
public:
78
  GlobalsAAResult(GlobalsAAResult &&Arg);
79
  ~GlobalsAAResult();
80
81
  static GlobalsAAResult analyzeModule(Module &M, const TargetLibraryInfo &TLI,
82
                                       CallGraph &CG);
83
84
  //------------------------------------------------
85
  // Implement the AliasAnalysis API
86
  //
87
  AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB);
88
89
  using AAResultBase::getModRefInfo;
90
  ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc);
91
92
  /// getModRefBehavior - Return the behavior of the specified function if
93
  /// called from the specified call site.  The call site may be null in which
94
  /// case the most generic behavior of this function should be returned.
95
  FunctionModRefBehavior getModRefBehavior(const Function *F);
96
97
  /// getModRefBehavior - Return the behavior of the specified function if
98
  /// called from the specified call site.  The call site may be null in which
99
  /// case the most generic behavior of this function should be returned.
100
  FunctionModRefBehavior getModRefBehavior(const CallBase *Call);
101
102
private:
103
  FunctionInfo *getFunctionInfo(const Function *F);
104
105
  void AnalyzeGlobals(Module &M);
106
  void AnalyzeCallGraph(CallGraph &CG, Module &M);
107
  bool AnalyzeUsesOfPointer(Value *V,
108
                            SmallPtrSetImpl<Function *> *Readers = nullptr,
109
                            SmallPtrSetImpl<Function *> *Writers = nullptr,
110
                            GlobalValue *OkayStoreDest = nullptr);
111
  bool AnalyzeIndirectGlobalMemory(GlobalVariable *GV);
112
  void CollectSCCMembership(CallGraph &CG);
113
114
  bool isNonEscapingGlobalNoAlias(const GlobalValue *GV, const Value *V);
115
  ModRefInfo getModRefInfoForArgument(const CallBase *Call,
116
                                      const GlobalValue *GV);
117
};
118
119
/// Analysis pass providing a never-invalidated alias analysis result.
120
class GlobalsAA : public AnalysisInfoMixin<GlobalsAA> {
121
  friend AnalysisInfoMixin<GlobalsAA>;
122
  static AnalysisKey Key;
123
124
public:
125
  typedef GlobalsAAResult Result;
126
127
  GlobalsAAResult run(Module &M, ModuleAnalysisManager &AM);
128
};
129
130
/// Legacy wrapper pass to provide the GlobalsAAResult object.
131
class GlobalsAAWrapperPass : public ModulePass {
132
  std::unique_ptr<GlobalsAAResult> Result;
133
134
public:
135
  static char ID;
136
137
  GlobalsAAWrapperPass();
138
139
7.98M
  GlobalsAAResult &getResult() { return *Result; }
140
0
  const GlobalsAAResult &getResult() const { return *Result; }
141
142
  bool runOnModule(Module &M) override;
143
  bool doFinalization(Module &M) override;
144
  void getAnalysisUsage(AnalysisUsage &AU) const override;
145
};
146
147
//===--------------------------------------------------------------------===//
148
//
149
// createGlobalsAAWrapperPass - This pass provides alias and mod/ref info for
150
// global values that do not have their addresses taken.
151
//
152
ModulePass *createGlobalsAAWrapperPass();
153
}
154
155
#endif