mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-27 14:07:32 +00:00
print single NamedMDNode.
llvm-svn: 77549
This commit is contained in:
parent
31ac181755
commit
ee25ed96f5
@ -473,6 +473,9 @@ private:
|
||||
/// TheMDNode - The MDNode for which we are holding slot numbers.
|
||||
const MDNode *TheMDNode;
|
||||
|
||||
/// TheNamedMDNode - The MDNode for which we are holding slot numbers.
|
||||
const NamedMDNode *TheNamedMDNode;
|
||||
|
||||
/// mMap - The TypePlanes map for the module level data.
|
||||
ValueMap mMap;
|
||||
unsigned mNext;
|
||||
@ -491,6 +494,8 @@ public:
|
||||
explicit SlotTracker(const Function *F);
|
||||
/// Construct from a mdnode.
|
||||
explicit SlotTracker(const MDNode *N);
|
||||
/// Construct from a named mdnode.
|
||||
explicit SlotTracker(const NamedMDNode *N);
|
||||
|
||||
/// Return the slot number of the specified value in it's type
|
||||
/// plane. If something is not in the SlotTracker, return -1.
|
||||
@ -539,6 +544,9 @@ private:
|
||||
/// Add all MDNode operands.
|
||||
void processMDNode();
|
||||
|
||||
/// Add all MDNode operands.
|
||||
void processNamedMDNode();
|
||||
|
||||
SlotTracker(const SlotTracker &); // DO NOT IMPLEMENT
|
||||
void operator=(const SlotTracker &); // DO NOT IMPLEMENT
|
||||
};
|
||||
@ -578,20 +586,26 @@ static SlotTracker *createSlotTracker(const Value *V) {
|
||||
// to be added to the slot table.
|
||||
SlotTracker::SlotTracker(const Module *M)
|
||||
: TheModule(M), TheFunction(0), FunctionProcessed(false), TheMDNode(0),
|
||||
mNext(0), fNext(0), mdnNext(0) {
|
||||
TheNamedMDNode(0), mNext(0), fNext(0), mdnNext(0) {
|
||||
}
|
||||
|
||||
// Function level constructor. Causes the contents of the Module and the one
|
||||
// function provided to be added to the slot table.
|
||||
SlotTracker::SlotTracker(const Function *F)
|
||||
: TheModule(F ? F->getParent() : 0), TheFunction(F), FunctionProcessed(false),
|
||||
TheMDNode(0), mNext(0), fNext(0), mdnNext(0) {
|
||||
TheMDNode(0), TheNamedMDNode(0), mNext(0), fNext(0), mdnNext(0) {
|
||||
}
|
||||
|
||||
// Constructor to handle single MDNode.
|
||||
SlotTracker::SlotTracker(const MDNode *C)
|
||||
: TheModule(0), TheFunction(0), FunctionProcessed(false), TheMDNode(C),
|
||||
mNext(0), fNext(0), mdnNext(0) {
|
||||
TheNamedMDNode(0), mNext(0), fNext(0), mdnNext(0) {
|
||||
}
|
||||
|
||||
// Constructor to handle single NamedMDNode.
|
||||
SlotTracker::SlotTracker(const NamedMDNode *N)
|
||||
: TheModule(0), TheFunction(0), FunctionProcessed(false), TheMDNode(0),
|
||||
TheNamedMDNode(N), mNext(0), fNext(0), mdnNext(0) {
|
||||
}
|
||||
|
||||
inline void SlotTracker::initialize() {
|
||||
@ -605,6 +619,9 @@ inline void SlotTracker::initialize() {
|
||||
|
||||
if (TheMDNode)
|
||||
processMDNode();
|
||||
|
||||
if (TheNamedMDNode)
|
||||
processNamedMDNode();
|
||||
}
|
||||
|
||||
// Iterate through all the global variables, functions, and global
|
||||
@ -685,6 +702,19 @@ void SlotTracker::processMDNode() {
|
||||
ST_DEBUG("end processMDNode!\n");
|
||||
}
|
||||
|
||||
/// processNamedMDNode - Process TheNamedMDNode.
|
||||
void SlotTracker::processNamedMDNode() {
|
||||
ST_DEBUG("begin processNamedMDNode!\n");
|
||||
mdnNext = 0;
|
||||
for (unsigned i = 0, e = TheNamedMDNode->getNumElements(); i != e; ++i) {
|
||||
MDNode *MD = dyn_cast_or_null<MDNode>(TheNamedMDNode->getElement(i));
|
||||
if (MD)
|
||||
CreateMetadataSlot(MD);
|
||||
}
|
||||
TheNamedMDNode = 0;
|
||||
ST_DEBUG("end processNamedMDNode!\n");
|
||||
}
|
||||
|
||||
/// Clean up after incorporating a function. This is the only way to get out of
|
||||
/// the function incorporation state that affects get*Slot/Create*Slot. Function
|
||||
/// incorporation state is indicated by TheFunction != 0.
|
||||
@ -2010,6 +2040,18 @@ void Value::print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const {
|
||||
TypePrinting TypePrinter;
|
||||
SlotTable.initialize();
|
||||
WriteMDNodes(OS, TypePrinter, SlotTable);
|
||||
} else if (const NamedMDNode *N = dyn_cast<NamedMDNode>(this)) {
|
||||
SlotTracker SlotTable(N);
|
||||
TypePrinting TypePrinter;
|
||||
SlotTable.initialize();
|
||||
OS << "!" << N->getName() << " = !{";
|
||||
for (unsigned i = 0, e = N->getNumElements(); i != e; ++i) {
|
||||
if (i) OS << ", ";
|
||||
MDNode *MD = cast<MDNode>(N->getElement(i));
|
||||
OS << '!' << SlotTable.getMetadataSlot(MD);
|
||||
}
|
||||
OS << "}\n";
|
||||
WriteMDNodes(OS, TypePrinter, SlotTable);
|
||||
} else if (const Constant *C = dyn_cast<Constant>(this)) {
|
||||
TypePrinting TypePrinter;
|
||||
TypePrinter.print(C->getType(), OS);
|
||||
|
Loading…
Reference in New Issue
Block a user