Skip to content

Commit 01ba627

Browse files
[llvm-jitlink] Refactor GOT and stubs registration (NFC) (#78365)
Add methods `registerGOTEntry()` and `registerStubEntry()` in `Session::FileInfo` to factor out generic code from the individual object type implementations.
1 parent 35121ad commit 01ba627

File tree

5 files changed

+89
-95
lines changed

5 files changed

+89
-95
lines changed

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

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -108,34 +108,17 @@ Error registerCOFFGraphInfo(Session &S, LinkGraph &G) {
108108
if (Sym->getAddress() > LastSym->getAddress())
109109
LastSym = Sym;
110110

111-
if (isGOTSection) {
112-
if (Sym->isSymbolZeroFill())
113-
return make_error<StringError>("zero-fill atom in GOT section",
114-
inconvertibleErrorCode());
115-
116-
// If this is a GOT symbol with size (i.e. not the GOT start symbol)
117-
// then add it to the GOT entry info table.
118-
if (Sym->getSize() != 0) {
119-
if (auto TS = getCOFFGOTTarget(G, Sym->getBlock()))
120-
FileInfo.GOTEntryInfos[TS->getName()] = {
121-
Sym->getSymbolContent(), Sym->getAddress().getValue(),
122-
Sym->getTargetFlags()};
123-
else
124-
return TS.takeError();
111+
if (isGOTSection || isStubsSection) {
112+
if (isGOTSection) {
113+
// Skip the GOT start symbol
114+
if (Sym->getSize() != 0)
115+
if (Error E = FileInfo.registerGOTEntry(G, *Sym, getCOFFGOTTarget))
116+
return E;
117+
} else {
118+
if (Error E = FileInfo.registerStubEntry(G, *Sym, getCOFFStubTarget))
119+
return E;
125120
}
126121
SectionContainsContent = true;
127-
} else if (isStubsSection) {
128-
if (Sym->isSymbolZeroFill())
129-
return make_error<StringError>("zero-fill atom in Stub section",
130-
inconvertibleErrorCode());
131-
132-
if (auto TS = getCOFFStubTarget(G, Sym->getBlock()))
133-
FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(),
134-
Sym->getAddress().getValue(),
135-
Sym->getTargetFlags()};
136-
else
137-
return TS.takeError();
138-
SectionContainsContent = true;
139122
}
140123

141124
if (Sym->hasName()) {

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

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,29 @@ static Expected<Symbol &> getELFStubTarget(LinkGraph &G, Block &B) {
7272
return getELFGOTTarget(G, GOTSym.getBlock());
7373
}
7474

75-
static Expected<std::string> getELFAArch32StubTargetName(LinkGraph &G,
76-
Block &B) {
75+
static Expected<Symbol &> getELFAArch32StubTarget(LinkGraph &G, Block &B) {
7776
auto E = getFirstRelocationEdge(G, B);
7877
if (!E)
7978
return E.takeError();
80-
Symbol &StubTarget = E->getTarget();
81-
return StubTarget.getName().str();
79+
return E->getTarget();
80+
}
81+
82+
enum SectionType { GOT, Stubs, AArch32Stubs, Other };
83+
84+
static Error registerSymbol(LinkGraph &G, Symbol &Sym, Session::FileInfo &FI,
85+
SectionType SecType) {
86+
switch (SecType) {
87+
case GOT:
88+
if (Sym.getSize() == 0)
89+
return Error::success(); // Skip the GOT start symbol
90+
return FI.registerGOTEntry(G, Sym, getELFGOTTarget);
91+
case Stubs:
92+
return FI.registerStubEntry(G, Sym, getELFStubTarget);
93+
case AArch32Stubs:
94+
return FI.registerStubEntry(G, Sym, getELFAArch32StubTarget);
95+
case Other:
96+
return Error::success();
97+
}
8298
}
8399

84100
namespace llvm {
@@ -113,9 +129,16 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) {
113129
"\"",
114130
inconvertibleErrorCode());
115131

116-
bool isGOTSection = isELFGOTSection(Sec);
117-
bool isStubsSection = isELFStubsSection(Sec);
118-
bool isAArch32StubsSection = isELFAArch32StubsSection(Sec);
132+
SectionType SecType;
133+
if (isELFGOTSection(Sec)) {
134+
SecType = GOT;
135+
} else if (isELFStubsSection(Sec)) {
136+
SecType = Stubs;
137+
} else if (isELFAArch32StubsSection(Sec)) {
138+
SecType = AArch32Stubs;
139+
} else {
140+
SecType = Other;
141+
}
119142

120143
bool SectionContainsContent = false;
121144
bool SectionContainsZeroFill = false;
@@ -128,45 +151,9 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) {
128151
if (Sym->getAddress() > LastSym->getAddress())
129152
LastSym = Sym;
130153

131-
if (isGOTSection) {
132-
if (Sym->isSymbolZeroFill())
133-
return make_error<StringError>("zero-fill atom in GOT section",
134-
inconvertibleErrorCode());
135-
136-
// If this is a GOT symbol with size (i.e. not the GOT start symbol)
137-
// then add it to the GOT entry info table.
138-
if (Sym->getSize() != 0) {
139-
if (auto TS = getELFGOTTarget(G, Sym->getBlock()))
140-
FileInfo.GOTEntryInfos[TS->getName()] = {
141-
Sym->getSymbolContent(), Sym->getAddress().getValue(),
142-
Sym->getTargetFlags()};
143-
else
144-
return TS.takeError();
145-
}
146-
SectionContainsContent = true;
147-
} else if (isStubsSection) {
148-
if (Sym->isSymbolZeroFill())
149-
return make_error<StringError>("zero-fill atom in Stub section",
150-
inconvertibleErrorCode());
151-
152-
if (auto TS = getELFStubTarget(G, Sym->getBlock()))
153-
FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(),
154-
Sym->getAddress().getValue(),
155-
Sym->getTargetFlags()};
156-
else
157-
return TS.takeError();
158-
SectionContainsContent = true;
159-
} else if (isAArch32StubsSection) {
160-
if (Sym->isSymbolZeroFill())
161-
return make_error<StringError>("zero-fill atom in Stub section",
162-
inconvertibleErrorCode());
163-
164-
if (auto Name = getELFAArch32StubTargetName(G, Sym->getBlock()))
165-
FileInfo.StubInfos[*Name] = {Sym->getSymbolContent(),
166-
Sym->getAddress().getValue(),
167-
Sym->getTargetFlags()};
168-
else
169-
return Name.takeError();
154+
if (SecType != Other) {
155+
if (Error Err = registerSymbol(G, *Sym, FileInfo, SecType))
156+
return Err;
170157
SectionContainsContent = true;
171158
}
172159

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

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -111,29 +111,13 @@ Error registerMachOGraphInfo(Session &S, LinkGraph &G) {
111111
FirstSym = Sym;
112112
if (Sym->getAddress() > LastSym->getAddress())
113113
LastSym = Sym;
114-
if (isGOTSection) {
115-
if (Sym->isSymbolZeroFill())
116-
return make_error<StringError>("zero-fill atom in GOT section",
117-
inconvertibleErrorCode());
118-
119-
if (auto TS = getMachOGOTTarget(G, Sym->getBlock()))
120-
FileInfo.GOTEntryInfos[TS->getName()] = {Sym->getSymbolContent(),
121-
Sym->getAddress().getValue(),
122-
Sym->getTargetFlags()};
123-
else
124-
return TS.takeError();
125-
SectionContainsContent = true;
126-
} else if (isStubsSection) {
127-
if (Sym->isSymbolZeroFill())
128-
return make_error<StringError>("zero-fill atom in Stub section",
129-
inconvertibleErrorCode());
130-
131-
if (auto TS = getMachOStubTarget(G, Sym->getBlock()))
132-
FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(),
133-
Sym->getAddress().getValue(),
134-
Sym->getTargetFlags()};
135-
else
136-
return TS.takeError();
114+
if (isGOTSection || isStubsSection) {
115+
Error Err =
116+
isGOTSection
117+
? FileInfo.registerGOTEntry(G, *Sym, getMachOGOTTarget)
118+
: FileInfo.registerStubEntry(G, *Sym, getMachOStubTarget);
119+
if (Err)
120+
return Err;
137121
SectionContainsContent = true;
138122
} else if (Sym->hasName()) {
139123
if (Sym->isSymbolZeroFill()) {

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,6 +1183,36 @@ Error Session::loadAndLinkDynamicLibrary(JITDylib &JD, StringRef LibPath) {
11831183
return Error::success();
11841184
}
11851185

1186+
Error Session::FileInfo::registerGOTEntry(
1187+
LinkGraph &G, Symbol &Sym, GetSymbolTargetFunction GetSymbolTarget) {
1188+
if (Sym.isSymbolZeroFill())
1189+
return make_error<StringError>("Unexpected zero-fill symbol in section " +
1190+
Sym.getBlock().getSection().getName(),
1191+
inconvertibleErrorCode());
1192+
auto TS = GetSymbolTarget(G, Sym.getBlock());
1193+
if (!TS)
1194+
return TS.takeError();
1195+
GOTEntryInfos[TS->getName()] = {Sym.getSymbolContent(),
1196+
Sym.getAddress().getValue(),
1197+
Sym.getTargetFlags()};
1198+
return Error::success();
1199+
}
1200+
1201+
Error Session::FileInfo::registerStubEntry(
1202+
LinkGraph &G, Symbol &Sym, GetSymbolTargetFunction GetSymbolTarget) {
1203+
if (Sym.isSymbolZeroFill())
1204+
return make_error<StringError>("Unexpected zero-fill symbol in section " +
1205+
Sym.getBlock().getSection().getName(),
1206+
inconvertibleErrorCode());
1207+
auto TS = GetSymbolTarget(G, Sym.getBlock());
1208+
if (!TS)
1209+
return TS.takeError();
1210+
StubInfos[TS->getName()] = {Sym.getSymbolContent(),
1211+
Sym.getAddress().getValue(),
1212+
Sym.getTargetFlags()};
1213+
return Error::success();
1214+
}
1215+
11861216
Expected<Session::FileInfo &> Session::findFileInfo(StringRef FileName) {
11871217
auto FileInfoItr = FileInfos.find(FileName);
11881218
if (FileInfoItr == FileInfos.end())

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ struct Session {
5151
StringMap<MemoryRegionInfo> SectionInfos;
5252
StringMap<MemoryRegionInfo> StubInfos;
5353
StringMap<MemoryRegionInfo> GOTEntryInfos;
54+
55+
using Symbol = jitlink::Symbol;
56+
using LinkGraph = jitlink::LinkGraph;
57+
using GetSymbolTargetFunction =
58+
unique_function<Expected<Symbol &>(LinkGraph &G, jitlink::Block &)>;
59+
60+
Error registerGOTEntry(LinkGraph &G, Symbol &Sym,
61+
GetSymbolTargetFunction GetSymbolTarget);
62+
Error registerStubEntry(LinkGraph &G, Symbol &Sym,
63+
GetSymbolTargetFunction GetSymbolTarget);
5464
};
5565

5666
using DynLibJDMap = std::map<std::string, orc::JITDylib *>;

0 commit comments

Comments
 (0)