aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/TargetLoweringObjectFile.cpp
diff options
context:
space:
mode:
authorHaohai Wen <haohai.wen@intel.com>2025-07-15 17:48:04 +0800
committerGitHub <noreply@github.com>2025-07-15 17:48:04 +0800
commit148708493a80f9d75513f2e3721d043dd5b969a7 (patch)
tree017025032aca12c29d4d0195a6f674df6a7d7c58 /llvm/lib/Target/TargetLoweringObjectFile.cpp
parent0c3a2faa8505bb4a6d56682b7e63368a246e7ba1 (diff)
downloadllvm-148708493a80f9d75513f2e3721d043dd5b969a7.zip
llvm-148708493a80f9d75513f2e3721d043dd5b969a7.tar.gz
llvm-148708493a80f9d75513f2e3721d043dd5b969a7.tar.bz2
[NFC] Hoist pseudo probe desc emission code for reuse (#148756)
This PR is part of #123870. The pseudo probe desc emission code can be reused by other target.
Diffstat (limited to 'llvm/lib/Target/TargetLoweringObjectFile.cpp')
-rw-r--r--llvm/lib/Target/TargetLoweringObjectFile.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/lib/Target/TargetLoweringObjectFile.cpp b/llvm/lib/Target/TargetLoweringObjectFile.cpp
index 0920c33..a57f408 100644
--- a/llvm/lib/Target/TargetLoweringObjectFile.cpp
+++ b/llvm/lib/Target/TargetLoweringObjectFile.cpp
@@ -191,6 +191,35 @@ void TargetLoweringObjectFile::emitCGProfileMetadata(MCStreamer &Streamer,
}
}
+void TargetLoweringObjectFile::emitPseudoProbeDescMetadata(MCStreamer &Streamer,
+ Module &M) const {
+ NamedMDNode *FuncInfo = M.getNamedMetadata(PseudoProbeDescMetadataName);
+ if (!FuncInfo)
+ return;
+
+ // Emit a descriptor for every function including functions that have an
+ // available external linkage. We may not want this for imported functions
+ // that has code in another thinLTO module but we don't have a good way to
+ // tell them apart from inline functions defined in header files. Therefore
+ // we put each descriptor in a separate comdat section and rely on the
+ // linker to deduplicate.
+ auto &C = getContext();
+ for (const auto *Operand : FuncInfo->operands()) {
+ const auto *MD = cast<MDNode>(Operand);
+ auto *GUID = mdconst::dyn_extract<ConstantInt>(MD->getOperand(0));
+ auto *Hash = mdconst::dyn_extract<ConstantInt>(MD->getOperand(1));
+ auto *Name = cast<MDString>(MD->getOperand(2));
+ auto *S = C.getObjectFileInfo()->getPseudoProbeDescSection(
+ TM->getFunctionSections() ? Name->getString() : StringRef());
+
+ Streamer.switchSection(S);
+ Streamer.emitInt64(GUID->getZExtValue());
+ Streamer.emitInt64(Hash->getZExtValue());
+ Streamer.emitULEB128IntValue(Name->getString().size());
+ Streamer.emitBytes(Name->getString());
+ }
+}
+
/// getKindForGlobal - This is a top-level target-independent classifier for
/// a global object. Given a global variable and information from the TM, this
/// function classifies the global in a target independent manner. This function