xref: /freebsd-src/contrib/llvm-project/llvm/lib/DWARFLinker/Parallel/DWARFLinkerImpl.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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