Lines Matching +full:sd +full:- +full:hs

1 //===------ MachOPlatform.cpp - Utilities for executing MachO in Orc ------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
119 // Creates a Bootstrap-Complete LinkGraph to run deferred actions.
154 G->createSection("__orc_rt_cplt_bs", MemProt::Read);
156 G->createZeroFillBlock(PlaceholderSection, 1, ExecutorAddr(), 1, 0);
157 G->addDefinedSymbol(PlaceholderBlock, 0, *CompleteBootstrapSymbol, 1,
161 G->allocActions().reserve(DeferredAAs.size() + 3);
164 G->allocActions().push_back(
170 G->allocActions().push_back(
178 G->allocActions().push_back(
186 std::back_inserter(G->allocActions()));
316 // Add JIT-dispatch function support symbols.
370 assert(HeaderAddrToJITDylib.count(I->second) &&
372 HeaderAddrToJITDylib.erase(I->second);
487 // Bootstrap process -- here be phase-ordering dragons.
492 // register (e.g. the frame-info registration functions have frame-info).
506 // "complete-bootstrap" graph that causes them to be run.
519 // addresses in a post-allocation pass injected by the platform runtime
525 // deferred-actions vector: the lookup for the runtime registration
538 // the corresponding jit-dispatch tag variables in the ORC runtime to make
543 this->BuildMachOHeaderMU(*this, std::move(PlatformJDOpts)))))
569 // Step (4) Add complete-bootstrap materialization unit and request.
628 DepJD->withLinkOrderDo([&](const JITDylibSearchOrder &O) {
640 NewInitSymbols[DepJD] = std::move(RISItr->second);
653 // through setupJITDylib) -- bare JITDylibs aren't managed by the platform.
661 HeaderAddrs[KV.first] = I->second;
673 auto H = HI->second;
678 DepInfo.DepHeaders.push_back(HJ->second);
686 // Otherwise issue a lookup and re-run this phase when it completes.
704 JD = I->second;
710 dbgs() << "pushing initializers for " << JD->getName() << "\n";
735 JD = I->second;
740 dbgs() << "\"" << JD->getName() << "\", [ ";
802 // --- Handle Initializers ---
806 // register it and then bail out -- the header materialization unit
838 // all symbols to the c-strings section, and build a symbol table registration
870 Result[MR.getInitializerSymbol()] = std::move(I->second);
880 std::lock_guard<std::mutex> Lock(MP.Bootstrap.load()->Mutex);
881 ++MP.Bootstrap.load()->ActiveGraphs;
889 {*MP.MachOHeaderStartSymbol, &MP.Bootstrap.load()->MachOHeaderAddr},
910 if (Sym->hasName() && Sym->getName() == RTSym.first) {
917 if (Sym->getName() == *MP.MachOHeaderStartSymbol)
920 *RTSym.second = Sym->getAddress();
930 MP.Bootstrap.load()->MachOHeaderAddr;
931 MP.HeaderAddrToJITDylib[MP.Bootstrap.load()->MachOHeaderAddr] =
940 std::lock_guard<std::mutex> Lock(MP.Bootstrap.load()->Mutex);
942 --MP.Bootstrap.load()->ActiveGraphs;
943 // Notify Bootstrap->CV while holding the mutex because the mutex is
944 // also keeping Bootstrap->CV alive.
945 if (MP.Bootstrap.load()->ActiveGraphs == 0)
946 MP.Bootstrap.load()->CV.notify_all();
953 return Sym->getName() == *MP.MachOHeaderStartSymbol;
959 auto HeaderAddr = (*I)->getAddress();
977 // in all subsequent graphs. In this pass we preserve unconditionally -- we'll
981 if (ObjCImageInfoSec->blocks_size() != 1)
986 G.addAnonymousSymbol(**ObjCImageInfoSec->blocks().begin(), 0, 0, false,
989 for (auto *B : ObjCImageInfoSec->blocks())
990 if (!B->edges_empty())
1002 // Skip ObjCImageInfo -- this shouldn't have any dependencies, and we may
1007 // Skip non-init sections.
1015 for (auto &Sym : InitSection->symbols()) {
1016 auto &B = Sym->getBlock();
1017 if (Sym->isLive() && Sym->getOffset() == 0 &&
1018 Sym->getSize() == B.getSize() && !AlreadyLiveBlocks.count(&B)) {
1024 // Add anonymous symbols to preserve any not-already-preserved blocks.
1025 for (auto *B : InitSection->blocks())
1028 &G.addAnonymousSymbol(*B, 0, B->getSize(), false, true));
1052 auto ObjCImageInfoBlocks = ObjCImageInfo->blocks();
1068 // FIXME: We could optimize this check if Symbols had a ref-count.
1072 for (auto &E : B->edges())
1094 if (ObjCImageInfoItr->second.Version != Version)
1099 if (ObjCImageInfoItr->second.Flags != Flags)
1100 if (Error E = mergeImageInfoFlags(G, MR, ObjCImageInfoItr->second, Flags))
1104 for (auto *S : ObjCImageInfo->symbols())
1114 // move on. The section should already be marked no-dead-strip.
1185 << " -> " << formatv("{0:x4}", New.rawFlags()) << "\n";
1197 if (Sym->getName() == "__tlv_bootstrap") {
1198 Sym->setName("___orc_rt_macho_tlv_get_addr");
1209 Key = I->second;
1222 for (auto *B : ThreadDataSec->blocks()) {
1223 if (B->getSize() != 3 * G.getPointerSize())
1225 formatv("{0:x}", B->getAddress()) +
1229 auto NewBlockContent = G.allocateBuffer(B->getSize());
1230 llvm::copy(B->getContent(), NewBlockContent.data());
1233 B->setContent(NewBlockContent);
1239 for (auto &E : B->edges())
1261 SecRange = (*Sec.blocks().begin())->getRange();
1263 auto R = B->getRange();
1266 for (auto &E : B->edges()) {
1284 // If we didn't find any pointed-to code-blocks then there's no need to
1292 return LHS->getAddress() < RHS->getAddress();
1295 if (US.CodeRanges.empty() || US.CodeRanges.back().End != B->getAddress())
1296 US.CodeRanges.push_back(B->getRange());
1298 US.CodeRanges.back().End = B->getRange().End;
1308 dbgs() << " Compact-unwind: ";
1385 UnwindInfo = std::make_tuple(std::move(UI->CodeRanges), UI->DwarfSection,
1386 UI->CompactUnwindSection);
1404 : MP.Bootstrap.load()->DeferredAAs;
1412 assert(I->second && "Null header registered for JD");
1413 HeaderAddr = I->second;
1485 auto &SecBlock = **ObjCRuntimeObjectSec->blocks().begin();
1493 auto AddSection = [&](SecDesc &SD, jitlink::Section &GraphSec) {
1496 memset(&SD.Sec, 0, sizeof(MachO::section_64));
1497 memcpy(SD.Sec.sectname, FQName.drop_front(7).data(), FQName.size() - 7);
1498 memcpy(SD.Sec.segname, FQName.data(), 6);
1499 SD.Sec.addr = SR.getStart() - SecBlock.getAddress();
1500 SD.Sec.size = SR.getSize();
1501 SD.Sec.flags = MachO::S_REGULAR;
1507 auto &SD = DataSections.back();
1508 memset(&SD.Sec, 0, sizeof(SD.Sec));
1509 memcpy(SD.Sec.sectname, "__objc_imageinfo", 16);
1510 strcpy(SD.Sec.segname, "__DATA");
1511 SD.Sec.size = 8;
1512 SD.AddFixups = [&](size_t RecordOffset) {
1518 if (Sym->getName() == ObjCImageInfoSymbolName) {
1524 if (Sym->getName() == ObjCImageInfoSymbolName) {
1530 if (Sym->hasName() && Sym->getName() == ObjCImageInfoSymbolName) {
1537 It->second.Finalized = true;
1538 Flags = It->second.Flags;
1545 auto Content = Sym->getBlock().getMutableContent(G);
1557 RecordOffset + ((char *)&SD.Sec.addr - (char *)&SD.Sec),
1558 *ObjCImageInfoSym, -SecBlock.getAddress().getValue());
1576 assert(ObjCRuntimeObjectSec->blocks_size() == 1 &&
1579 // Build the header struct up-front. This also gives us a chance to check
1622 for (auto &SD : Secs) {
1623 if (SD.AddFixups)
1624 SD.AddFixups(P - SecContent.data());
1625 WriteMachOStruct(SD.Sec);
1647 // Make a map of existing strings so that we can re-use them:
1649 for (auto *Sym : CStringSec->symbols()) {
1653 auto Content = Sym->getBlock().getContent();
1668 if (!Sym->hasName())
1671 auto I = ExistingStrings.find(Sym->getName());
1674 *CStringSec, G.allocateCString(Sym->getName()), orc::ExecutorAddr(),
1680 JITSymTabInfo.push_back({Sym, I->second});
1696 assert(I->second && "Null header registered for JD");
1697 HeaderAddr = I->second;
1702 : MP.Bootstrap.load()->SymTab;
1704 SymTab.push_back({NameSym->getAddress(), OriginalSymbol->getAddress(),
1707 // Bail out if we're in the bootstrap phase -- registration of thees symbols
1714 : MP.Bootstrap.load()->DeferredAAs;
1739 Opts.IDDylib->Name, Opts.IDDylib->Timestamp,
1740 Opts.IDDylib->CurrentVersion, Opts.IDDylib->CompatibilityVersion);
1770 addMachOHeader(R->getTargetJITDylib(), *G, R->getInitializerSymbol());
1783 // Init symbol is header-start symbol.
1787 for (auto &HS : AdditionalHeaderSymbols)
1788 G.addDefinedSymbol(HeaderBlock, HS.Offset, HS.Name, HeaderBlock.getSize(),
1810 for (auto &HS : AdditionalHeaderSymbols)
1811 HeaderSymbolFlags[MOP.getExecutionSession().intern(HS.Name)] =