1*1db9f3b2SDimitry Andric //===- DWARFLinkerImpl.h ----------------------------------------*- C++ -*-===// 2*1db9f3b2SDimitry Andric // 3*1db9f3b2SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*1db9f3b2SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*1db9f3b2SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*1db9f3b2SDimitry Andric // 7*1db9f3b2SDimitry Andric //===----------------------------------------------------------------------===// 8*1db9f3b2SDimitry Andric 9*1db9f3b2SDimitry Andric #ifndef LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERIMPL_H 10*1db9f3b2SDimitry Andric #define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERIMPL_H 11*1db9f3b2SDimitry Andric 12*1db9f3b2SDimitry Andric #include "DWARFEmitterImpl.h" 13*1db9f3b2SDimitry Andric #include "DWARFLinkerCompileUnit.h" 14*1db9f3b2SDimitry Andric #include "DWARFLinkerTypeUnit.h" 15*1db9f3b2SDimitry Andric #include "StringEntryToDwarfStringPoolEntryMap.h" 16*1db9f3b2SDimitry Andric #include "llvm/ADT/AddressRanges.h" 17*1db9f3b2SDimitry Andric #include "llvm/CodeGen/AccelTable.h" 18*1db9f3b2SDimitry Andric #include "llvm/DWARFLinker/Parallel/DWARFLinker.h" 19*1db9f3b2SDimitry Andric #include "llvm/DWARFLinker/StringPool.h" 20*1db9f3b2SDimitry Andric 21*1db9f3b2SDimitry Andric namespace llvm { 22*1db9f3b2SDimitry Andric namespace dwarf_linker { 23*1db9f3b2SDimitry Andric namespace parallel { 24*1db9f3b2SDimitry Andric 25*1db9f3b2SDimitry Andric /// This class links debug info. 26*1db9f3b2SDimitry Andric class DWARFLinkerImpl : public DWARFLinker { 27*1db9f3b2SDimitry Andric public: 28*1db9f3b2SDimitry Andric DWARFLinkerImpl(MessageHandlerTy ErrorHandler, 29*1db9f3b2SDimitry Andric MessageHandlerTy WarningHandler, 30*1db9f3b2SDimitry Andric TranslatorFuncTy StringsTranslator); 31*1db9f3b2SDimitry Andric 32*1db9f3b2SDimitry Andric /// Create debug info emitter. 33*1db9f3b2SDimitry Andric Error createEmitter(const Triple &TheTriple, OutputFileType FileType, 34*1db9f3b2SDimitry Andric raw_pwrite_stream &OutFile) override; 35*1db9f3b2SDimitry Andric 36*1db9f3b2SDimitry Andric ExtraDwarfEmitter *getEmitter() override; 37*1db9f3b2SDimitry Andric 38*1db9f3b2SDimitry Andric /// Add object file to be linked. Pre-load compile unit die. Call 39*1db9f3b2SDimitry Andric /// \p OnCUDieLoaded for each compile unit die. If specified \p File 40*1db9f3b2SDimitry Andric /// has reference to the Clang module then such module would be 41*1db9f3b2SDimitry Andric /// pre-loaded by \p Loader for !Update case. 42*1db9f3b2SDimitry Andric /// 43*1db9f3b2SDimitry Andric /// \pre NoODR, Update options should be set before call to addObjectFile. 44*1db9f3b2SDimitry Andric void addObjectFile( 45*1db9f3b2SDimitry Andric DWARFFile &File, ObjFileLoaderTy Loader = nullptr, 46*1db9f3b2SDimitry Andric 47*1db9f3b2SDimitry Andric CompileUnitHandlerTy OnCUDieLoaded = [](const DWARFUnit &) {}) override; 48*1db9f3b2SDimitry Andric 49*1db9f3b2SDimitry Andric /// Link debug info for added files. 50*1db9f3b2SDimitry Andric Error link() override; 51*1db9f3b2SDimitry Andric 52*1db9f3b2SDimitry Andric /// \defgroup Methods setting various linking options: 53*1db9f3b2SDimitry Andric /// 54*1db9f3b2SDimitry Andric /// @{ 55*1db9f3b2SDimitry Andric /// 56*1db9f3b2SDimitry Andric 57*1db9f3b2SDimitry Andric /// Allows to generate log of linking process to the standard output. 58*1db9f3b2SDimitry Andric void setVerbosity(bool Verbose) override { 59*1db9f3b2SDimitry Andric GlobalData.Options.Verbose = Verbose; 60*1db9f3b2SDimitry Andric } 61*1db9f3b2SDimitry Andric 62*1db9f3b2SDimitry Andric /// Print statistics to standard output. 63*1db9f3b2SDimitry Andric void setStatistics(bool Statistics) override { 64*1db9f3b2SDimitry Andric GlobalData.Options.Statistics = Statistics; 65*1db9f3b2SDimitry Andric } 66*1db9f3b2SDimitry Andric 67*1db9f3b2SDimitry Andric /// Verify the input DWARF. 68*1db9f3b2SDimitry Andric void setVerifyInputDWARF(bool Verify) override { 69*1db9f3b2SDimitry Andric GlobalData.Options.VerifyInputDWARF = Verify; 70*1db9f3b2SDimitry Andric } 71*1db9f3b2SDimitry Andric 72*1db9f3b2SDimitry Andric /// Do not unique types according to ODR. 73*1db9f3b2SDimitry Andric void setNoODR(bool NoODR) override { GlobalData.Options.NoODR = NoODR; } 74*1db9f3b2SDimitry Andric 75*1db9f3b2SDimitry Andric /// Update index tables only(do not modify rest of DWARF). 76*1db9f3b2SDimitry Andric void setUpdateIndexTablesOnly(bool UpdateIndexTablesOnly) override { 77*1db9f3b2SDimitry Andric GlobalData.Options.UpdateIndexTablesOnly = UpdateIndexTablesOnly; 78*1db9f3b2SDimitry Andric } 79*1db9f3b2SDimitry Andric 80*1db9f3b2SDimitry Andric /// Allow generating valid, but non-deterministic output. 81*1db9f3b2SDimitry Andric void 82*1db9f3b2SDimitry Andric setAllowNonDeterministicOutput(bool AllowNonDeterministicOutput) override { 83*1db9f3b2SDimitry Andric GlobalData.Options.AllowNonDeterministicOutput = 84*1db9f3b2SDimitry Andric AllowNonDeterministicOutput; 85*1db9f3b2SDimitry Andric } 86*1db9f3b2SDimitry Andric 87*1db9f3b2SDimitry Andric /// Set to keep the enclosing function for a static variable. 88*1db9f3b2SDimitry Andric void setKeepFunctionForStatic(bool KeepFunctionForStatic) override { 89*1db9f3b2SDimitry Andric GlobalData.Options.KeepFunctionForStatic = KeepFunctionForStatic; 90*1db9f3b2SDimitry Andric } 91*1db9f3b2SDimitry Andric 92*1db9f3b2SDimitry Andric /// Use specified number of threads for parallel files linking. 93*1db9f3b2SDimitry Andric void setNumThreads(unsigned NumThreads) override { 94*1db9f3b2SDimitry Andric GlobalData.Options.Threads = NumThreads; 95*1db9f3b2SDimitry Andric } 96*1db9f3b2SDimitry Andric 97*1db9f3b2SDimitry Andric /// Add kind of accelerator tables to be generated. 98*1db9f3b2SDimitry Andric void addAccelTableKind(AccelTableKind Kind) override { 99*1db9f3b2SDimitry Andric assert(!llvm::is_contained(GlobalData.getOptions().AccelTables, Kind)); 100*1db9f3b2SDimitry Andric GlobalData.Options.AccelTables.emplace_back(Kind); 101*1db9f3b2SDimitry Andric } 102*1db9f3b2SDimitry Andric 103*1db9f3b2SDimitry Andric /// Set prepend path for clang modules. 104*1db9f3b2SDimitry Andric void setPrependPath(StringRef Ppath) override { 105*1db9f3b2SDimitry Andric GlobalData.Options.PrependPath = Ppath; 106*1db9f3b2SDimitry Andric } 107*1db9f3b2SDimitry Andric 108*1db9f3b2SDimitry Andric /// Set estimated objects files amount, for preliminary data allocation. 109*1db9f3b2SDimitry Andric void setEstimatedObjfilesAmount(unsigned ObjFilesNum) override; 110*1db9f3b2SDimitry Andric 111*1db9f3b2SDimitry Andric /// Set verification handler which would be used to report verification 112*1db9f3b2SDimitry Andric /// errors. 113*1db9f3b2SDimitry Andric void 114*1db9f3b2SDimitry Andric setInputVerificationHandler(InputVerificationHandlerTy Handler) override { 115*1db9f3b2SDimitry Andric GlobalData.Options.InputVerificationHandler = Handler; 116*1db9f3b2SDimitry Andric } 117*1db9f3b2SDimitry Andric 118*1db9f3b2SDimitry Andric /// Set map for Swift interfaces. 119*1db9f3b2SDimitry Andric void setSwiftInterfacesMap(SwiftInterfacesMapTy *Map) override { 120*1db9f3b2SDimitry Andric GlobalData.Options.ParseableSwiftInterfaces = Map; 121*1db9f3b2SDimitry Andric } 122*1db9f3b2SDimitry Andric 123*1db9f3b2SDimitry Andric /// Set prefix map for objects. 124*1db9f3b2SDimitry Andric void setObjectPrefixMap(ObjectPrefixMapTy *Map) override { 125*1db9f3b2SDimitry Andric GlobalData.Options.ObjectPrefixMap = Map; 126*1db9f3b2SDimitry Andric } 127*1db9f3b2SDimitry Andric 128*1db9f3b2SDimitry Andric /// Set target DWARF version. 129*1db9f3b2SDimitry Andric Error setTargetDWARFVersion(uint16_t TargetDWARFVersion) override { 130*1db9f3b2SDimitry Andric if ((TargetDWARFVersion < 1) || (TargetDWARFVersion > 5)) 131*1db9f3b2SDimitry Andric return createStringError(std::errc::invalid_argument, 132*1db9f3b2SDimitry Andric "unsupported DWARF version: %d", 133*1db9f3b2SDimitry Andric TargetDWARFVersion); 134*1db9f3b2SDimitry Andric 135*1db9f3b2SDimitry Andric GlobalData.Options.TargetDWARFVersion = TargetDWARFVersion; 136*1db9f3b2SDimitry Andric return Error::success(); 137*1db9f3b2SDimitry Andric } 138*1db9f3b2SDimitry Andric /// @} 139*1db9f3b2SDimitry Andric 140*1db9f3b2SDimitry Andric protected: 141*1db9f3b2SDimitry Andric /// Verify input DWARF file. 142*1db9f3b2SDimitry Andric void verifyInput(const DWARFFile &File); 143*1db9f3b2SDimitry Andric 144*1db9f3b2SDimitry Andric /// Validate specified options. 145*1db9f3b2SDimitry Andric Error validateAndUpdateOptions(); 146*1db9f3b2SDimitry Andric 147*1db9f3b2SDimitry Andric /// Take already linked compile units and glue them into single file. 148*1db9f3b2SDimitry Andric void glueCompileUnitsAndWriteToTheOutput(); 149*1db9f3b2SDimitry Andric 150*1db9f3b2SDimitry Andric /// Hold the input and output of the debug info size in bytes. 151*1db9f3b2SDimitry Andric struct DebugInfoSize { 152*1db9f3b2SDimitry Andric uint64_t Input; 153*1db9f3b2SDimitry Andric uint64_t Output; 154*1db9f3b2SDimitry Andric }; 155*1db9f3b2SDimitry Andric 156*1db9f3b2SDimitry Andric friend class DependencyTracker; 157*1db9f3b2SDimitry Andric /// Keeps track of data associated with one object during linking. 158*1db9f3b2SDimitry Andric /// i.e. source file descriptor, compilation units, output data 159*1db9f3b2SDimitry Andric /// for compilation units common tables. 160*1db9f3b2SDimitry Andric struct LinkContext : public OutputSections { 161*1db9f3b2SDimitry Andric using UnitListTy = SmallVector<std::unique_ptr<CompileUnit>>; 162*1db9f3b2SDimitry Andric 163*1db9f3b2SDimitry Andric /// Keep information for referenced clang module: already loaded DWARF info 164*1db9f3b2SDimitry Andric /// of the clang module and a CompileUnit of the module. 165*1db9f3b2SDimitry Andric struct RefModuleUnit { 166*1db9f3b2SDimitry Andric RefModuleUnit(DWARFFile &File, std::unique_ptr<CompileUnit> Unit); 167*1db9f3b2SDimitry Andric RefModuleUnit(RefModuleUnit &&Other); 168*1db9f3b2SDimitry Andric RefModuleUnit(const RefModuleUnit &) = delete; 169*1db9f3b2SDimitry Andric 170*1db9f3b2SDimitry Andric DWARFFile &File; 171*1db9f3b2SDimitry Andric std::unique_ptr<CompileUnit> Unit; 172*1db9f3b2SDimitry Andric }; 173*1db9f3b2SDimitry Andric using ModuleUnitListTy = SmallVector<RefModuleUnit>; 174*1db9f3b2SDimitry Andric 175*1db9f3b2SDimitry Andric /// Object file descriptor. 176*1db9f3b2SDimitry Andric DWARFFile &InputDWARFFile; 177*1db9f3b2SDimitry Andric 178*1db9f3b2SDimitry Andric /// Set of Compilation Units(may be accessed asynchroniously for reading). 179*1db9f3b2SDimitry Andric UnitListTy CompileUnits; 180*1db9f3b2SDimitry Andric 181*1db9f3b2SDimitry Andric /// Set of Compile Units for modules. 182*1db9f3b2SDimitry Andric ModuleUnitListTy ModulesCompileUnits; 183*1db9f3b2SDimitry Andric 184*1db9f3b2SDimitry Andric /// Size of Debug info before optimizing. 185*1db9f3b2SDimitry Andric uint64_t OriginalDebugInfoSize = 0; 186*1db9f3b2SDimitry Andric 187*1db9f3b2SDimitry Andric /// Flag indicating that all inter-connected units are loaded 188*1db9f3b2SDimitry Andric /// and the dwarf linking process for these units is started. 189*1db9f3b2SDimitry Andric bool InterCUProcessingStarted = false; 190*1db9f3b2SDimitry Andric 191*1db9f3b2SDimitry Andric StringMap<uint64_t> &ClangModules; 192*1db9f3b2SDimitry Andric 193*1db9f3b2SDimitry Andric std::optional<Triple> TargetTriple; 194*1db9f3b2SDimitry Andric 195*1db9f3b2SDimitry Andric /// Flag indicating that new inter-connected compilation units were 196*1db9f3b2SDimitry Andric /// discovered. It is used for restarting units processing 197*1db9f3b2SDimitry Andric /// if new inter-connected units were found. 198*1db9f3b2SDimitry Andric std::atomic<bool> HasNewInterconnectedCUs = {false}; 199*1db9f3b2SDimitry Andric 200*1db9f3b2SDimitry Andric std::atomic<bool> HasNewGlobalDependency = {false}; 201*1db9f3b2SDimitry Andric 202*1db9f3b2SDimitry Andric /// Counter for compile units ID. 203*1db9f3b2SDimitry Andric std::atomic<size_t> &UniqueUnitID; 204*1db9f3b2SDimitry Andric 205*1db9f3b2SDimitry Andric LinkContext(LinkingGlobalData &GlobalData, DWARFFile &File, 206*1db9f3b2SDimitry Andric StringMap<uint64_t> &ClangModules, 207*1db9f3b2SDimitry Andric std::atomic<size_t> &UniqueUnitID, 208*1db9f3b2SDimitry Andric std::optional<Triple> TargetTriple); 209*1db9f3b2SDimitry Andric 210*1db9f3b2SDimitry Andric /// Check whether specified \p CUDie is a Clang module reference. 211*1db9f3b2SDimitry Andric /// if \p Quiet is false then display error messages. 212*1db9f3b2SDimitry Andric /// \return first == true if CUDie is a Clang module reference. 213*1db9f3b2SDimitry Andric /// second == true if module is already loaded. 214*1db9f3b2SDimitry Andric std::pair<bool, bool> isClangModuleRef(const DWARFDie &CUDie, 215*1db9f3b2SDimitry Andric std::string &PCMFile, 216*1db9f3b2SDimitry Andric unsigned Indent, bool Quiet); 217*1db9f3b2SDimitry Andric 218*1db9f3b2SDimitry Andric /// If this compile unit is really a skeleton CU that points to a 219*1db9f3b2SDimitry Andric /// clang module, register it in ClangModules and return true. 220*1db9f3b2SDimitry Andric /// 221*1db9f3b2SDimitry Andric /// A skeleton CU is a CU without children, a DW_AT_gnu_dwo_name 222*1db9f3b2SDimitry Andric /// pointing to the module, and a DW_AT_gnu_dwo_id with the module 223*1db9f3b2SDimitry Andric /// hash. 224*1db9f3b2SDimitry Andric bool registerModuleReference(const DWARFDie &CUDie, ObjFileLoaderTy Loader, 225*1db9f3b2SDimitry Andric CompileUnitHandlerTy OnCUDieLoaded, 226*1db9f3b2SDimitry Andric unsigned Indent = 0); 227*1db9f3b2SDimitry Andric 228*1db9f3b2SDimitry Andric /// Recursively add the debug info in this clang module .pcm 229*1db9f3b2SDimitry Andric /// file (and all the modules imported by it in a bottom-up fashion) 230*1db9f3b2SDimitry Andric /// to ModuleUnits. 231*1db9f3b2SDimitry Andric Error loadClangModule(ObjFileLoaderTy Loader, const DWARFDie &CUDie, 232*1db9f3b2SDimitry Andric const std::string &PCMFile, 233*1db9f3b2SDimitry Andric CompileUnitHandlerTy OnCUDieLoaded, 234*1db9f3b2SDimitry Andric unsigned Indent = 0); 235*1db9f3b2SDimitry Andric 236*1db9f3b2SDimitry Andric /// Add Compile Unit corresponding to the module. 237*1db9f3b2SDimitry Andric void addModulesCompileUnit(RefModuleUnit &&Unit); 238*1db9f3b2SDimitry Andric 239*1db9f3b2SDimitry Andric /// Computes the total size of the debug info. 240*1db9f3b2SDimitry Andric uint64_t getInputDebugInfoSize() const { 241*1db9f3b2SDimitry Andric uint64_t Size = 0; 242*1db9f3b2SDimitry Andric 243*1db9f3b2SDimitry Andric if (InputDWARFFile.Dwarf == nullptr) 244*1db9f3b2SDimitry Andric return Size; 245*1db9f3b2SDimitry Andric 246*1db9f3b2SDimitry Andric for (auto &Unit : InputDWARFFile.Dwarf->compile_units()) 247*1db9f3b2SDimitry Andric Size += Unit->getLength(); 248*1db9f3b2SDimitry Andric 249*1db9f3b2SDimitry Andric return Size; 250*1db9f3b2SDimitry Andric } 251*1db9f3b2SDimitry Andric 252*1db9f3b2SDimitry Andric /// Link compile units for this context. 253*1db9f3b2SDimitry Andric Error link(TypeUnit *ArtificialTypeUnit); 254*1db9f3b2SDimitry Andric 255*1db9f3b2SDimitry Andric /// Link specified compile unit until specified stage. 256*1db9f3b2SDimitry Andric void linkSingleCompileUnit( 257*1db9f3b2SDimitry Andric CompileUnit &CU, TypeUnit *ArtificialTypeUnit, 258*1db9f3b2SDimitry Andric enum CompileUnit::Stage DoUntilStage = CompileUnit::Stage::Cleaned); 259*1db9f3b2SDimitry Andric 260*1db9f3b2SDimitry Andric /// Emit invariant sections. 261*1db9f3b2SDimitry Andric Error emitInvariantSections(); 262*1db9f3b2SDimitry Andric 263*1db9f3b2SDimitry Andric /// Clone and emit .debug_frame. 264*1db9f3b2SDimitry Andric Error cloneAndEmitDebugFrame(); 265*1db9f3b2SDimitry Andric 266*1db9f3b2SDimitry Andric /// Emit FDE record. 267*1db9f3b2SDimitry Andric void emitFDE(uint32_t CIEOffset, uint32_t AddrSize, uint64_t Address, 268*1db9f3b2SDimitry Andric StringRef FDEBytes, SectionDescriptor &Section); 269*1db9f3b2SDimitry Andric 270*1db9f3b2SDimitry Andric std::function<CompileUnit *(uint64_t)> getUnitForOffset = 271*1db9f3b2SDimitry Andric [&](uint64_t Offset) -> CompileUnit * { 272*1db9f3b2SDimitry Andric auto CU = llvm::upper_bound( 273*1db9f3b2SDimitry Andric CompileUnits, Offset, 274*1db9f3b2SDimitry Andric [](uint64_t LHS, const std::unique_ptr<CompileUnit> &RHS) { 275*1db9f3b2SDimitry Andric return LHS < RHS->getOrigUnit().getNextUnitOffset(); 276*1db9f3b2SDimitry Andric }); 277*1db9f3b2SDimitry Andric 278*1db9f3b2SDimitry Andric return CU != CompileUnits.end() ? CU->get() : nullptr; 279*1db9f3b2SDimitry Andric }; 280*1db9f3b2SDimitry Andric }; 281*1db9f3b2SDimitry Andric 282*1db9f3b2SDimitry Andric /// Enumerate all compile units and assign offsets to their sections and 283*1db9f3b2SDimitry Andric /// strings. 284*1db9f3b2SDimitry Andric void assignOffsets(); 285*1db9f3b2SDimitry Andric 286*1db9f3b2SDimitry Andric /// Enumerate all compile units and assign offsets to their sections. 287*1db9f3b2SDimitry Andric void assignOffsetsToSections(); 288*1db9f3b2SDimitry Andric 289*1db9f3b2SDimitry Andric /// Enumerate all compile units and assign offsets to their strings. 290*1db9f3b2SDimitry Andric void assignOffsetsToStrings(); 291*1db9f3b2SDimitry Andric 292*1db9f3b2SDimitry Andric /// Print statistic for processed Debug Info. 293*1db9f3b2SDimitry Andric void printStatistic(); 294*1db9f3b2SDimitry Andric 295*1db9f3b2SDimitry Andric enum StringDestinationKind : uint8_t { DebugStr, DebugLineStr }; 296*1db9f3b2SDimitry Andric 297*1db9f3b2SDimitry Andric /// Enumerates all strings. 298*1db9f3b2SDimitry Andric void forEachOutputString( 299*1db9f3b2SDimitry Andric function_ref<void(StringDestinationKind, const StringEntry *)> 300*1db9f3b2SDimitry Andric StringHandler); 301*1db9f3b2SDimitry Andric 302*1db9f3b2SDimitry Andric /// Enumerates sections for modules, invariant for object files, compile 303*1db9f3b2SDimitry Andric /// units. 304*1db9f3b2SDimitry Andric void forEachObjectSectionsSet( 305*1db9f3b2SDimitry Andric function_ref<void(OutputSections &SectionsSet)> SectionsSetHandler); 306*1db9f3b2SDimitry Andric 307*1db9f3b2SDimitry Andric /// Enumerates all compile and type units. 308*1db9f3b2SDimitry Andric void forEachCompileAndTypeUnit(function_ref<void(DwarfUnit *CU)> UnitHandler); 309*1db9f3b2SDimitry Andric 310*1db9f3b2SDimitry Andric /// Enumerates all comple units. 311*1db9f3b2SDimitry Andric void forEachCompileUnit(function_ref<void(CompileUnit *CU)> UnitHandler); 312*1db9f3b2SDimitry Andric 313*1db9f3b2SDimitry Andric /// Enumerates all patches and update them with the correct values. 314*1db9f3b2SDimitry Andric void patchOffsetsAndSizes(); 315*1db9f3b2SDimitry Andric 316*1db9f3b2SDimitry Andric /// Emit debug sections common for all input files. 317*1db9f3b2SDimitry Andric void emitCommonSectionsAndWriteCompileUnitsToTheOutput(); 318*1db9f3b2SDimitry Andric 319*1db9f3b2SDimitry Andric /// Emit apple accelerator sections. 320*1db9f3b2SDimitry Andric void emitAppleAcceleratorSections(const Triple &TargetTriple); 321*1db9f3b2SDimitry Andric 322*1db9f3b2SDimitry Andric /// Emit .debug_names section. 323*1db9f3b2SDimitry Andric void emitDWARFv5DebugNamesSection(const Triple &TargetTriple); 324*1db9f3b2SDimitry Andric 325*1db9f3b2SDimitry Andric /// Emit string sections. 326*1db9f3b2SDimitry Andric void emitStringSections(); 327*1db9f3b2SDimitry Andric 328*1db9f3b2SDimitry Andric /// Cleanup data(string pools) after output sections are generated. 329*1db9f3b2SDimitry Andric void cleanupDataAfterDWARFOutputIsWritten(); 330*1db9f3b2SDimitry Andric 331*1db9f3b2SDimitry Andric /// Enumerate all compile units and put their data into the output stream. 332*1db9f3b2SDimitry Andric void writeCompileUnitsToTheOutput(); 333*1db9f3b2SDimitry Andric 334*1db9f3b2SDimitry Andric /// Enumerate common sections and put their data into the output stream. 335*1db9f3b2SDimitry Andric void writeCommonSectionsToTheOutput(); 336*1db9f3b2SDimitry Andric 337*1db9f3b2SDimitry Andric /// \defgroup Data members accessed asinchroniously. 338*1db9f3b2SDimitry Andric /// 339*1db9f3b2SDimitry Andric /// @{ 340*1db9f3b2SDimitry Andric 341*1db9f3b2SDimitry Andric /// Unique ID for compile unit. 342*1db9f3b2SDimitry Andric std::atomic<size_t> UniqueUnitID; 343*1db9f3b2SDimitry Andric 344*1db9f3b2SDimitry Andric /// Mapping the PCM filename to the DwoId. 345*1db9f3b2SDimitry Andric StringMap<uint64_t> ClangModules; 346*1db9f3b2SDimitry Andric std::mutex ClangModulesMutex; 347*1db9f3b2SDimitry Andric 348*1db9f3b2SDimitry Andric /// Type unit. 349*1db9f3b2SDimitry Andric std::unique_ptr<TypeUnit> ArtificialTypeUnit; 350*1db9f3b2SDimitry Andric /// @} 351*1db9f3b2SDimitry Andric 352*1db9f3b2SDimitry Andric /// \defgroup Data members accessed sequentially. 353*1db9f3b2SDimitry Andric /// 354*1db9f3b2SDimitry Andric /// @{ 355*1db9f3b2SDimitry Andric /// DwarfStringPoolEntries for .debug_str section. 356*1db9f3b2SDimitry Andric StringEntryToDwarfStringPoolEntryMap DebugStrStrings; 357*1db9f3b2SDimitry Andric 358*1db9f3b2SDimitry Andric /// DwarfStringPoolEntries for .debug_line_str section. 359*1db9f3b2SDimitry Andric StringEntryToDwarfStringPoolEntryMap DebugLineStrStrings; 360*1db9f3b2SDimitry Andric 361*1db9f3b2SDimitry Andric /// Keeps all linking contexts. 362*1db9f3b2SDimitry Andric SmallVector<std::unique_ptr<LinkContext>> ObjectContexts; 363*1db9f3b2SDimitry Andric 364*1db9f3b2SDimitry Andric /// Common sections. 365*1db9f3b2SDimitry Andric OutputSections CommonSections; 366*1db9f3b2SDimitry Andric 367*1db9f3b2SDimitry Andric /// The emitter of final dwarf file. 368*1db9f3b2SDimitry Andric std::unique_ptr<DwarfEmitterImpl> TheDwarfEmitter; 369*1db9f3b2SDimitry Andric 370*1db9f3b2SDimitry Andric /// Overall compile units number. 371*1db9f3b2SDimitry Andric uint64_t OverallNumberOfCU = 0; 372*1db9f3b2SDimitry Andric 373*1db9f3b2SDimitry Andric /// Data global for the whole linking process. 374*1db9f3b2SDimitry Andric LinkingGlobalData GlobalData; 375*1db9f3b2SDimitry Andric /// @} 376*1db9f3b2SDimitry Andric }; 377*1db9f3b2SDimitry Andric 378*1db9f3b2SDimitry Andric } // end of namespace parallel 379*1db9f3b2SDimitry Andric } // end of namespace dwarf_linker 380*1db9f3b2SDimitry Andric } // end of namespace llvm 381*1db9f3b2SDimitry Andric 382*1db9f3b2SDimitry Andric #endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERIMPL_H 383