@@ -93,9 +93,12 @@ class COFFLinkGraphBuilder_x86_64 : public COFFLinkGraphBuilder {
9393
9494 Edge::Kind Kind = Edge::Invalid;
9595 const char *FixupPtr = BlockToFix.getContent ().data () + Offset;
96+ Symbol *ImageBase = GetImageBaseSymbol ()(getGraph ());
9697
9798 switch (Rel.getType ()) {
9899 case COFF::RelocationTypeAMD64::IMAGE_REL_AMD64_ADDR32NB: {
100+ if (!ImageBase)
101+ ImageBase = &addImageBaseSymbol ();
99102 Kind = EdgeKind_coff_x86_64::Pointer32NB;
100103 Addend = *reinterpret_cast <const support::little32_t *>(FixupPtr);
101104 break ;
@@ -192,20 +195,15 @@ class COFFLinkGraphBuilder_x86_64 : public COFFLinkGraphBuilder {
192195
193196class COFFLinkGraphLowering_x86_64 {
194197public:
195- COFFLinkGraphLowering_x86_64 (std::shared_ptr<orc::SymbolStringPool> SSP)
196- : SSP(std::move(SSP)) {
197- ImageBaseName = this ->SSP ->intern (" __ImageBase" );
198- }
199198 // Lowers COFF x86_64 specific edges to generic x86_64 edges.
200- Error lowerCOFFRelocationEdges ( LinkGraph &G, JITLinkContext &Ctx ) {
199+ Error operator ()( LinkGraph &G) {
201200 for (auto *B : G.blocks ()) {
202201 for (auto &E : B->edges ()) {
203202 switch (E.getKind ()) {
204203 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 ());
209207 E.setKind (x86_64::Pointer32);
210208 break ;
211209 }
@@ -237,61 +235,18 @@ class COFFLinkGraphLowering_x86_64 {
237235 }
238236
239237private:
240- const orc::SymbolStringPtr &getImageBaseSymbolName () const {
241- return this ->ImageBaseName ;
242- }
243-
244238 orc::ExecutorAddr getSectionStart (Section &Sec) {
245239 if (!SectionStartCache.count (&Sec)) {
246240 SectionRange Range (Sec);
247241 SectionStartCache[&Sec] = Range.getStart ();
242+ return Range.getStart ();
248243 }
249244 return SectionStartCache[&Sec];
250245 }
251246
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;
281248 DenseMap<Section *, orc::ExecutorAddr> SectionStartCache;
282- orc::ExecutorAddr ImageBase;
283- std::shared_ptr<orc::SymbolStringPool> SSP;
284- orc::SymbolStringPtr ImageBaseName = nullptr ;
285249};
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- }
295250} // namespace
296251
297252namespace llvm {
@@ -349,9 +304,7 @@ void link_COFF_x86_64(std::unique_ptr<LinkGraph> G,
349304 Config.PrePrunePasses .push_back (markAllSymbolsLive);
350305
351306 // 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 ());
355308 }
356309
357310 if (auto Err = Ctx->modifyPassConfig (*G, Config))
0 commit comments