diff options
Diffstat (limited to 'llvm/lib/MC/MachObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/MachObjectWriter.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index 16941b1cb727..56bb03ad8d42 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -759,6 +759,23 @@ uint64_t MachObjectWriter::writeObject(MCAssembler &Asm, computeSymbolTable(Asm, LocalSymbolData, ExternalSymbolData, UndefinedSymbolData); + if (!Asm.CGProfile.empty()) { + MCSection *CGProfileSection = Asm.getContext().getMachOSection( + "__LLVM", "__cg_profile", 0, SectionKind::getMetadata()); + MCDataFragment *Frag = dyn_cast_or_null<MCDataFragment>( + &*CGProfileSection->getFragmentList().begin()); + assert(Frag && "call graph profile section not reserved"); + Frag->getContents().clear(); + raw_svector_ostream OS(Frag->getContents()); + for (const MCAssembler::CGProfileEntry &CGPE : Asm.CGProfile) { + uint32_t FromIndex = CGPE.From->getSymbol().getIndex(); + uint32_t ToIndex = CGPE.To->getSymbol().getIndex(); + support::endian::write(OS, FromIndex, W.Endian); + support::endian::write(OS, ToIndex, W.Endian); + support::endian::write(OS, CGPE.Count, W.Endian); + } + } + unsigned NumSections = Asm.size(); const MCAssembler::VersionInfoType &VersionInfo = Layout.getAssembler().getVersionInfo(); |