mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-15 09:33:39 +00:00
Add initial support for a globals graph
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4656 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d888893a54
commit
2e4f9bf86e
@ -13,17 +13,12 @@
|
||||
/// DSGraph - The graph that represents a function.
|
||||
///
|
||||
class DSGraph {
|
||||
Function *Func;
|
||||
std::vector<DSNode*> Nodes;
|
||||
DSNodeHandle RetNode; // Node that gets returned...
|
||||
std::map<Value*, DSNodeHandle> ScalarMap;
|
||||
Function *Func; // Func - The LLVM function this graph corresponds to
|
||||
DSGraph *GlobalsGraph; // Pointer to the common graph of global objects
|
||||
|
||||
#if 0
|
||||
// GlobalsGraph -- Reference to the common graph of globally visible objects.
|
||||
// This includes GlobalValues, New nodes, Cast nodes, and Calls.
|
||||
//
|
||||
GlobalDSGraph* GlobalsGraph;
|
||||
#endif
|
||||
DSNodeHandle RetNode; // The node that gets returned...
|
||||
std::vector<DSNode*> Nodes;
|
||||
std::map<Value*, DSNodeHandle> ScalarMap;
|
||||
|
||||
// FunctionCalls - This vector maintains a single entry for each call
|
||||
// instruction in the current graph. The first entry in the vector is the
|
||||
@ -41,12 +36,17 @@ class DSGraph {
|
||||
|
||||
void operator=(const DSGraph &); // DO NOT IMPLEMENT
|
||||
public:
|
||||
DSGraph() : Func(0) {} // Create a new, empty, DSGraph.
|
||||
DSGraph(Function &F); // Compute the local DSGraph
|
||||
DSGraph() : Func(0), GlobalsGraph(0) {} // Create a new, empty, DSGraph.
|
||||
DSGraph(Function &F, DSGraph *GlobalsGraph); // Compute the local DSGraph
|
||||
|
||||
// Copy ctor - If you want to capture the node mapping between the source and
|
||||
// destination graph, you may optionally do this by specifying a map to record
|
||||
// this into.
|
||||
//
|
||||
// Note that a copied graph does not retain the GlobalsGraph pointer of the
|
||||
// source. You need to set a new GlobalsGraph with the setGlobalsGraph
|
||||
// method.
|
||||
//
|
||||
DSGraph(const DSGraph &DSG);
|
||||
DSGraph(const DSGraph &DSG, std::map<const DSNode*, DSNodeHandle> &NodeMap);
|
||||
~DSGraph();
|
||||
@ -54,6 +54,9 @@ public:
|
||||
bool hasFunction() const { return Func != 0; }
|
||||
Function &getFunction() const { return *Func; }
|
||||
|
||||
DSGraph *getGlobalsGraph() const { return GlobalsGraph; }
|
||||
void setGlobalsGraph(DSGraph *G) { GlobalsGraph = G; }
|
||||
|
||||
/// getNodes - Get a vector of all the nodes in the graph
|
||||
///
|
||||
const std::vector<DSNode*> &getNodes() const { return Nodes; }
|
||||
|
@ -33,6 +33,7 @@ namespace DataStructureAnalysis {
|
||||
class LocalDataStructures : public Pass {
|
||||
// DSInfo, one graph for each function
|
||||
std::map<const Function*, DSGraph*> DSInfo;
|
||||
DSGraph *GlobalsGraph;
|
||||
public:
|
||||
~LocalDataStructures() { releaseMemory(); }
|
||||
|
||||
|
@ -13,17 +13,12 @@
|
||||
/// DSGraph - The graph that represents a function.
|
||||
///
|
||||
class DSGraph {
|
||||
Function *Func;
|
||||
std::vector<DSNode*> Nodes;
|
||||
DSNodeHandle RetNode; // Node that gets returned...
|
||||
std::map<Value*, DSNodeHandle> ScalarMap;
|
||||
Function *Func; // Func - The LLVM function this graph corresponds to
|
||||
DSGraph *GlobalsGraph; // Pointer to the common graph of global objects
|
||||
|
||||
#if 0
|
||||
// GlobalsGraph -- Reference to the common graph of globally visible objects.
|
||||
// This includes GlobalValues, New nodes, Cast nodes, and Calls.
|
||||
//
|
||||
GlobalDSGraph* GlobalsGraph;
|
||||
#endif
|
||||
DSNodeHandle RetNode; // The node that gets returned...
|
||||
std::vector<DSNode*> Nodes;
|
||||
std::map<Value*, DSNodeHandle> ScalarMap;
|
||||
|
||||
// FunctionCalls - This vector maintains a single entry for each call
|
||||
// instruction in the current graph. The first entry in the vector is the
|
||||
@ -41,12 +36,17 @@ class DSGraph {
|
||||
|
||||
void operator=(const DSGraph &); // DO NOT IMPLEMENT
|
||||
public:
|
||||
DSGraph() : Func(0) {} // Create a new, empty, DSGraph.
|
||||
DSGraph(Function &F); // Compute the local DSGraph
|
||||
DSGraph() : Func(0), GlobalsGraph(0) {} // Create a new, empty, DSGraph.
|
||||
DSGraph(Function &F, DSGraph *GlobalsGraph); // Compute the local DSGraph
|
||||
|
||||
// Copy ctor - If you want to capture the node mapping between the source and
|
||||
// destination graph, you may optionally do this by specifying a map to record
|
||||
// this into.
|
||||
//
|
||||
// Note that a copied graph does not retain the GlobalsGraph pointer of the
|
||||
// source. You need to set a new GlobalsGraph with the setGlobalsGraph
|
||||
// method.
|
||||
//
|
||||
DSGraph(const DSGraph &DSG);
|
||||
DSGraph(const DSGraph &DSG, std::map<const DSNode*, DSNodeHandle> &NodeMap);
|
||||
~DSGraph();
|
||||
@ -54,6 +54,9 @@ public:
|
||||
bool hasFunction() const { return Func != 0; }
|
||||
Function &getFunction() const { return *Func; }
|
||||
|
||||
DSGraph *getGlobalsGraph() const { return GlobalsGraph; }
|
||||
void setGlobalsGraph(DSGraph *G) { GlobalsGraph = G; }
|
||||
|
||||
/// getNodes - Get a vector of all the nodes in the graph
|
||||
///
|
||||
const std::vector<DSNode*> &getNodes() const { return Nodes; }
|
||||
|
@ -33,6 +33,7 @@ namespace DataStructureAnalysis {
|
||||
class LocalDataStructures : public Pass {
|
||||
// DSInfo, one graph for each function
|
||||
std::map<const Function*, DSGraph*> DSInfo;
|
||||
DSGraph *GlobalsGraph;
|
||||
public:
|
||||
~LocalDataStructures() { releaseMemory(); }
|
||||
|
||||
|
@ -501,14 +501,14 @@ Function &DSCallSite::getCaller() const {
|
||||
// DSGraph Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
DSGraph::DSGraph(const DSGraph &G) : Func(G.Func) {
|
||||
DSGraph::DSGraph(const DSGraph &G) : Func(G.Func), GlobalsGraph(0) {
|
||||
std::map<const DSNode*, DSNodeHandle> NodeMap;
|
||||
RetNode = cloneInto(G, ScalarMap, NodeMap);
|
||||
}
|
||||
|
||||
DSGraph::DSGraph(const DSGraph &G,
|
||||
std::map<const DSNode*, DSNodeHandle> &NodeMap)
|
||||
: Func(G.Func) {
|
||||
: Func(G.Func), GlobalsGraph(0) {
|
||||
RetNode = cloneInto(G, ScalarMap, NodeMap);
|
||||
}
|
||||
|
||||
@ -1056,28 +1056,6 @@ void DSGraph::maskNodeTypes(unsigned char Mask) {
|
||||
// GlobalDSGraph Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
GlobalDSGraph::GlobalDSGraph() : DSGraph(*(Function*)0, this) {
|
||||
}
|
||||
|
||||
GlobalDSGraph::~GlobalDSGraph() {
|
||||
assert(Referrers.size() == 0 &&
|
||||
"Deleting global graph while references from other graphs exist");
|
||||
}
|
||||
|
||||
void GlobalDSGraph::addReference(const DSGraph* referrer) {
|
||||
if (referrer != this)
|
||||
Referrers.insert(referrer);
|
||||
}
|
||||
|
||||
void GlobalDSGraph::removeReference(const DSGraph* referrer) {
|
||||
if (referrer != this) {
|
||||
assert(Referrers.find(referrer) != Referrers.end() && "This is very bad!");
|
||||
Referrers.erase(referrer);
|
||||
if (Referrers.size() == 0)
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
// Bits used in the next function
|
||||
static const char ExternalTypeBits = DSNode::GlobalNode | DSNode::HeapNode;
|
||||
|
@ -131,7 +131,7 @@ namespace {
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DSGraph constructor - Simply use the GraphBuilder to construct the local
|
||||
// graph.
|
||||
DSGraph::DSGraph(Function &F) : Func(&F) {
|
||||
DSGraph::DSGraph(Function &F, DSGraph *GG) : Func(&F), GlobalsGraph(GG) {
|
||||
// Use the graph builder to construct the local version of the graph
|
||||
GraphBuilder B(*this, Nodes, RetNode, ScalarMap, FunctionCalls);
|
||||
markIncompleteNodes();
|
||||
@ -416,12 +416,16 @@ void LocalDataStructures::releaseMemory() {
|
||||
// Empty map so next time memory is released, data structures are not
|
||||
// re-deleted.
|
||||
DSInfo.clear();
|
||||
delete GlobalsGraph;
|
||||
GlobalsGraph = 0;
|
||||
}
|
||||
|
||||
bool LocalDataStructures::run(Module &M) {
|
||||
GlobalsGraph = new DSGraph();
|
||||
|
||||
// Calculate all of the graphs...
|
||||
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
|
||||
if (!I->isExternal())
|
||||
DSInfo.insert(std::make_pair(I, new DSGraph(*I)));
|
||||
DSInfo.insert(std::make_pair(I, new DSGraph(*I, GlobalsGraph)));
|
||||
return false;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user