Skip to content

Commit 9fa77c1

Browse files
authored
[BOLT][Linker][NFC] Remove lookupSymbol() in favor of lookupSymbolInfo() (#128070)
Sometimes we need to know the size of a symbol besides its address, so maybe we can start using the existing `BOLTLinker::lookupSymbolInfo()` (that returns symbol address and size) and remove `BOLTLinker::lookupSymbol()` (that only returns symbol address). And for both we need to check return value as it is wrapped in `std::optional<>`, which makes the difference even smaller.
1 parent 3c46deb commit 9fa77c1

File tree

6 files changed

+33
-31
lines changed

6 files changed

+33
-31
lines changed

bolt/include/bolt/Core/Linker.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,6 @@ class BOLTLinker {
4646
/// Return the address and size of a symbol or std::nullopt if it cannot be
4747
/// found.
4848
virtual std::optional<SymbolInfo> lookupSymbolInfo(StringRef Name) const = 0;
49-
50-
/// Return the address of a symbol or std::nullopt if it cannot be found.
51-
std::optional<uint64_t> lookupSymbol(StringRef Name) const {
52-
if (const auto Info = lookupSymbolInfo(Name))
53-
return Info->Address;
54-
return std::nullopt;
55-
}
5649
};
5750

5851
} // namespace bolt

