diff options
Diffstat (limited to 'llvm/lib/IR')
| -rw-r--r-- | llvm/lib/IR/AsmWriter.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 299665531f3..0564513c94a 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -776,12 +776,12 @@ void SlotTracker::processFunction() { if (!BB.hasName()) CreateFunctionSlot(&BB); + processFunctionMetadata(*TheFunction); + for (auto &I : BB) { if (!I.getType()->isVoidTy() && !I.hasName()) CreateFunctionSlot(&I); - processInstructionMetadata(I); - // We allow direct calls to any llvm.foo function here, because the // target may not be linked into the optimizer. if (const CallInst *CI = dyn_cast<CallInst>(&I)) { @@ -804,9 +804,15 @@ void SlotTracker::processFunction() { } void SlotTracker::processFunctionMetadata(const Function &F) { - for (auto &BB : F) + SmallVector<std::pair<unsigned, MDNode *>, 4> MDs; + for (auto &BB : F) { + F.getAllMetadata(MDs); + for (auto &MD : MDs) + CreateMetadataSlot(MD.second); + for (auto &I : BB) processInstructionMetadata(I); + } } void SlotTracker::processInstructionMetadata(const Instruction &I) { @@ -2541,6 +2547,10 @@ void AssemblyWriter::printFunction(const Function *F) { writeOperand(F->getPrologueData(), true); } + SmallVector<std::pair<unsigned, MDNode *>, 4> MDs; + F->getAllMetadata(MDs); + printMetadataAttachments(MDs, " "); + if (F->isDeclaration()) { Out << '\n'; } else { |

