1 //===- AliasDebugger.cpp - Simple Alias Analysis Use Checker --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This simple pass checks alias analysis users to ensure that if they
11 // create a new value, they do not query AA without informing it of the value.
12 // It acts as a shim over any other AA pass you want.
14 // Yes keeping track of every value in the program is expensive, but this is
17 //===----------------------------------------------------------------------===//
19 #include "llvm/Analysis/Passes.h"
20 #include "llvm/Module.h"
21 #include "llvm/Pass.h"
22 #include "llvm/Instructions.h"
23 #include "llvm/Constants.h"
24 #include "llvm/DerivedTypes.h"
25 #include "llvm/Analysis/AliasAnalysis.h"
26 #include "llvm/Support/Compiler.h"
32 class VISIBILITY_HIDDEN AliasDebugger
33 : public ModulePass
, public AliasAnalysis
{
35 //What we do is simple. Keep track of every value the AA could
36 //know about, and verify that queries are one of those.
37 //A query to a value that didn't exist when the AA was created
38 //means someone forgot to update the AA when creating new values
40 std::set
<const Value
*> Vals
;
43 static char ID
; // Class identification, replacement for typeinfo
44 AliasDebugger() : ModulePass(&ID
) {}
46 bool runOnModule(Module
&M
) {
47 InitializeAliasAnalysis(this); // set up super class
49 for(Module::global_iterator I
= M
.global_begin(),
50 E
= M
.global_end(); I
!= E
; ++I
)
53 for(Module::iterator I
= M
.begin(),
54 E
= M
.end(); I
!= E
; ++I
){
56 if(!I
->isDeclaration()) {
57 for (Function::arg_iterator AI
= I
->arg_begin(), AE
= I
->arg_end();
60 for (Function::const_iterator FI
= I
->begin(), FE
= I
->end();
62 for (BasicBlock::const_iterator BI
= FI
->begin(), BE
= FI
->end();
71 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
72 AliasAnalysis::getAnalysisUsage(AU
);
73 AU
.setPreservesAll(); // Does not transform code
76 //------------------------------------------------
77 // Implement the AliasAnalysis API
79 AliasResult
alias(const Value
*V1
, unsigned V1Size
,
80 const Value
*V2
, unsigned V2Size
) {
81 assert(Vals
.find(V1
) != Vals
.end() && "Never seen value in AA before");
82 assert(Vals
.find(V2
) != Vals
.end() && "Never seen value in AA before");
83 return AliasAnalysis::alias(V1
, V1Size
, V2
, V2Size
);
86 ModRefResult
getModRefInfo(CallSite CS
, Value
*P
, unsigned Size
) {
87 assert(Vals
.find(P
) != Vals
.end() && "Never seen value in AA before");
88 return AliasAnalysis::getModRefInfo(CS
, P
, Size
);
91 ModRefResult
getModRefInfo(CallSite CS1
, CallSite CS2
) {
92 return AliasAnalysis::getModRefInfo(CS1
,CS2
);
95 void getMustAliases(Value
*P
, std::vector
<Value
*> &RetVals
) {
96 assert(Vals
.find(P
) != Vals
.end() && "Never seen value in AA before");
97 return AliasAnalysis::getMustAliases(P
, RetVals
);
100 bool pointsToConstantMemory(const Value
*P
) {
101 assert(Vals
.find(P
) != Vals
.end() && "Never seen value in AA before");
102 return AliasAnalysis::pointsToConstantMemory(P
);
105 virtual void deleteValue(Value
*V
) {
106 assert(Vals
.find(V
) != Vals
.end() && "Never seen value in AA before");
107 AliasAnalysis::deleteValue(V
);
109 virtual void copyValue(Value
*From
, Value
*To
) {
111 AliasAnalysis::copyValue(From
, To
);
117 char AliasDebugger::ID
= 0;
118 static RegisterPass
<AliasDebugger
>
119 X("debug-aa", "AA use debugger", false, true);
120 static RegisterAnalysisGroup
<AliasAnalysis
> Y(X
);
122 Pass
*llvm::createAliasDebugger() { return new AliasDebugger(); }