bolt/lib/Core/BinaryFunction.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4259,21 +4259,21 @@ void BinaryFunction::updateOutputValues(const BOLTLinker &Linker) {
42594259

42604260
if (BC.HasRelocations || isInjected()) {
42614261
if (hasConstantIsland()) {
4262-
const auto DataAddress =
4263-
Linker.lookupSymbol(getFunctionConstantIslandLabel()->getName());
4264-
assert(DataAddress && "Cannot find function CI symbol");
4265-
setOutputDataAddress(*DataAddress);
4262+
const auto IslandLabelSymInfo =
4263+
Linker.lookupSymbolInfo(getFunctionConstantIslandLabel()->getName());
4264+
assert(IslandLabelSymInfo && "Cannot find function CI symbol");
4265+
setOutputDataAddress(IslandLabelSymInfo->Address);
42664266
for (auto It : Islands->Offsets) {
42674267
const uint64_t OldOffset = It.first;
42684268
BinaryData *BD = BC.getBinaryDataAtAddress(getAddress() + OldOffset);
42694269
if (!BD)
42704270
continue;
42714271

42724272
MCSymbol *Symbol = It.second;
4273-
const auto NewAddress = Linker.lookupSymbol(Symbol->getName());
4274-
assert(NewAddress && "Cannot find CI symbol");
4273+
const auto SymInfo = Linker.lookupSymbolInfo(Symbol->getName());
4274+
assert(SymInfo && "Cannot find CI symbol");
42754275
auto &Section = *getCodeSection();
4276-
const auto NewOffset = *NewAddress - Section.getOutputAddress();
4276+
const auto NewOffset = SymInfo->Address - Section.getOutputAddress();
42774277
BD->setOutputLocation(Section, NewOffset);
42784278
}
42794279
}
@@ -4298,10 +4298,10 @@ void BinaryFunction::updateOutputValues(const BOLTLinker &Linker) {
42984298
FF.setAddress(ColdStartSymbolInfo->Address);
42994299
FF.setImageSize(ColdStartSymbolInfo->Size);
43004300
if (hasConstantIsland()) {
4301-
const auto DataAddress = Linker.lookupSymbol(
4301+
const auto SymInfo = Linker.lookupSymbolInfo(
43024302
getFunctionColdConstantIslandLabel()->getName());
4303-
assert(DataAddress && "Cannot find cold CI symbol");
4304-
setOutputColdDataAddress(*DataAddress);
4303+
assert(SymInfo && "Cannot find cold CI symbol");
4304+
setOutputColdDataAddress(SymInfo->Address);
43054305
}
43064306
}
43074307
}

bolt/lib/Rewrite/JITLinkLinker.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ struct JITLinkLinker::Context : jitlink::JITLinkContext {
125125
std::string SymName = (*Symbol.first).str();
126126
LLVM_DEBUG(dbgs() << "BOLT: looking for " << SymName << "\n");
127127

128-
if (auto Address = Linker.lookupSymbol(SymName)) {
128+
if (auto SymInfo = Linker.lookupSymbolInfo(SymName)) {
129129
LLVM_DEBUG(dbgs() << "Resolved to address 0x"
130-
<< Twine::utohexstr(*Address) << "\n");
130+
<< Twine::utohexstr(SymInfo->Address) << "\n");
131131
AllResults[Symbol.first] = orc::ExecutorSymbolDef(
132-
orc::ExecutorAddr(*Address), JITSymbolFlags());
132+
orc::ExecutorAddr(SymInfo->Address), JITSymbolFlags());
133133
continue;
134134
}
135135

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5907,9 +5907,9 @@ void RewriteInstance::writeEHFrameHeader() {
59075907
}
59085908

59095909
uint64_t RewriteInstance::getNewValueForSymbol(const StringRef Name) {
5910-
auto Value = Linker->lookupSymbol(Name);
5910+
auto Value = Linker->lookupSymbolInfo(Name);
59115911
if (Value)
5912-
return *Value;
5912+
return Value->Address;
59135913

59145914
// Return the original value if we haven't emitted the symbol.
59155915
BinaryData *BD = BC->getBinaryDataByName(Name);

bolt/lib/RuntimeLibs/HugifyRuntimeLibrary.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,11 @@ void HugifyRuntimeLibrary::link(BinaryContext &BC, StringRef ToolPath,
6868

6969
assert(!RuntimeStartAddress &&
7070
"We don't currently support linking multiple runtime libraries");
71-
RuntimeStartAddress = Linker.lookupSymbol("__bolt_hugify_self").value_or(0);
72-
if (!RuntimeStartAddress) {
71+
auto StartSymInfo = Linker.lookupSymbolInfo("__bolt_hugify_self");
72+
if (!StartSymInfo) {
7373
errs() << "BOLT-ERROR: hugify library does not define __bolt_hugify_self: "
7474
<< LibPath << "\n";
7575
exit(1);
7676
}
77+
RuntimeStartAddress = StartSymInfo->Address;
7778
}

bolt/lib/RuntimeLibs/InstrumentationRuntimeLibrary.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -203,27 +203,35 @@ void InstrumentationRuntimeLibrary::link(
203203
if (BC.isMachO())
204204
return;
205205

206-
RuntimeFiniAddress = Linker.lookupSymbol("__bolt_instr_fini").value_or(0);
207-
if (!RuntimeFiniAddress) {
206+
std::optional<BOLTLinker::SymbolInfo> FiniSymInfo =
207+
Linker.lookupSymbolInfo("__bolt_instr_fini");
208+
if (!FiniSymInfo) {
208209
errs() << "BOLT-ERROR: instrumentation library does not define "
209210
"__bolt_instr_fini: "
210211
<< LibPath << "\n";
211212
exit(1);
212213
}
213-
RuntimeStartAddress = Linker.lookupSymbol("__bolt_instr_start").value_or(0);
214-
if (!RuntimeStartAddress) {
214+
RuntimeFiniAddress = FiniSymInfo->Address;
215+
216+
std::optional<BOLTLinker::SymbolInfo> StartSymInfo =
217+
Linker.lookupSymbolInfo("__bolt_instr_start");
218+
if (!StartSymInfo) {
215219
errs() << "BOLT-ERROR: instrumentation library does not define "
216220
"__bolt_instr_start: "
217221
<< LibPath << "\n";
218222
exit(1);
219223
}
224+
RuntimeStartAddress = StartSymInfo->Address;
225+
220226
outs() << "BOLT-INFO: output linked against instrumentation runtime "
221227
"library, lib entry point is 0x"
222228
<< Twine::utohexstr(RuntimeStartAddress) << "\n";
229+
230+
std::optional<BOLTLinker::SymbolInfo> ClearSymInfo =
231+
Linker.lookupSymbolInfo("__bolt_instr_clear_counters");
232+
const uint64_t ClearSymAddress = ClearSymInfo ? ClearSymInfo->Address : 0;
223233
outs() << "BOLT-INFO: clear procedure is 0x"
224-
<< Twine::utohexstr(
225-
Linker.lookupSymbol("__bolt_instr_clear_counters").value_or(0))
226-
<< "\n";
234+
<< Twine::utohexstr(ClearSymAddress) << "\n";
227235

228236
emitTablesAsELFNote(BC);
229237
}

0 commit comments

Comments
 (0)