[BOLT] Ignore special symbols as function aliases in updateELFSymbolTable
Exempt special symbols (hot text/data and _end symbol) from normal handling. We only need to set their value and make them absolute. If these symbols are handled as normal symbols and if they alias functions we may create non-sensical symbols, e.g. __hot_start.cold. Test Plan: updated hot-end-symbol.s Reviewers: maksfb, rafaelauler, ayermolo, dcci Reviewed By: dcci, maksfb Pull Request: https://github.com/llvm/llvm-project/pull/92713
This commit is contained in:
@@ -4808,6 +4808,40 @@ void RewriteInstance::updateELFSymbolTable(
|
||||
// Create a new symbol based on the existing symbol.
|
||||
ELFSymTy NewSymbol = Symbol;
|
||||
|
||||
// Handle special symbols based on their name.
|
||||
Expected<StringRef> SymbolName = Symbol.getName(StringSection);
|
||||
assert(SymbolName && "cannot get symbol name");
|
||||
|
||||
auto updateSymbolValue = [&](const StringRef Name,
|
||||
std::optional<uint64_t> Value = std::nullopt) {
|
||||
NewSymbol.st_value = Value ? *Value : getNewValueForSymbol(Name);
|
||||
NewSymbol.st_shndx = ELF::SHN_ABS;
|
||||
BC->outs() << "BOLT-INFO: setting " << Name << " to 0x"
|
||||
<< Twine::utohexstr(NewSymbol.st_value) << '\n';
|
||||
};
|
||||
|
||||
if (*SymbolName == "__hot_start" || *SymbolName == "__hot_end") {
|
||||
if (opts::HotText) {
|
||||
updateSymbolValue(*SymbolName);
|
||||
++NumHotTextSymsUpdated;
|
||||
}
|
||||
goto registerSymbol;
|
||||
}
|
||||
|
||||
if (*SymbolName == "__hot_data_start" || *SymbolName == "__hot_data_end") {
|
||||
if (opts::HotData) {
|
||||
updateSymbolValue(*SymbolName);
|
||||
++NumHotDataSymsUpdated;
|
||||
}
|
||||
goto registerSymbol;
|
||||
}
|
||||
|
||||
if (*SymbolName == "_end") {
|
||||
if (NextAvailableAddress > Symbol.st_value)
|
||||
updateSymbolValue(*SymbolName, NextAvailableAddress);
|
||||
goto registerSymbol;
|
||||
}
|
||||
|
||||
if (Function) {
|
||||
// If the symbol matched a function that was not emitted, update the
|
||||
// corresponding section index but otherwise leave it unchanged.
|
||||
@@ -4904,33 +4938,7 @@ void RewriteInstance::updateELFSymbolTable(
|
||||
}
|
||||
}
|
||||
|
||||
// Handle special symbols based on their name.
|
||||
Expected<StringRef> SymbolName = Symbol.getName(StringSection);
|
||||
assert(SymbolName && "cannot get symbol name");
|
||||
|
||||
auto updateSymbolValue = [&](const StringRef Name,
|
||||
std::optional<uint64_t> Value = std::nullopt) {
|
||||
NewSymbol.st_value = Value ? *Value : getNewValueForSymbol(Name);
|
||||
NewSymbol.st_shndx = ELF::SHN_ABS;
|
||||
BC->outs() << "BOLT-INFO: setting " << Name << " to 0x"
|
||||
<< Twine::utohexstr(NewSymbol.st_value) << '\n';
|
||||
};
|
||||
|
||||
if (opts::HotText &&
|
||||
(*SymbolName == "__hot_start" || *SymbolName == "__hot_end")) {
|
||||
updateSymbolValue(*SymbolName);
|
||||
++NumHotTextSymsUpdated;
|
||||
}
|
||||
|
||||
if (opts::HotData && (*SymbolName == "__hot_data_start" ||
|
||||
*SymbolName == "__hot_data_end")) {
|
||||
updateSymbolValue(*SymbolName);
|
||||
++NumHotDataSymsUpdated;
|
||||
}
|
||||
|
||||
if (*SymbolName == "_end" && NextAvailableAddress > Symbol.st_value)
|
||||
updateSymbolValue(*SymbolName, NextAvailableAddress);
|
||||
|
||||
registerSymbol:
|
||||
if (IsDynSym)
|
||||
Write((&Symbol - cantFail(Obj.symbols(&SymTabSection)).begin()) *
|
||||
sizeof(ELFSymTy),
|
||||
|
||||
Reference in New Issue
Block a user