Skip to content

Commit 5083c86

Browse files
[Orc] Allow optional index argument in jitlink-check stub_addr expressions
1 parent 9913d3e commit 5083c86

File tree

8 files changed

+51
-28
lines changed

8 files changed

+51
-28
lines changed

llvm/include/llvm/ExecutionEngine/RuntimeDyldChecker.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class RuntimeDyldChecker {
154154
using GetSectionInfoFunction = std::function<Expected<MemoryRegionInfo>(
155155
StringRef FileName, StringRef SectionName)>;
156156
using GetStubInfoFunction = std::function<Expected<MemoryRegionInfo>(
157-
StringRef StubContainer, StringRef TargetName)>;
157+
StringRef StubContainer, StringRef TargetName, int64_t StubIndex)>;
158158
using GetGOTInfoFunction = std::function<Expected<MemoryRegionInfo>(
159159
StringRef GOTContainer, StringRef TargetName)>;
160160

llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,15 @@ class RuntimeDyldCheckerExprEval {
400400
StringRef Symbol;
401401
std::tie(Symbol, RemainingExpr) = parseSymbol(RemainingExpr);
402402

403+
// Parse optional stub index parameter
404+
int64_t StubIndex = 0;
405+
if (RemainingExpr.starts_with(",")) {
406+
RemainingExpr = RemainingExpr.substr(1).ltrim();
407+
EvalResult Number;
408+
std::tie(Number, RemainingExpr) = evalNumberExpr(RemainingExpr);
409+
StubIndex = Number.getValue();
410+
}
411+
403412
if (!RemainingExpr.starts_with(")"))
404413
return std::make_pair(
405414
unexpectedToken(RemainingExpr, Expr, "expected ')'"), "");
@@ -408,7 +417,7 @@ class RuntimeDyldCheckerExprEval {
408417
uint64_t StubAddr;
409418
std::string ErrorMsg;
410419
std::tie(StubAddr, ErrorMsg) = Checker.getStubOrGOTAddrFor(
411-
StubContainerName, Symbol, PCtx.IsInsideLoad, IsStubAddr);
420+
StubContainerName, Symbol, StubIndex, PCtx.IsInsideLoad, IsStubAddr);
412421

413422
if (ErrorMsg != "")
414423
return std::make_pair(EvalResult(ErrorMsg), "");
@@ -985,11 +994,13 @@ std::pair<uint64_t, std::string> RuntimeDyldCheckerImpl::getSectionAddr(
985994
}
986995

987996
std::pair<uint64_t, std::string> RuntimeDyldCheckerImpl::getStubOrGOTAddrFor(
988-
StringRef StubContainerName, StringRef SymbolName, bool IsInsideLoad,
989-
bool IsStubAddr) const {
997+
StringRef StubContainerName, StringRef SymbolName, int64_t StubIndex,
998+
bool IsInsideLoad, bool IsStubAddr) const {
990999

991-
auto StubInfo = IsStubAddr ? GetStubInfo(StubContainerName, SymbolName)
992-
: GetGOTInfo(StubContainerName, SymbolName);
1000+
assert((StubIndex == 0 || IsStubAddr) && "Indexing only supported for stubs");
1001+
auto StubInfo = IsStubAddr
1002+
? GetStubInfo(StubContainerName, SymbolName, StubIndex)
1003+
: GetGOTInfo(StubContainerName, SymbolName);
9931004

9941005
if (!StubInfo) {
9951006
std::string ErrMsg;

llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class RuntimeDyldCheckerImpl {
6464

6565
std::pair<uint64_t, std::string>
6666
getStubOrGOTAddrFor(StringRef StubContainerName, StringRef Symbol,
67-
bool IsInsideLoad, bool IsStubAddr) const;
67+
int64_t StubIndex, bool IsInsideLoad,
68+
bool IsStubAddr) const;
6869

6970
std::optional<uint64_t> getSectionLoadAddress(void *LocalAddr) const;
7071

llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ Error registerCOFFGraphInfo(Session &S, LinkGraph &G) {
130130
inconvertibleErrorCode());
131131

132132
if (auto TS = getCOFFStubTarget(G, Sym->getBlock()))
133-
FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(),
134-
Sym->getAddress().getValue(),
135-
Sym->getTargetFlags()};
133+
FileInfo.StubInfos[TS->getName()].insert(
134+
0, {Sym->getSymbolContent(), Sym->getAddress().getValue(),
135+
Sym->getTargetFlags()});
136136
else
137137
return TS.takeError();
138138
SectionContainsContent = true;

llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) {
150150
inconvertibleErrorCode());
151151

152152
if (auto TS = getELFStubTarget(G, Sym->getBlock()))
153-
FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(),
154-
Sym->getAddress().getValue(),
155-
Sym->getTargetFlags()};
153+
FileInfo.StubInfos[TS->getName()].insert(
154+
0, {Sym->getSymbolContent(), Sym->getAddress().getValue(),
155+
Sym->getTargetFlags()});
156156
else
157157
return TS.takeError();
158158
SectionContainsContent = true;
@@ -162,9 +162,9 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) {
162162
inconvertibleErrorCode());
163163

