diff options
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 01f4247..8914835 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -58,6 +58,7 @@ #include "llvm/MC/MCValue.h" #include "llvm/MC/SectionKind.h" #include "llvm/ProfileData/InstrProf.h" +#include "llvm/Support/Base64.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/ErrorHandling.h" @@ -366,6 +367,31 @@ void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer &Streamer, } } + if (NamedMDNode *LLVMStats = M.getNamedMetadata("llvm.stats")) { + // Emit the metadata for llvm statistics into .llvm_stats section, which is + // formatted as a list of key/value pair, the value is base64 encoded. + auto *S = C.getObjectFileInfo()->getLLVMStatsSection(); + Streamer.switchSection(S); + for (const auto *Operand : LLVMStats->operands()) { + const auto *MD = cast<MDNode>(Operand); + assert(MD->getNumOperands() % 2 == 0 && + ("Operand num should be even for a list of key/value pair")); + for (size_t I = 0; I < MD->getNumOperands(); I += 2) { + // Encode the key string size. + auto *Key = cast<MDString>(MD->getOperand(I)); + Streamer.emitULEB128IntValue(Key->getString().size()); + Streamer.emitBytes(Key->getString()); + // Encode the value into a Base64 string. + std::string Value = encodeBase64( + Twine(mdconst::dyn_extract<ConstantInt>(MD->getOperand(I + 1)) + ->getZExtValue()) + .str()); + Streamer.emitULEB128IntValue(Value.size()); + Streamer.emitBytes(Value); + } + } + } + unsigned Version = 0; unsigned Flags = 0; StringRef Section; |