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