mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Add support for graph operations, and add a viewGraph method to SelectionDAG.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19440 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ce393a609b
commit
1080b9ee53
@ -73,6 +73,15 @@ public:
|
|||||||
MachineFunction &getMachineFunction() const { return MF; }
|
MachineFunction &getMachineFunction() const { return MF; }
|
||||||
const TargetMachine &getTarget() { return TM; }
|
const TargetMachine &getTarget() { return TM; }
|
||||||
|
|
||||||
|
/// viewGraph - Pop up a ghostview window with the DAG rendered using 'dot'.
|
||||||
|
///
|
||||||
|
void viewGraph();
|
||||||
|
|
||||||
|
|
||||||
|
typedef std::vector<SDNode*>::const_iterator allnodes_iterator;
|
||||||
|
allnodes_iterator allnodes_begin() const { return AllNodes.begin(); }
|
||||||
|
allnodes_iterator allnodes_end() const { return AllNodes.end(); }
|
||||||
|
|
||||||
/// getRoot - Return the root tag of the SelectionDAG.
|
/// getRoot - Return the root tag of the SelectionDAG.
|
||||||
///
|
///
|
||||||
const SDOperand &getRoot() const { return Root; }
|
const SDOperand &getRoot() const { return Root; }
|
||||||
@ -161,6 +170,16 @@ private:
|
|||||||
void DeleteNodeIfDead(SDNode *N, void *NodeSet);
|
void DeleteNodeIfDead(SDNode *N, void *NodeSet);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
|
||||||
|
typedef SelectionDAG::allnodes_iterator nodes_iterator;
|
||||||
|
static nodes_iterator nodes_begin(SelectionDAG *G) {
|
||||||
|
return G->allnodes_begin();
|
||||||
|
}
|
||||||
|
static nodes_iterator nodes_end(SelectionDAG *G) {
|
||||||
|
return G->allnodes_end();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
#define LLVM_CODEGEN_SELECTIONDAGNODES_H
|
#define LLVM_CODEGEN_SELECTIONDAGNODES_H
|
||||||
|
|
||||||
#include "llvm/CodeGen/ValueTypes.h"
|
#include "llvm/CodeGen/ValueTypes.h"
|
||||||
|
#include "llvm/ADT/GraphTraits.h"
|
||||||
|
#include "llvm/ADT/GraphTraits.h"
|
||||||
|
#include "llvm/ADT/iterator"
|
||||||
#include "llvm/Support/DataTypes.h"
|
#include "llvm/Support/DataTypes.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -638,6 +641,61 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class SDNodeIterator : public forward_iterator<SDNode, ptrdiff_t> {
|
||||||
|
SDNode *Node;
|
||||||
|
unsigned Operand;
|
||||||
|
|
||||||
|
SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {}
|
||||||
|
public:
|
||||||
|
bool operator==(const SDNodeIterator& x) const {
|
||||||
|
return Operand == x.Operand;
|
||||||
|
}
|
||||||
|
bool operator!=(const SDNodeIterator& x) const { return !operator==(x); }
|
||||||
|
|
||||||
|
const SDNodeIterator &operator=(const SDNodeIterator &I) {
|
||||||
|
assert(I.Node == Node && "Cannot assign iterators to two different nodes!");
|
||||||
|
Operand = I.Operand;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
pointer operator*() const {
|
||||||
|
return Node->getOperand(Operand).Val;
|
||||||
|
}
|
||||||
|
pointer operator->() const { return operator*(); }
|
||||||
|
|
||||||
|
SDNodeIterator& operator++() { // Preincrement
|
||||||
|
++Operand;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
SDNodeIterator operator++(int) { // Postincrement
|
||||||
|
SDNodeIterator tmp = *this; ++*this; return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); }
|
||||||
|
static SDNodeIterator end (SDNode *N) {
|
||||||
|
return SDNodeIterator(N, N->getNumOperands());
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned getOperand() const { return Operand; }
|
||||||
|
const SDNode *getNode() const { return Node; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template <> struct GraphTraits<SDNode*> {
|
||||||
|
typedef SDNode NodeType;
|
||||||
|
typedef SDNodeIterator ChildIteratorType;
|
||||||
|
static inline NodeType *getEntryNode(SDNode *N) { return N; }
|
||||||
|
static inline ChildIteratorType child_begin(NodeType *N) {
|
||||||
|
return SDNodeIterator::begin(N);
|
||||||
|
}
|
||||||
|
static inline ChildIteratorType child_end(NodeType *N) {
|
||||||
|
return SDNodeIterator::end(N);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // end llvm namespace
|
} // end llvm namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user