blob: 9523a563021fa7a8d5e144a2c9ecb88d4c6c1f79 [file] [log] [blame]
Chris Lattnerbb2a28f2002-03-26 22:39:06 +00001//===- FunctionRepBuilder.h - Structures for graph building ------*- C++ -*--=//
2//
3// This file defines the FunctionRepBuilder and InitVisitor classes that are
4// used to build the local data structure graph for a method.
5//
6//===----------------------------------------------------------------------===//
7
8#ifndef DATA_STRUCTURE_METHOD_REP_BUILDER_H
9#define DATA_STRUCTURE_METHOD_REP_BUILDER_H
10
11#include "llvm/Analysis/DataStructure.h"
12#include "llvm/Support/InstVisitor.h"
13
14// DEBUG_DATA_STRUCTURE_CONSTRUCTION - Define this to 1 if you want debug output
15#define DEBUG_DATA_STRUCTURE_CONSTRUCTION 0
16
17class FunctionRepBuilder;
18
19// InitVisitor - Used to initialize the worklists for data structure analysis.
20// Iterate over the instructions in the method, creating nodes for malloc and
21// call instructions. Add all uses of these to the worklist of instructions
22// to process.
23//
24class InitVisitor : public InstVisitor<InitVisitor> {
25 FunctionRepBuilder *Rep;
26 Function *Func;
27public:
28 InitVisitor(FunctionRepBuilder *R, Function *F) : Rep(R), Func(F) {}
29
30 void visitCallInst(CallInst *CI);
31 void visitAllocationInst(AllocationInst *AI);
32 void visitInstruction(Instruction *I);
33
34 // visitOperand - If the specified instruction operand is a global value, add
35 // a node for it...
36 //
37 void visitOperand(Value *V);
38};
39
40
41// FunctionRepBuilder - This builder object creates the datastructure graph for
42// a method.
43//
44class FunctionRepBuilder : InstVisitor<FunctionRepBuilder> {
45 friend class InitVisitor;
46 FunctionDSGraph *F;
47 PointerValSet RetNode;
48
49 // ValueMap - Mapping between values we are processing and the possible
50 // datastructures that they may point to...
51 map<Value*, PointerValSet> ValueMap;
52
53 // CallMap - Keep track of which call nodes correspond to which call insns.
54 // The reverse mapping is stored in the CallDSNodes themselves.
55 //
56 map<CallInst*, CallDSNode*> CallMap;
57
58 // Worklist - Vector of (pointer typed) instructions to process still...
59 std::vector<Instruction *> WorkList;
60
61 // Nodes - Keep track of all of the resultant nodes, because there may not
62 // be edges connecting these to anything.
63 //
Chris Lattner1120c8b2002-03-28 17:56:03 +000064 std::vector<ArgDSNode*> ArgNodes;
65 std::vector<AllocDSNode*> AllocNodes;
Chris Lattnerbb2a28f2002-03-26 22:39:06 +000066 std::vector<ShadowDSNode*> ShadowNodes;
Chris Lattner1120c8b2002-03-28 17:56:03 +000067 std::vector<GlobalDSNode*> GlobalNodes;
68 std::vector<CallDSNode*> CallNodes;
Chris Lattnerbb2a28f2002-03-26 22:39:06 +000069
70 // addAllUsesToWorkList - Add all of the instructions users of the specified
71 // value to the work list for further processing...
72 //
73 void addAllUsesToWorkList(Value *V);
74
75public:
76 FunctionRepBuilder(FunctionDSGraph *f) : F(f) {
77 initializeWorkList(F->getFunction());
78 processWorkList();
79 }
80
Chris Lattner1120c8b2002-03-28 17:56:03 +000081 const std::vector<ArgDSNode*> &getArgNodes() const { return ArgNodes; }
82 const std::vector<AllocDSNode*> &getAllocNodes() const { return AllocNodes; }
Chris Lattnerbb2a28f2002-03-26 22:39:06 +000083 const std::vector<ShadowDSNode*> &getShadowNodes() const {return ShadowNodes;}
Chris Lattner1120c8b2002-03-28 17:56:03 +000084 const std::vector<GlobalDSNode*> &getGlobalNodes() const {return GlobalNodes;}
85 const std::vector<CallDSNode*> &getCallNodes() const { return CallNodes; }
86
87 void addShadowNode(ShadowDSNode *SN) { ShadowNodes.push_back(SN); }
Chris Lattnerbb2a28f2002-03-26 22:39:06 +000088
89 const PointerValSet &getRetNode() const { return RetNode; }
90
91 const map<Value*, PointerValSet> &getValueMap() const { return ValueMap; }
92private:
93 static PointerVal getIndexedPointerDest(const PointerVal &InP,
94 const MemAccessInst *MAI);
95
96 void initializeWorkList(Function *Func);
97 void processWorkList() {
98 // While the worklist still has instructions to process, process them!
99 while (!WorkList.empty()) {
100 Instruction *I = WorkList.back(); WorkList.pop_back();
101#if DEBUG_DATA_STRUCTURE_CONSTRUCTION
102 cerr << "Processing worklist inst: " << I;
103#endif
104
105 visit(I); // Dispatch to a visitXXX function based on instruction type...
106#if DEBUG_DATA_STRUCTURE_CONSTRUCTION
107 if (I->hasName() && ValueMap.count(I)) {
108 cerr << "Inst %" << I->getName() << " value is:\n";
109 ValueMap[I].print(cerr);
110 }
111#endif
112 }
113 }
114
115 //===--------------------------------------------------------------------===//
116 // Functions used to process the worklist of instructions...
117 //
118 // Allow the visitor base class to invoke these methods...
119 friend class InstVisitor<FunctionRepBuilder>;
120
121 void visitGetElementPtrInst(GetElementPtrInst *GEP);
122 void visitReturnInst(ReturnInst *RI);
123 void visitLoadInst(LoadInst *LI);
124 void visitStoreInst(StoreInst *SI);
125 void visitCallInst(CallInst *CI);
126 void visitPHINode(PHINode *PN);
127 void visitSetCondInst(SetCondInst *SCI) {} // SetEQ & friends are ignored
128 void visitFreeInst(FreeInst *FI) {} // Ignore free instructions
129 void visitInstruction(Instruction *I) {
Chris Lattnere6b552f2002-03-31 07:15:20 +0000130 std::cerr << "\n\n\nUNKNOWN INSTRUCTION type: ";
131 I->dump();
132 std::cerr << "\n\n\n";
Chris Lattnerbb2a28f2002-03-26 22:39:06 +0000133 assert(0 && "Cannot proceed");
134 }
135};
136
137#endif