164164
if (auto Name = getELFAArch32StubTargetName(G, Sym->getBlock()))
165-
FileInfo.StubInfos[*Name] = {Sym->getSymbolContent(),
166-
Sym->getAddress().getValue(),
167-
Sym->getTargetFlags()};
165+
FileInfo.StubInfos[*Name].push_back({Sym->getSymbolContent(),
166+
Sym->getAddress().getValue(),
167+
Sym->getTargetFlags()});
168168
else
169169
return Name.takeError();
170170
SectionContainsContent = true;

llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,9 @@ Error registerMachOGraphInfo(Session &S, LinkGraph &G) {
129129
inconvertibleErrorCode());
130130

131131
if (auto TS = getMachOStubTarget(G, Sym->getBlock()))
132-
FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(),
133-
Sym->getAddress().getValue(),
134-
Sym->getTargetFlags()};
132+
FileInfo.StubInfos[TS->getName()].insert(
133+
0, {Sym->getSymbolContent(), Sym->getAddress().getValue(),
134+
Sym->getTargetFlags()});
135135
else
136136
return TS.takeError();
137137
SectionContainsContent = true;

llvm/tools/llvm-jitlink/llvm-jitlink.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,12 @@ operator<<(raw_ostream &OS, const Session::FileInfo &FI) {
331331
OS << " Section \"" << SIKV.first() << "\": " << SIKV.second << "\n";
332332
for (auto &GOTKV : FI.GOTEntryInfos)
333333
OS << " GOT \"" << GOTKV.first() << "\": " << GOTKV.second << "\n";
334-
for (auto &StubKV : FI.StubInfos)
335-
OS << " Stub \"" << StubKV.first() << "\": " << StubKV.second << "\n";
334+
for (auto &StubKVs : FI.StubInfos) {
335+
OS << " Stubs \"" << StubKVs.first() << "\":";
336+
for (auto MemRegion : StubKVs.second)
337+
OS << " " << MemRegion;
338+
OS << "\n";
339+
}
336340
return OS;
337341
}
338342

@@ -1206,7 +1210,8 @@ Session::findSectionInfo(StringRef FileName, StringRef SectionName) {
12061210
}
12071211

12081212
Expected<Session::MemoryRegionInfo &>
1209-
Session::findStubInfo(StringRef FileName, StringRef TargetName) {
1213+
Session::findStubInfo(StringRef FileName, StringRef TargetName,
1214+
uint64_t StubIndex) {
12101215
auto FI = findFileInfo(FileName);
12111216
if (!FI)
12121217
return FI.takeError();
@@ -1216,7 +1221,12 @@ Session::findStubInfo(StringRef FileName, StringRef TargetName) {
12161221
"\" registered for file \"" + FileName +
12171222
"\"",
12181223
inconvertibleErrorCode());
1219-
return StubInfoItr->second;
1224+
if (StubIndex >= StubInfoItr->second.size())
1225+
return make_error<StringError>(
1226+
"no stub for \"" + TargetName + " with index " + Twine(StubIndex) +
1227+
"\" registered for file \"" + FileName + "\"",
1228+
inconvertibleErrorCode());
1229+
return StubInfoItr->second[StubIndex];
12201230
}
12211231

12221232
Expected<Session::MemoryRegionInfo &>
@@ -1985,8 +1995,9 @@ static Error runChecks(Session &S, Triple TT, SubtargetFeatures Features) {
19851995
return S.findSectionInfo(FileName, SectionName);
19861996
};
19871997

1988-
auto GetStubInfo = [&S](StringRef FileName, StringRef SectionName) {
1989-
return S.findStubInfo(FileName, SectionName);
1998+
auto GetStubInfo = [&S](StringRef FileName, StringRef SectionName,
1999+
int64_t StubIndex) {
2000+
return S.findStubInfo(FileName, SectionName, StubIndex);
19902001
};
19912002

19922003
auto GetGOTInfo = [&S](StringRef FileName, StringRef SectionName) {

llvm/tools/llvm-jitlink/llvm-jitlink.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ struct Session {
4949

5050
struct FileInfo {
5151
StringMap<MemoryRegionInfo> SectionInfos;
52-
StringMap<MemoryRegionInfo> StubInfos;
52+
StringMap<SmallVector<MemoryRegionInfo, 1>> StubInfos;
5353
StringMap<MemoryRegionInfo> GOTEntryInfos;
5454
};
5555

@@ -63,8 +63,8 @@ struct Session {
6363
Expected<FileInfo &> findFileInfo(StringRef FileName);
6464
Expected<MemoryRegionInfo &> findSectionInfo(StringRef FileName,
6565
StringRef SectionName);
66-
Expected<MemoryRegionInfo &> findStubInfo(StringRef FileName,
67-
StringRef TargetName);
66+
Expected<MemoryRegionInfo &>
67+
findStubInfo(StringRef FileName, StringRef TargetName, uint64_t StubIndex);
6868
Expected<MemoryRegionInfo &> findGOTEntryInfo(StringRef FileName,
6969
StringRef TargetName);
7070

0 commit comments

Comments
 (0)