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 | b7176a13a452b5154226cfab2cb9720d4667963e (patch) | |
| tree | baac86c180ad5d0c86a2383a7ec4e1dbe521ae2a /llvm | |
| parent | 2107eb70d9b37ff758c695d1aa8e911155d98acb (diff) | |
| download | bcm5719-llvm-b7176a13a452b5154226cfab2cb9720d4667963e.tar.gz bcm5719-llvm-b7176a13a452b5154226cfab2cb9720d4667963e.zip | |
Teach AsmWriter to write inline (not via a global metadata slot) metadata that contains an instruction
llvm-svn: 90512
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/VMCore/AsmWriter.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/llvm/lib/VMCore/AsmWriter.cpp b/llvm/lib/VMCore/AsmWriter.cpp index 82d7914770a..1865402a65f 100644 --- a/llvm/lib/VMCore/AsmWriter.cpp +++ b/llvm/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; } |

