Reference1
Defined in DataStructure.h:
class DataStructures : public ModulePass {
typedef std::map<const Function*, DSGraph*> DSInfoTy;
/// DataLayout, comes in handy
const DataLayout* TD;
/// Pass to get Graphs from
DataStructures* GraphSource;
/// Do we clone Graphs or steal them?
bool Clone;
/// do we reset the aux list to the func list?
bool resetAuxCalls;
/// Were are DSGraphs stolen by another pass?
bool DSGraphsStolen;
void buildGlobalECs(svset<const GlobalValue*>& ECGlobals);
void eliminateUsesOfECGlobals(DSGraph& G, const svset<const GlobalValue*> &ECGlobals);
// DSInfo, one graph for each function
DSInfoTy DSInfo;
// Name for printing
const char* printname;
protected:
/// The Globals Graph contains all information on the globals
DSGraph *GlobalsGraph;
/// GlobalECs - The equivalence classes for each global value that is merged
/// with other global values in the DSGraphs.
EquivalenceClasses<const GlobalValue*> GlobalECs;
SuperSet<Type*>* TypeSS;
// Callgraph, as computed so far
DSCallGraph callgraph;
// List of all address taken functions.
// This is used as target, of indirect calls for any indirect call site with // incomplete callee node.
std::vector<const Function*> GlobalFunctionList;
void init(DataStructures* D, bool clone, bool useAuxCalls, bool copyGlobalAuxCalls, bool resetAux);
void init(const DataLayout* T);
void formGlobalECs();
void cloneIntoGlobals(DSGraph* G, unsigned cloneFlags);
void cloneGlobalsInto(DSGraph* G, unsigned cloneFlags);
void restoreCorrectCallGraph();
void formGlobalFunctionList();
DataStructures(char & id, const char* name)
: ModulePass(id), TD(0), GraphSource(0), printname(name), GlobalsGraph(0) {
// For now, the graphs are owned by this pass
DSGraphsStolen = false;
}
public:
/// print - Print out the analysis results...
///
void print(llvm::raw_ostream &O, const Module *M) const;
void dumpCallGraph() const;
/// handleTest - Handles various user-specified testing options.
/// Returns true iff the user specified for us to test something.
///
bool handleTest(llvm::raw_ostream &O, const Module *M) const;
virtual void releaseMemory();
virtual bool hasDSGraph(const Function &F) const {
return DSInfo.find(&F) != DSInfo.end();
}
/// getDSGraph - Return the data structure graph for the specified function.
///
virtual DSGraph *getDSGraph(const Function &F) const {
std::map<const Function*, DSGraph*>::const_iterator I = DSInfo.find(&F);
assert(I != DSInfo.end() && "Function not in module!");
return I->second;
}
void setDSGraph(const Function& F, DSGraph* G) {
DSInfo[&F] = G;
}
DSGraph* getOrCreateGraph(const Function* F);
DSGraph* getGlobalsGraph() const { return GlobalsGraph; }
EquivalenceClasses<const GlobalValue*> &getGlobalECs() { return GlobalECs; }
const DataLayout& getDataLayout() const { return *TD; }
const DSCallGraph& getCallGraph() const { return callgraph; }
SuperSet<Type*>& getTypeSS() const { return *TypeSS; }
/// deleteValue/copyValue - Interfaces to update the DSGraphs in the program.
/// These correspond to the interfaces defined in the AliasAnalysis class.
void deleteValue(Value *V);
void copyValue(Value *From, Value *To);
};
If you could revise
the fundmental principles of
computer system design
to improve security...
... what would you change?