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"
31 class AliasDebugger
: public ModulePass
, public AliasAnalysis
{
33 //What we do is simple. Keep track of every value the AA could
34 //know about, and verify that queries are one of those.
35 //A query to a value that didn't exist when the AA was created
36 //means someone forgot to update the AA when creating new values
38 std::set
<const Value
*> Vals
;
41 static char ID
; // Class identification, replacement for typeinfo
42 AliasDebugger() : ModulePass(&ID
) {}
44 bool runOnModule(Module
&M
) {
45 InitializeAliasAnalysis(this); // set up super class
47 for(Module::global_iterator I
= M
.global_begin(),
48 E
= M
.global_end(); I
!= E
; ++I
)
51 for(Module::iterator I
= M
.begin(),
52 E
= M
.end(); I
!= E
; ++I
){
54 if(!I
->isDeclaration()) {
55 for (Function::arg_iterator AI
= I
->arg_begin(), AE
= I
->arg_end();
58 for (Function::const_iterator FI
= I
->begin(), FE
= I
->end();
60 for (BasicBlock::const_iterator BI
= FI
->begin(), BE
= FI
->end();
69 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
70 AliasAnalysis::getAnalysisUsage(AU
);
71 AU
.setPreservesAll(); // Does not transform code
74 //------------------------------------------------
75 // Implement the AliasAnalysis API
77 AliasResult
alias(const Value
*V1
, unsigned V1Size
,
78 const Value
*V2
, unsigned V2Size
) {
79 assert(Vals
.find(V1
) != Vals
.end() && "Never seen value in AA before");
80 assert(Vals
.find(V2
) != Vals
.end() && "Never seen value in AA before");
81 return AliasAnalysis::alias(V1
, V1Size
, V2
, V2Size
);
84 ModRefResult
getModRefInfo(CallSite CS
, Value
*P
, unsigned Size
) {
85 assert(Vals
.find(P
) != Vals
.end() && "Never seen value in AA before");
86 return AliasAnalysis::getModRefInfo(CS
, P
, Size
);
89 ModRefResult
getModRefInfo(CallSite CS1
, CallSite CS2
) {
90 return AliasAnalysis::getModRefInfo(CS1
,CS2
);
93 void getMustAliases(Value
*P
, std::vector
<Value
*> &RetVals
) {
94 assert(Vals
.find(P
) != Vals
.end() && "Never seen value in AA before");
95 return AliasAnalysis::getMustAliases(P
, RetVals
);
98 bool pointsToConstantMemory(const Value
*P
) {
99 assert(Vals
.find(P
) != Vals
.end() && "Never seen value in AA before");
100 return AliasAnalysis::pointsToConstantMemory(P
);
103 virtual void deleteValue(Value
*V
) {
104 assert(Vals
.find(V
) != Vals
.end() && "Never seen value in AA before");
105 AliasAnalysis::deleteValue(V
);
107 virtual void copyValue(Value
*From
, Value
*To
) {
109 AliasAnalysis::copyValue(From
, To
);
115 char AliasDebugger::ID
= 0;
116 static RegisterPass
<AliasDebugger
>
117 X("debug-aa", "AA use debugger", false, true);
118 static RegisterAnalysisGroup
<AliasAnalysis
> Y(X
);
120 Pass
*llvm::createAliasDebugger() { return new AliasDebugger(); }