@@ -93,9 +93,12 @@ class COFFLinkGraphBuilder_x86_64 : public COFFLinkGraphBuilder {
93
93
94
94
Edge::Kind Kind = Edge::Invalid;
95
95
const char *FixupPtr = BlockToFix.getContent ().data () + Offset;
96
+ Symbol *ImageBase = GetImageBaseSymbol ()(getGraph ());
96
97
97
98
switch (Rel.getType ()) {
98
99
case COFF::RelocationTypeAMD64::IMAGE_REL_AMD64_ADDR32NB: {
100
+ if (!ImageBase)
101
+ ImageBase = &addImageBaseSymbol ();
99
102
Kind = EdgeKind_coff_x86_64::Pointer32NB;
100
103
Addend = *reinterpret_cast <const support::little32_t *>(FixupPtr);
101
104
break ;
@@ -192,20 +195,15 @@ class COFFLinkGraphBuilder_x86_64 : public COFFLinkGraphBuilder {
192
195
193
196
class COFFLinkGraphLowering_x86_64 {
194
197
public:
195
- COFFLinkGraphLowering_x86_64 (std::shared_ptr<orc::SymbolStringPool> SSP)
196
- : SSP(std::move(SSP)) {
197
- ImageBaseName = this ->SSP ->intern (" __ImageBase" );
198
- }
199
198
// Lowers COFF x86_64 specific edges to generic x86_64 edges.
200
- Error lowerCOFFRelocationEdges ( LinkGraph &G, JITLinkContext &Ctx ) {
199
+ Error operator ()( LinkGraph &G) {
201
200
for (auto *B : G.blocks ()) {
202
201
for (auto &E : B->edges ()) {
203
202
switch (E.getKind ()) {
204
203
case EdgeKind_coff_x86_64::Pointer32NB: {
205
- auto ImageBase = getImageBaseAddress (G, Ctx);
206
- if (!ImageBase)
207
- return ImageBase.takeError ();
208
- E.setAddend (E.getAddend () - ImageBase->getValue ());
204
+ auto ImageBase = GetImageBase (G);
205
+ assert (ImageBase && " __ImageBase symbol must be defined" );
206
+ E.setAddend (E.getAddend () - ImageBase->getAddress ().getValue ());
209
207
E.setKind (x86_64::Pointer32);
210
208
break ;
211
209
}
@@ -237,61 +235,18 @@ class COFFLinkGraphLowering_x86_64 {
237
235
}
238
236
239
237
private:
240
- const orc::SymbolStringPtr &getImageBaseSymbolName () const {
241
- return this ->ImageBaseName ;
242
- }
243
-
244
238
orc::ExecutorAddr getSectionStart (Section &Sec) {
245
239
if (!SectionStartCache.count (&Sec)) {
246
240
SectionRange Range (Sec);
247
241
SectionStartCache[&Sec] = Range.getStart ();
242
+ return Range.getStart ();
248
243
}
249
244
return SectionStartCache[&Sec];
250
245
}
251
246
252
- Expected<orc::ExecutorAddr> getImageBaseAddress (LinkGraph &G,
253
- JITLinkContext &Ctx) {
254
- if (this ->ImageBase )
255
- return this ->ImageBase ;
256
- for (auto *S : G.defined_symbols ())
257
- if (S->getName () == getImageBaseSymbolName ()) {
258
- this ->ImageBase = S->getAddress ();
259
- return this ->ImageBase ;
260
- }
261
-
262
- JITLinkContext::LookupMap Symbols;
263
- Symbols[getImageBaseSymbolName ()] = SymbolLookupFlags::RequiredSymbol;
264
- orc::ExecutorAddr ImageBase;
265
- Error Err = Error::success ();
266
- Ctx.lookup (Symbols,
267
- createLookupContinuation ([&](Expected<AsyncLookupResult> LR) {
268
- ErrorAsOutParameter _ (Err);
269
- if (!LR) {
270
- Err = LR.takeError ();
271
- return ;
272
- }
273
- ImageBase = LR->begin ()->second .getAddress ();
274
- }));
275
- if (Err)
276
- return std::move (Err);
277
- this ->ImageBase = ImageBase;
278
- return ImageBase;
279
- }
280
-
247
+ GetImageBaseSymbol GetImageBase;
281
248
DenseMap<Section *, orc::ExecutorAddr> SectionStartCache;
282
- orc::ExecutorAddr ImageBase;
283
- std::shared_ptr<orc::SymbolStringPool> SSP;
284
- orc::SymbolStringPtr ImageBaseName = nullptr ;
285
249
};
286
-
287
- Error lowerEdges_COFF_x86_64 (LinkGraph &G, JITLinkContext *Ctx) {
288
- LLVM_DEBUG (dbgs () << " Lowering COFF x86_64 edges:\n " );
289
- COFFLinkGraphLowering_x86_64 GraphLowering (G.getSymbolStringPool ());
290
- if (auto Err = GraphLowering.lowerCOFFRelocationEdges (G, *Ctx))
291
- return Err;
292
-
293
- return Error::success ();
294
- }
295
250
} // namespace
296
251
297
252
namespace llvm {
@@ -349,9 +304,7 @@ void link_COFF_x86_64(std::unique_ptr<LinkGraph> G,
349
304
Config.PrePrunePasses .push_back (markAllSymbolsLive);
350
305
351
306
// Add COFF edge lowering passes.
352
- JITLinkContext *CtxPtr = Ctx.get ();
353
- Config.PreFixupPasses .push_back (
354
- [CtxPtr](LinkGraph &G) { return lowerEdges_COFF_x86_64 (G, CtxPtr); });
307
+ Config.PreFixupPasses .push_back (COFFLinkGraphLowering_x86_64 ());
355
308
}
356
309
357
310
if (auto Err = Ctx->modifyPassConfig (*G, Config))
0 commit comments