summaryrefslogtreecommitdiff
path: root/lib/VMCore/AsmWriter.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2009-07-30 00:02:57 +0000
committerDevang Patel <dpatel@apple.com>2009-07-30 00:02:57 +0000
commitc29d5b378ece00608ec96a5ccd2b0f53999f1957 (patch)
treebbaa3ec5c2affaff94bacb9d204f5ce755daa0a6 /lib/VMCore/AsmWriter.cpp
parent8770f747a98194056805f1b7cbcb0b75a7633b87 (diff)
downloadllvm-c29d5b378ece00608ec96a5ccd2b0f53999f1957.tar.gz
llvm-c29d5b378ece00608ec96a5ccd2b0f53999f1957.tar.bz2
llvm-c29d5b378ece00608ec96a5ccd2b0f53999f1957.tar.xz
print single NamedMDNode.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77549 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/AsmWriter.cpp')
-rw-r--r--lib/VMCore/AsmWriter.cpp48
1 files changed, 45 insertions, 3 deletions
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp
index 28cc56e6b4..bfdb0489b5 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<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);