diff options
author | Victor Hernandez <vhernandez@apple.com> | 2009-12-04 01:35:02 +0000 |
---|---|---|
committer | Victor Hernandez <vhernandez@apple.com> | 2009-12-04 01:35:02 +0000 |
commit | 97e2450de2ee50f51e42317d91a40b6d5ae65d0c (patch) | |
tree | 6073e3b3fd6ef86f087b0c1dceb6f6c4371344ec | |
parent | eb35699e642f2c021f04154bdb4bd90a1afb3baa (diff) |
Teach AsmWriter to write inline (not via a global metadata slot) metadata that contains an instruction
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90512 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/VMCore/AsmWriter.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 82d7914770..1865402a65 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -695,8 +695,13 @@ void SlotTracker::processFunction() { !I->hasName()) CreateFunctionSlot(I); for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) - if (MDNode *N = dyn_cast_or_null<MDNode>(I->getOperand(i))) + if (MDNode *N = dyn_cast_or_null<MDNode>(I->getOperand(i))) { + // Create a metadata slot only if N contains no instructions. + for (unsigned n = 0, e = N->getNumElements(); n != e; ++n) + if (isa<Instruction>(N->getElement(n))) + continue; CreateMetadataSlot(N); + } // Process metadata attached with this instruction. MDs.clear(); @@ -1227,6 +1232,25 @@ static void WriteAsOperandInternal(raw_ostream &Out, const Value *V, } if (const MDNode *N = dyn_cast<MDNode>(V)) { + if (Machine->getMetadataSlot(N) == -1) { + // Print metadata inline, not via slot reference number. + Out << "!{"; + for (unsigned mi = 0, me = N->getNumElements(); mi != me; ++mi) { + const Value *Val = N->getElement(mi); + if (!Val) + Out << "null"; + else { + TypePrinter->print(N->getElement(0)->getType(), Out); + Out << ' '; + WriteAsOperandInternal(Out, N->getElement(0), TypePrinter, Machine); + } + if (mi + 1 != me) + Out << ", "; + } + Out << '}'; + return; + } + Out << '!' << Machine->getMetadataSlot(N); return; } |