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