From ee25ed96f560a7e75fa65db8da87a82f7b8a873e Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Thu, 30 Jul 2009 00:02:57 +0000 Subject: [PATCH] print single NamedMDNode. llvm-svn: 77549 --- lib/VMCore/AsmWriter.cpp | 48 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 28cc56e6b4e..bfdb0489b5f 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -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(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(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(N->getElement(i)); + OS << '!' << SlotTable.getMetadataSlot(MD); + } + OS << "}\n"; + WriteMDNodes(OS, TypePrinter, SlotTable); } else if (const Constant *C = dyn_cast(this)) { TypePrinting TypePrinter; TypePrinter.print(C->getType(), OS);