11db9f3b2SDimitry Andric //===- DWARFLinkerImpl.h ----------------------------------------*- C++ -*-===// 21db9f3b2SDimitry Andric // 31db9f3b2SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41db9f3b2SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 51db9f3b2SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61db9f3b2SDimitry Andric // 71db9f3b2SDimitry Andric //===----------------------------------------------------------------------===// 81db9f3b2SDimitry Andric 91db9f3b2SDimitry Andric #ifndef LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERIMPL_H 101db9f3b2SDimitry Andric #define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERIMPL_H 111db9f3b2SDimitry Andric 121db9f3b2SDimitry Andric #include "DWARFEmitterImpl.h" 131db9f3b2SDimitry Andric #include "DWARFLinkerCompileUnit.h" 141db9f3b2SDimitry Andric #include "DWARFLinkerTypeUnit.h" 151db9f3b2SDimitry Andric #include "StringEntryToDwarfStringPoolEntryMap.h" 161db9f3b2SDimitry Andric #include "llvm/ADT/AddressRanges.h" 171db9f3b2SDimitry Andric #include "llvm/CodeGen/AccelTable.h" 181db9f3b2SDimitry Andric #include "llvm/DWARFLinker/Parallel/DWARFLinker.h" 191db9f3b2SDimitry Andric #include "llvm/DWARFLinker/StringPool.h" 201db9f3b2SDimitry Andric 211db9f3b2SDimitry Andric namespace llvm { 221db9f3b2SDimitry Andric namespace dwarf_linker { 231db9f3b2SDimitry Andric namespace parallel { 241db9f3b2SDimitry Andric 251db9f3b2SDimitry Andric /// This class links debug info. 261db9f3b2SDimitry Andric class DWARFLinkerImpl : public DWARFLinker { 271db9f3b2SDimitry Andric public: 281db9f3b2SDimitry Andric DWARFLinkerImpl(MessageHandlerTy ErrorHandler, 29*0fca6ea1SDimitry Andric MessageHandlerTy WarningHandler); 301db9f3b2SDimitry Andric 311db9f3b2SDimitry Andric /// Add object file to be linked. Pre-load compile unit die. Call 321db9f3b2SDimitry Andric /// \p OnCUDieLoaded for each compile unit die. If specified \p File 331db9f3b2SDimitry Andric /// has reference to the Clang module then such module would be 341db9f3b2SDimitry Andric /// pre-loaded by \p Loader for !Update case. 351db9f3b2SDimitry Andric /// 361db9f3b2SDimitry Andric /// \pre NoODR, Update options should be set before call to addObjectFile. 371db9f3b2SDimitry Andric void addObjectFile( 381db9f3b2SDimitry Andric DWARFFile &File, ObjFileLoaderTy Loader = nullptr, 391db9f3b2SDimitry Andric 401db9f3b2SDimitry Andric CompileUnitHandlerTy OnCUDieLoaded = [](const DWARFUnit &) {}) override; 411db9f3b2SDimitry Andric 421db9f3b2SDimitry Andric /// Link debug info for added files. 431db9f3b2SDimitry Andric Error link() override; 441db9f3b2SDimitry Andric 457a6dacacSDimitry Andric /// Set output DWARF handler. May be not set if output generation is not 467a6dacacSDimitry Andric /// necessary. 477a6dacacSDimitry Andric void setOutputDWARFHandler(const Triple &TargetTriple, 487a6dacacSDimitry Andric SectionHandlerTy SectionHandler) override { 497a6dacacSDimitry Andric GlobalData.setTargetTriple(TargetTriple); 507a6dacacSDimitry Andric this->SectionHandler = SectionHandler; 517a6dacacSDimitry Andric } 527a6dacacSDimitry Andric 531db9f3b2SDimitry Andric /// \defgroup Methods setting various linking options: 541db9f3b2SDimitry Andric /// 551db9f3b2SDimitry Andric /// @{ 561db9f3b2SDimitry Andric /// 571db9f3b2SDimitry Andric 581db9f3b2SDimitry Andric /// Allows to generate log of linking process to the standard output. 591db9f3b2SDimitry Andric void setVerbosity(bool Verbose) override { 601db9f3b2SDimitry Andric GlobalData.Options.Verbose = Verbose; 611db9f3b2SDimitry Andric } 621db9f3b2SDimitry Andric 631db9f3b2SDimitry Andric /// Print statistics to standard output. 641db9f3b2SDimitry Andric void setStatistics(bool Statistics) override { 651db9f3b2SDimitry Andric GlobalData.Options.Statistics = Statistics; 661db9f3b2SDimitry Andric } 671db9f3b2SDimitry Andric 681db9f3b2SDimitry Andric /// Verify the input DWARF. 691db9f3b2SDimitry Andric void setVerifyInputDWARF(bool Verify) override { 701db9f3b2SDimitry Andric GlobalData.Options.VerifyInputDWARF = Verify; 711db9f3b2SDimitry Andric } 721db9f3b2SDimitry Andric 731db9f3b2SDimitry Andric /// Do not unique types according to ODR. 741db9f3b2SDimitry Andric void setNoODR(bool NoODR) override { GlobalData.Options.NoODR = NoODR; } 751db9f3b2SDimitry Andric 761db9f3b2SDimitry Andric /// Update index tables only(do not modify rest of DWARF). 771db9f3b2SDimitry Andric void setUpdateIndexTablesOnly(bool UpdateIndexTablesOnly) override { 781db9f3b2SDimitry Andric GlobalData.Options.UpdateIndexTablesOnly = UpdateIndexTablesOnly; 791db9f3b2SDimitry Andric } 801db9f3b2SDimitry Andric 811db9f3b2SDimitry Andric /// Allow generating valid, but non-deterministic output. 821db9f3b2SDimitry Andric void 831db9f3b2SDimitry Andric setAllowNonDeterministicOutput(bool AllowNonDeterministicOutput) override { 841db9f3b2SDimitry Andric GlobalData.Options.AllowNonDeterministicOutput = 851db9f3b2SDimitry Andric AllowNonDeterministicOutput; 861db9f3b2SDimitry Andric } 871db9f3b2SDimitry Andric 881db9f3b2SDimitry Andric /// Set to keep the enclosing function for a static variable. 891db9f3b2SDimitry Andric void setKeepFunctionForStatic(bool KeepFunctionForStatic) override { 901db9f3b2SDimitry Andric GlobalData.Options.KeepFunctionForStatic = KeepFunctionForStatic; 911db9f3b2SDimitry Andric } 921db9f3b2SDimitry Andric 931db9f3b2SDimitry Andric /// Use specified number of threads for parallel files linking. 941db9f3b2SDimitry Andric void setNumThreads(unsigned NumThreads) override { 951db9f3b2SDimitry Andric GlobalData.Options.Threads = NumThreads; 961db9f3b2SDimitry Andric } 971db9f3b2SDimitry Andric 981db9f3b2SDimitry Andric /// Add kind of accelerator tables to be generated. 991db9f3b2SDimitry Andric void addAccelTableKind(AccelTableKind Kind) override { 1001db9f3b2SDimitry Andric assert(!llvm::is_contained(GlobalData.getOptions().AccelTables, Kind)); 1011db9f3b2SDimitry Andric GlobalData.Options.AccelTables.emplace_back(Kind); 1021db9f3b2SDimitry Andric } 1031db9f3b2SDimitry Andric 1041db9f3b2SDimitry Andric /// Set prepend path for clang modules. 1051db9f3b2SDimitry Andric void setPrependPath(StringRef Ppath) override { 1061db9f3b2SDimitry Andric GlobalData.Options.PrependPath = Ppath; 1071db9f3b2SDimitry Andric } 1081db9f3b2SDimitry Andric 1091db9f3b2SDimitry Andric /// Set estimated objects files amount, for preliminary data allocation. 1101db9f3b2SDimitry Andric void setEstimatedObjfilesAmount(unsigned ObjFilesNum) override; 1111db9f3b2SDimitry Andric 1121db9f3b2SDimitry Andric /// Set verification handler which would be used to report verification 1131db9f3b2SDimitry Andric /// errors. 1141db9f3b2SDimitry Andric void 1151db9f3b2SDimitry Andric setInputVerificationHandler(InputVerificationHandlerTy Handler) override { 1161db9f3b2SDimitry Andric GlobalData.Options.InputVerificationHandler = Handler; 1171db9f3b2SDimitry Andric } 1181db9f3b2SDimitry Andric 1191db9f3b2SDimitry Andric /// Set map for Swift interfaces. 1201db9f3b2SDimitry Andric void setSwiftInterfacesMap(SwiftInterfacesMapTy *Map) override { 1211db9f3b2SDimitry Andric GlobalData.Options.ParseableSwiftInterfaces = Map; 1221db9f3b2SDimitry Andric } 1231db9f3b2SDimitry Andric 1241db9f3b2SDimitry Andric /// Set prefix map for objects. 1251db9f3b2SDimitry Andric void setObjectPrefixMap(ObjectPrefixMapTy *Map) override { 1261db9f3b2SDimitry Andric GlobalData.Options.ObjectPrefixMap = Map; 1271db9f3b2SDimitry Andric } 1281db9f3b2SDimitry Andric 1291db9f3b2SDimitry Andric /// Set target DWARF version. 1301db9f3b2SDimitry Andric Error setTargetDWARFVersion(uint16_t TargetDWARFVersion) override { 1311db9f3b2SDimitry Andric if ((TargetDWARFVersion < 1) || (TargetDWARFVersion > 5)) 1321db9f3b2SDimitry Andric return createStringError(std::errc::invalid_argument, 1331db9f3b2SDimitry Andric "unsupported DWARF version: %d", 1341db9f3b2SDimitry Andric TargetDWARFVersion); 1351db9f3b2SDimitry Andric 1361db9f3b2SDimitry Andric GlobalData.Options.TargetDWARFVersion = TargetDWARFVersion; 1371db9f3b2SDimitry Andric return Error::success(); 1381db9f3b2SDimitry Andric } 1391db9f3b2SDimitry Andric /// @} 1401db9f3b2SDimitry Andric 1411db9f3b2SDimitry Andric protected: 1421db9f3b2SDimitry Andric /// Verify input DWARF file. 1431db9f3b2SDimitry Andric void verifyInput(const DWARFFile &File); 1441db9f3b2SDimitry Andric 1451db9f3b2SDimitry Andric /// Validate specified options. 1461db9f3b2SDimitry Andric Error validateAndUpdateOptions(); 1471db9f3b2SDimitry Andric 1481db9f3b2SDimitry Andric /// Take already linked compile units and glue them into single file. 1491db9f3b2SDimitry Andric void glueCompileUnitsAndWriteToTheOutput(); 1501db9f3b2SDimitry Andric 1511db9f3b2SDimitry Andric /// Hold the input and output of the debug info size in bytes. 1521db9f3b2SDimitry Andric struct DebugInfoSize { 1531db9f3b2SDimitry Andric uint64_t Input; 1541db9f3b2SDimitry Andric uint64_t Output; 1551db9f3b2SDimitry Andric }; 1561db9f3b2SDimitry Andric 1571db9f3b2SDimitry Andric friend class DependencyTracker; 1581db9f3b2SDimitry Andric /// Keeps track of data associated with one object during linking. 1591db9f3b2SDimitry Andric /// i.e. source file descriptor, compilation units, output data 1601db9f3b2SDimitry Andric /// for compilation units common tables. 1611db9f3b2SDimitry Andric struct LinkContext : public OutputSections { 1621db9f3b2SDimitry Andric using UnitListTy = SmallVector<std::unique_ptr<CompileUnit>>; 1631db9f3b2SDimitry Andric 1641db9f3b2SDimitry Andric /// Keep information for referenced clang module: already loaded DWARF info 1651db9f3b2SDimitry Andric /// of the clang module and a CompileUnit of the module. 1661db9f3b2SDimitry Andric struct RefModuleUnit { 1671db9f3b2SDimitry Andric RefModuleUnit(DWARFFile &File, std::unique_ptr<CompileUnit> Unit); 1681db9f3b2SDimitry Andric RefModuleUnit(RefModuleUnit &&Other); 1691db9f3b2SDimitry Andric RefModuleUnit(const RefModuleUnit &) = delete; 1701db9f3b2SDimitry Andric 1711db9f3b2SDimitry Andric DWARFFile &File; 1721db9f3b2SDimitry Andric std::unique_ptr<CompileUnit> Unit; 1731db9f3b2SDimitry Andric }; 1741db9f3b2SDimitry Andric using ModuleUnitListTy = SmallVector<RefModuleUnit>; 1751db9f3b2SDimitry Andric 1761db9f3b2SDimitry Andric /// Object file descriptor. 1771db9f3b2SDimitry Andric DWARFFile &InputDWARFFile; 1781db9f3b2SDimitry Andric 1791db9f3b2SDimitry Andric /// Set of Compilation Units(may be accessed asynchroniously for reading). 1801db9f3b2SDimitry Andric UnitListTy CompileUnits; 1811db9f3b2SDimitry Andric 1821db9f3b2SDimitry Andric /// Set of Compile Units for modules. 1831db9f3b2SDimitry Andric ModuleUnitListTy ModulesCompileUnits; 1841db9f3b2SDimitry Andric 1851db9f3b2SDimitry Andric /// Size of Debug info before optimizing. 1861db9f3b2SDimitry Andric uint64_t OriginalDebugInfoSize = 0; 1871db9f3b2SDimitry Andric 1881db9f3b2SDimitry Andric /// Flag indicating that all inter-connected units are loaded 1891db9f3b2SDimitry Andric /// and the dwarf linking process for these units is started. 1901db9f3b2SDimitry Andric bool InterCUProcessingStarted = false; 1911db9f3b2SDimitry Andric 1921db9f3b2SDimitry Andric StringMap<uint64_t> &ClangModules; 1931db9f3b2SDimitry Andric 1941db9f3b2SDimitry Andric /// Flag indicating that new inter-connected compilation units were 1951db9f3b2SDimitry Andric /// discovered. It is used for restarting units processing 1961db9f3b2SDimitry Andric /// if new inter-connected units were found. 1971db9f3b2SDimitry Andric std::atomic<bool> HasNewInterconnectedCUs = {false}; 1981db9f3b2SDimitry Andric 1991db9f3b2SDimitry Andric std::atomic<bool> HasNewGlobalDependency = {false}; 2001db9f3b2SDimitry Andric 2011db9f3b2SDimitry Andric /// Counter for compile units ID. 2021db9f3b2SDimitry Andric std::atomic<size_t> &UniqueUnitID; 2031db9f3b2SDimitry Andric 2041db9f3b2SDimitry Andric LinkContext(LinkingGlobalData &GlobalData, DWARFFile &File, 2051db9f3b2SDimitry Andric StringMap<uint64_t> &ClangModules, 2067a6dacacSDimitry Andric std::atomic<size_t> &UniqueUnitID); 2071db9f3b2SDimitry Andric 2081db9f3b2SDimitry Andric /// Check whether specified \p CUDie is a Clang module reference. 2091db9f3b2SDimitry Andric /// if \p Quiet is false then display error messages. 2101db9f3b2SDimitry Andric /// \return first == true if CUDie is a Clang module reference. 2111db9f3b2SDimitry Andric /// second == true if module is already loaded. 2121db9f3b2SDimitry Andric std::pair<bool, bool> isClangModuleRef(const DWARFDie &CUDie, 2131db9f3b2SDimitry Andric std::string &PCMFile, 2141db9f3b2SDimitry Andric unsigned Indent, bool Quiet); 2151db9f3b2SDimitry Andric 2161db9f3b2SDimitry Andric /// If this compile unit is really a skeleton CU that points to a 2171db9f3b2SDimitry Andric /// clang module, register it in ClangModules and return true. 2181db9f3b2SDimitry Andric /// 2191db9f3b2SDimitry Andric /// A skeleton CU is a CU without children, a DW_AT_gnu_dwo_name 2201db9f3b2SDimitry Andric /// pointing to the module, and a DW_AT_gnu_dwo_id with the module 2211db9f3b2SDimitry Andric /// hash. 2221db9f3b2SDimitry Andric bool registerModuleReference(const DWARFDie &CUDie, ObjFileLoaderTy Loader, 2231db9f3b2SDimitry Andric CompileUnitHandlerTy OnCUDieLoaded, 2241db9f3b2SDimitry Andric unsigned Indent = 0); 2251db9f3b2SDimitry Andric 2261db9f3b2SDimitry Andric /// Recursively add the debug info in this clang module .pcm 2271db9f3b2SDimitry Andric /// file (and all the modules imported by it in a bottom-up fashion) 2281db9f3b2SDimitry Andric /// to ModuleUnits. 2291db9f3b2SDimitry Andric Error loadClangModule(ObjFileLoaderTy Loader, const DWARFDie &CUDie, 2301db9f3b2SDimitry Andric const std::string &PCMFile, 2311db9f3b2SDimitry Andric CompileUnitHandlerTy OnCUDieLoaded, 2321db9f3b2SDimitry Andric unsigned Indent = 0); 2331db9f3b2SDimitry Andric 2341db9f3b2SDimitry Andric /// Add Compile Unit corresponding to the module. 2351db9f3b2SDimitry Andric void addModulesCompileUnit(RefModuleUnit &&Unit); 2361db9f3b2SDimitry Andric 2371db9f3b2SDimitry Andric /// Computes the total size of the debug info. 2381db9f3b2SDimitry Andric uint64_t getInputDebugInfoSize() const { 2391db9f3b2SDimitry Andric uint64_t Size = 0; 2401db9f3b2SDimitry Andric 2411db9f3b2SDimitry Andric if (InputDWARFFile.Dwarf == nullptr) 2421db9f3b2SDimitry Andric return Size; 2431db9f3b2SDimitry Andric 2441db9f3b2SDimitry Andric for (auto &Unit : InputDWARFFile.Dwarf->compile_units()) 2451db9f3b2SDimitry Andric Size += Unit->getLength(); 2461db9f3b2SDimitry Andric 2471db9f3b2SDimitry Andric return Size; 2481db9f3b2SDimitry Andric } 2491db9f3b2SDimitry Andric 2501db9f3b2SDimitry Andric /// Link compile units for this context. 2511db9f3b2SDimitry Andric Error link(TypeUnit *ArtificialTypeUnit); 2521db9f3b2SDimitry Andric 2531db9f3b2SDimitry Andric /// Link specified compile unit until specified stage. 2541db9f3b2SDimitry Andric void linkSingleCompileUnit( 2551db9f3b2SDimitry Andric CompileUnit &CU, TypeUnit *ArtificialTypeUnit, 2561db9f3b2SDimitry Andric enum CompileUnit::Stage DoUntilStage = CompileUnit::Stage::Cleaned); 2571db9f3b2SDimitry Andric 2581db9f3b2SDimitry Andric /// Emit invariant sections. 2591db9f3b2SDimitry Andric Error emitInvariantSections(); 2601db9f3b2SDimitry Andric 2611db9f3b2SDimitry Andric /// Clone and emit .debug_frame. 2621db9f3b2SDimitry Andric Error cloneAndEmitDebugFrame(); 2631db9f3b2SDimitry Andric 2641db9f3b2SDimitry Andric /// Emit FDE record. 2651db9f3b2SDimitry Andric void emitFDE(uint32_t CIEOffset, uint32_t AddrSize, uint64_t Address, 2661db9f3b2SDimitry Andric StringRef FDEBytes, SectionDescriptor &Section); 2671db9f3b2SDimitry Andric 2681db9f3b2SDimitry Andric std::function<CompileUnit *(uint64_t)> getUnitForOffset = 2691db9f3b2SDimitry Andric [&](uint64_t Offset) -> CompileUnit * { 2701db9f3b2SDimitry Andric auto CU = llvm::upper_bound( 2711db9f3b2SDimitry Andric CompileUnits, Offset, 2721db9f3b2SDimitry Andric [](uint64_t LHS, const std::unique_ptr<CompileUnit> &RHS) { 2731db9f3b2SDimitry Andric return LHS < RHS->getOrigUnit().getNextUnitOffset(); 2741db9f3b2SDimitry Andric }); 2751db9f3b2SDimitry Andric 2761db9f3b2SDimitry Andric return CU != CompileUnits.end() ? CU->get() : nullptr; 2771db9f3b2SDimitry Andric }; 2781db9f3b2SDimitry Andric }; 2791db9f3b2SDimitry Andric 2801db9f3b2SDimitry Andric /// Enumerate all compile units and assign offsets to their sections and 2811db9f3b2SDimitry Andric /// strings. 2821db9f3b2SDimitry Andric void assignOffsets(); 2831db9f3b2SDimitry Andric 2841db9f3b2SDimitry Andric /// Enumerate all compile units and assign offsets to their sections. 2851db9f3b2SDimitry Andric void assignOffsetsToSections(); 2861db9f3b2SDimitry Andric 2871db9f3b2SDimitry Andric /// Enumerate all compile units and assign offsets to their strings. 2881db9f3b2SDimitry Andric void assignOffsetsToStrings(); 2891db9f3b2SDimitry Andric 2901db9f3b2SDimitry Andric /// Print statistic for processed Debug Info. 2911db9f3b2SDimitry Andric void printStatistic(); 2921db9f3b2SDimitry Andric 2931db9f3b2SDimitry Andric enum StringDestinationKind : uint8_t { DebugStr, DebugLineStr }; 2941db9f3b2SDimitry Andric 2951db9f3b2SDimitry Andric /// Enumerates all strings. 2961db9f3b2SDimitry Andric void forEachOutputString( 2971db9f3b2SDimitry Andric function_ref<void(StringDestinationKind, const StringEntry *)> 2981db9f3b2SDimitry Andric StringHandler); 2991db9f3b2SDimitry Andric 3001db9f3b2SDimitry Andric /// Enumerates sections for modules, invariant for object files, compile 3011db9f3b2SDimitry Andric /// units. 3021db9f3b2SDimitry Andric void forEachObjectSectionsSet( 3031db9f3b2SDimitry Andric function_ref<void(OutputSections &SectionsSet)> SectionsSetHandler); 3041db9f3b2SDimitry Andric 3051db9f3b2SDimitry Andric /// Enumerates all compile and type units. 3061db9f3b2SDimitry Andric void forEachCompileAndTypeUnit(function_ref<void(DwarfUnit *CU)> UnitHandler); 3071db9f3b2SDimitry Andric 3081db9f3b2SDimitry Andric /// Enumerates all comple units. 3091db9f3b2SDimitry Andric void forEachCompileUnit(function_ref<void(CompileUnit *CU)> UnitHandler); 3101db9f3b2SDimitry Andric 3111db9f3b2SDimitry Andric /// Enumerates all patches and update them with the correct values. 3121db9f3b2SDimitry Andric void patchOffsetsAndSizes(); 3131db9f3b2SDimitry Andric 3141db9f3b2SDimitry Andric /// Emit debug sections common for all input files. 3151db9f3b2SDimitry Andric void emitCommonSectionsAndWriteCompileUnitsToTheOutput(); 3161db9f3b2SDimitry Andric 3171db9f3b2SDimitry Andric /// Emit apple accelerator sections. 3181db9f3b2SDimitry Andric void emitAppleAcceleratorSections(const Triple &TargetTriple); 3191db9f3b2SDimitry Andric 3201db9f3b2SDimitry Andric /// Emit .debug_names section. 3211db9f3b2SDimitry Andric void emitDWARFv5DebugNamesSection(const Triple &TargetTriple); 3221db9f3b2SDimitry Andric 3231db9f3b2SDimitry Andric /// Emit string sections. 3241db9f3b2SDimitry Andric void emitStringSections(); 3251db9f3b2SDimitry Andric 3261db9f3b2SDimitry Andric /// Cleanup data(string pools) after output sections are generated. 3271db9f3b2SDimitry Andric void cleanupDataAfterDWARFOutputIsWritten(); 3281db9f3b2SDimitry Andric 3291db9f3b2SDimitry Andric /// Enumerate all compile units and put their data into the output stream. 3301db9f3b2SDimitry Andric void writeCompileUnitsToTheOutput(); 3311db9f3b2SDimitry Andric 3321db9f3b2SDimitry Andric /// Enumerate common sections and put their data into the output stream. 3331db9f3b2SDimitry Andric void writeCommonSectionsToTheOutput(); 3341db9f3b2SDimitry Andric 3351db9f3b2SDimitry Andric /// \defgroup Data members accessed asinchroniously. 3361db9f3b2SDimitry Andric /// 3371db9f3b2SDimitry Andric /// @{ 3381db9f3b2SDimitry Andric 3391db9f3b2SDimitry Andric /// Unique ID for compile unit. 3401db9f3b2SDimitry Andric std::atomic<size_t> UniqueUnitID; 3411db9f3b2SDimitry Andric 3421db9f3b2SDimitry Andric /// Mapping the PCM filename to the DwoId. 3431db9f3b2SDimitry Andric StringMap<uint64_t> ClangModules; 3441db9f3b2SDimitry Andric std::mutex ClangModulesMutex; 3451db9f3b2SDimitry Andric 3461db9f3b2SDimitry Andric /// Type unit. 3471db9f3b2SDimitry Andric std::unique_ptr<TypeUnit> ArtificialTypeUnit; 3481db9f3b2SDimitry Andric /// @} 3491db9f3b2SDimitry Andric 3501db9f3b2SDimitry Andric /// \defgroup Data members accessed sequentially. 3511db9f3b2SDimitry Andric /// 3521db9f3b2SDimitry Andric /// @{ 353*0fca6ea1SDimitry Andric /// Data global for the whole linking process. 354*0fca6ea1SDimitry Andric LinkingGlobalData GlobalData; 355*0fca6ea1SDimitry Andric 3561db9f3b2SDimitry Andric /// DwarfStringPoolEntries for .debug_str section. 3571db9f3b2SDimitry Andric StringEntryToDwarfStringPoolEntryMap DebugStrStrings; 3581db9f3b2SDimitry Andric 3591db9f3b2SDimitry Andric /// DwarfStringPoolEntries for .debug_line_str section. 3601db9f3b2SDimitry Andric StringEntryToDwarfStringPoolEntryMap DebugLineStrStrings; 3611db9f3b2SDimitry Andric 3621db9f3b2SDimitry Andric /// Keeps all linking contexts. 3631db9f3b2SDimitry Andric SmallVector<std::unique_ptr<LinkContext>> ObjectContexts; 3641db9f3b2SDimitry Andric 3651db9f3b2SDimitry Andric /// Common sections. 3661db9f3b2SDimitry Andric OutputSections CommonSections; 3671db9f3b2SDimitry Andric 3687a6dacacSDimitry Andric /// Hanler for output sections. 3697a6dacacSDimitry Andric SectionHandlerTy SectionHandler = nullptr; 3701db9f3b2SDimitry Andric 3711db9f3b2SDimitry Andric /// Overall compile units number. 3721db9f3b2SDimitry Andric uint64_t OverallNumberOfCU = 0; 3731db9f3b2SDimitry Andric /// @} 3741db9f3b2SDimitry Andric }; 3751db9f3b2SDimitry Andric 3761db9f3b2SDimitry Andric } // end of namespace parallel 3771db9f3b2SDimitry Andric } // end of namespace dwarf_linker 3781db9f3b2SDimitry Andric } // end of namespace llvm 3791db9f3b2SDimitry Andric 3801db9f3b2SDimitry Andric #endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERIMPL_H 381