[llvm] [BOLT][runtime] Add start & fini symbols (PR #68505)
Vladislav Khmelevsky via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 9 14:43:56 PDT 2023
https://github.com/yota9 updated https://github.com/llvm/llvm-project/pull/68505
>From e12e3887957ae0d809aed10cd0ca1cd48f4a9622 Mon Sep 17 00:00:00 2001
From: Vladislav Khmelevsky <och95 at yandex.ru>
Date: Sun, 8 Oct 2023 09:57:38 +0400
Subject: [PATCH] [BOLT][runtime] Add start & fini symbols
Add absent start & fini symbols, currently setted by bolt for runtime
libraries at DT_INIT and DT_FINI. The proper tests would be added by the
https://github.com/llvm/llvm-project/pull/67348 PR.
---
bolt/lib/Rewrite/RewriteInstance.cpp | 35 +++++++++++++++++++---------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 03cbe0461b21127..0d7947703ab0e64 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -4568,15 +4568,12 @@ void RewriteInstance::updateELFSymbolTable(
}
}
- assert((!NumHotTextSymsUpdated || NumHotTextSymsUpdated == 2) &&
- "either none or both __hot_start/__hot_end symbols were expected");
- assert((!NumHotDataSymsUpdated || NumHotDataSymsUpdated == 2) &&
- "either none or both __hot_data_start/__hot_data_end symbols were "
- "expected");
+ auto AddSymbol = [&](const StringRef &Name, uint64_t Address) {
+ if (!Address)
+ return;
- auto addSymbol = [&](const std::string &Name) {
ELFSymTy Symbol;
- Symbol.st_value = getNewValueForSymbol(Name);
+ Symbol.st_value = Address;
Symbol.st_shndx = ELF::SHN_ABS;
Symbol.st_name = AddToStrTab(Name);
Symbol.st_size = 0;
@@ -4589,14 +4586,30 @@ void RewriteInstance::updateELFSymbolTable(
Symbols.emplace_back(Symbol);
};
+ // Add runtime library start and fini address symbols
+ if (RuntimeLibrary *RtLibrary = BC->getRuntimeLibrary()) {
+ AddSymbol("__bolt_runtime_start", RtLibrary->getRuntimeStartAddress());
+ AddSymbol("__bolt_runtime_fini", RtLibrary->getRuntimeFiniAddress());
+ }
+
+ assert((!NumHotTextSymsUpdated || NumHotTextSymsUpdated == 2) &&
+ "either none or both __hot_start/__hot_end symbols were expected");
+ assert((!NumHotDataSymsUpdated || NumHotDataSymsUpdated == 2) &&
+ "either none or both __hot_data_start/__hot_data_end symbols were "
+ "expected");
+
+ auto AddEmittedSymbol = [&](const StringRef &Name) {
+ AddSymbol(Name, getNewValueForSymbol(Name));
+ };
+
if (opts::HotText && !NumHotTextSymsUpdated) {
- addSymbol("__hot_start");
- addSymbol("__hot_end");
+ AddEmittedSymbol("__hot_start");
+ AddEmittedSymbol("__hot_end");
}
if (opts::HotData && !NumHotDataSymsUpdated) {
- addSymbol("__hot_data_start");
- addSymbol("__hot_data_end");
+ AddEmittedSymbol("__hot_data_start");
+ AddEmittedSymbol("__hot_data_end");
}
// Put local symbols at the beginning.
More information about the llvm-commits
mailing list