Lines Matching +full:g +full:- +full:link

1 //===--------- JITLinkGeneric.cpp - Generic JIT linker utilities ----------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
28 dbgs() << "Starting link phase 1 for graph " << G->getName() << "\n"; in linkPhase1()
33 return Ctx->notifyFailed(std::move(Err)); in linkPhase1()
36 dbgs() << "Link graph \"" << G->getName() << "\" pre-pruning:\n"; in linkPhase1()
37 G->dump(dbgs()); in linkPhase1()
40 prune(*G); in linkPhase1()
43 dbgs() << "Link graph \"" << G->getName() << "\" post-pruning:\n"; in linkPhase1()
44 G->dump(dbgs()); in linkPhase1()
47 // Run post-pruning passes. in linkPhase1()
49 return Ctx->notifyFailed(std::move(Err)); in linkPhase1()
52 if (G->allocActions().empty() && llvm::all_of(G->sections(), [](Section &S) { in linkPhase1()
59 Ctx->getMemoryManager().allocate( in linkPhase1()
60 Ctx->getJITLinkDylib(), *G, in linkPhase1()
64 // S->linkPhase2(std::move(S), std::move(AR)); in linkPhase1()
66 TmpSelf->linkPhase2(std::move(S), std::move(AR)); in linkPhase1()
76 return Ctx->notifyFailed(AR.takeError()); in linkPhase2()
79 dbgs() << "Link graph \"" << G->getName() in linkPhase2()
80 << "\" before post-allocation passes:\n"; in linkPhase2()
81 G->dump(dbgs()); in linkPhase2()
84 // Run post-allocation passes. in linkPhase2()
89 LLVM_DEBUG(dbgs() << "Resolving symbols defined in " << G->getName() << "\n"); in linkPhase2()
91 if (auto Err = Ctx->notifyResolved(*G)) in linkPhase2()
99 dbgs() << "No external symbols for " << G->getName() in linkPhase2()
100 << ". Proceeding immediately with link phase 3.\n"; in linkPhase2()
111 dbgs() << "Issuing lookup for external symbols for " << G->getName() in linkPhase2()
121 // Ctx->lookup(std::move(UnresolvedExternals), in linkPhase2()
123 // Self->linkPhase3(std::move(Self), std::move(Result)); in linkPhase2()
125 Ctx->lookup(std::move(ExternalSymbols), in linkPhase2()
138 dbgs() << "Starting link phase 3 for graph " << G->getName() << "\n"; in linkPhase3()
149 dbgs() << "Link graph \"" << G->getName() in linkPhase3()
150 << "\" before pre-fixup passes:\n"; in linkPhase3()
151 G->dump(dbgs()); in linkPhase3()
158 dbgs() << "Link graph \"" << G->getName() << "\" before copy-and-fixup:\n"; in linkPhase3()
159 G->dump(dbgs()); in linkPhase3()
163 if (auto Err = fixUpBlocks(*G)) in linkPhase3()
167 dbgs() << "Link graph \"" << G->getName() << "\" after copy-and-fixup:\n"; in linkPhase3()
168 G->dump(dbgs()); in linkPhase3()
180 Alloc->finalize([S = std::move(Self)](FinalizeResult FR) mutable { in linkPhase3()
183 // S->linkPhase2(std::move(S), std::move(AR)); in linkPhase3()
185 TmpSelf->linkPhase4(std::move(S), std::move(FR)); in linkPhase3()
193 dbgs() << "Starting link phase 4 for graph " << G->getName() << "\n"; in linkPhase4()
197 return Ctx->notifyFailed(FR.takeError()); in linkPhase4()
199 Ctx->notifyFinalized(std::move(*FR)); in linkPhase4()
201 LLVM_DEBUG({ dbgs() << "Link of graph " << G->getName() << " complete\n"; }); in linkPhase4()
206 if (auto Err = P(*G)) in runPasses()
214 for (auto *Sym : G->external_symbols()) { in getExternalSymbolNames()
215 assert(!Sym->getAddress() && in getExternalSymbolNames()
217 assert(Sym->getName() != StringRef() && Sym->getName() != "" && in getExternalSymbolNames()
220 Sym->isWeaklyReferenced() ? SymbolLookupFlags::WeaklyReferencedSymbol in getExternalSymbolNames()
222 UnresolvedExternals[Sym->getName()] = LookupFlags; in getExternalSymbolNames()
228 for (auto *Sym : G->external_symbols()) { in applyLookupResult()
229 assert(Sym->getOffset() == 0 && in applyLookupResult()
231 assert(!Sym->getAddress() && "Symbol already resolved"); in applyLookupResult()
232 assert(!Sym->isDefined() && "Symbol being resolved is already defined"); in applyLookupResult()
233 auto ResultI = Result.find(Sym->getName()); in applyLookupResult()
235 Sym->getAddressable().setAddress(ResultI->second.getAddress()); in applyLookupResult()
236 Sym->setLinkage(ResultI->second.getFlags().isWeak() ? Linkage::Weak in applyLookupResult()
238 Sym->setScope(ResultI->second.getFlags().isExported() ? Scope::Default in applyLookupResult()
241 assert(Sym->isWeaklyReferenced() && in applyLookupResult()
242 "Failed to resolve non-weak reference"); in applyLookupResult()
247 for (auto *Sym : G->external_symbols()) { in applyLookupResult()
248 dbgs() << " " << Sym->getName() << ": " in applyLookupResult()
249 << formatv("{0:x16}", Sym->getAddress().getValue()); in applyLookupResult()
250 switch (Sym->getLinkage()) { in applyLookupResult()
257 switch (Sym->getScope()) { in applyLookupResult()
275 Alloc->abandon([S = std::move(Self), E1 = std::move(Err)](Error E2) mutable { in abandonAllocAndBailOut()
276 S->Ctx->notifyFailed(joinErrors(std::move(E1), std::move(E2))); in abandonAllocAndBailOut()
280 void prune(LinkGraph &G) { in prune() argument
285 for (auto *Sym : G.defined_symbols()) in prune()
286 if (Sym->isLive()) in prune()
294 auto &B = Sym->getBlock(); in prune()
302 for (auto &E : Sym->getBlock().edges()) { in prune()
315 LLVM_DEBUG(dbgs() << "Dead-stripping defined symbols:\n"); in prune()
317 for (auto *Sym : G.defined_symbols()) in prune()
318 if (!Sym->isLive()) in prune()
322 G.removeDefinedSymbol(*Sym); in prune()
328 LLVM_DEBUG(dbgs() << "Dead-stripping blocks:\n"); in prune()
330 for (auto *B : G.blocks()) in prune()
335 G.removeBlock(*B); in prune()
343 for (auto *Sym : G.external_symbols()) in prune()
344 if (!Sym->isLive()) in prune()
348 G.removeExternalSymbol(*Sym); in prune()