xref: /freebsd-src/contrib/llvm-project/llvm/lib/DWARFLinker/Parallel/DWARFLinkerGlobalData.h (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
1*1db9f3b2SDimitry Andric //===- DWARFLinkerGlobalData.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_DWARFLINKERGLOBALDATA_H
10*1db9f3b2SDimitry Andric #define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H
11*1db9f3b2SDimitry Andric 
12*1db9f3b2SDimitry Andric #include "TypePool.h"
13*1db9f3b2SDimitry Andric #include "llvm/DWARFLinker/Parallel/DWARFLinker.h"
14*1db9f3b2SDimitry Andric #include "llvm/DWARFLinker/StringPool.h"
15*1db9f3b2SDimitry Andric #include "llvm/Support/PerThreadBumpPtrAllocator.h"
16*1db9f3b2SDimitry Andric 
17*1db9f3b2SDimitry Andric namespace llvm {
18*1db9f3b2SDimitry Andric 
19*1db9f3b2SDimitry Andric class DWARFDie;
20*1db9f3b2SDimitry Andric 
21*1db9f3b2SDimitry Andric namespace dwarf_linker {
22*1db9f3b2SDimitry Andric namespace parallel {
23*1db9f3b2SDimitry Andric 
24*1db9f3b2SDimitry Andric using TranslatorFuncTy = std::function<StringRef(StringRef)>;
25*1db9f3b2SDimitry Andric using MessageHandlerTy = std::function<void(
26*1db9f3b2SDimitry Andric     const Twine &Warning, StringRef Context, const DWARFDie *DIE)>;
27*1db9f3b2SDimitry Andric 
28*1db9f3b2SDimitry Andric /// linking options
29*1db9f3b2SDimitry Andric struct DWARFLinkerOptions {
30*1db9f3b2SDimitry Andric   /// DWARF version for the output.
31*1db9f3b2SDimitry Andric   uint16_t TargetDWARFVersion = 0;
32*1db9f3b2SDimitry Andric 
33*1db9f3b2SDimitry Andric   /// Generate processing log to the standard output.
34*1db9f3b2SDimitry Andric   bool Verbose = false;
35*1db9f3b2SDimitry Andric 
36*1db9f3b2SDimitry Andric   /// Print statistics.
37*1db9f3b2SDimitry Andric   bool Statistics = false;
38*1db9f3b2SDimitry Andric 
39*1db9f3b2SDimitry Andric   /// Verify the input DWARF.
40*1db9f3b2SDimitry Andric   bool VerifyInputDWARF = false;
41*1db9f3b2SDimitry Andric 
42*1db9f3b2SDimitry Andric   /// Do not emit output.
43*1db9f3b2SDimitry Andric   bool NoOutput = false;
44*1db9f3b2SDimitry Andric 
45*1db9f3b2SDimitry Andric   /// Do not unique types according to ODR
46*1db9f3b2SDimitry Andric   bool NoODR = false;
47*1db9f3b2SDimitry Andric 
48*1db9f3b2SDimitry Andric   /// Update index tables.
49*1db9f3b2SDimitry Andric   bool UpdateIndexTablesOnly = false;
50*1db9f3b2SDimitry Andric 
51*1db9f3b2SDimitry Andric   /// Whether we want a static variable to force us to keep its enclosing
52*1db9f3b2SDimitry Andric   /// function.
53*1db9f3b2SDimitry Andric   bool KeepFunctionForStatic = false;
54*1db9f3b2SDimitry Andric 
55*1db9f3b2SDimitry Andric   /// Allow to generate valid, but non deterministic output.
56*1db9f3b2SDimitry Andric   bool AllowNonDeterministicOutput = false;
57*1db9f3b2SDimitry Andric 
58*1db9f3b2SDimitry Andric   /// Number of threads.
59*1db9f3b2SDimitry Andric   unsigned Threads = 1;
60*1db9f3b2SDimitry Andric 
61*1db9f3b2SDimitry Andric   /// The accelerator table kinds
62*1db9f3b2SDimitry Andric   SmallVector<DWARFLinker::AccelTableKind, 1> AccelTables;
63*1db9f3b2SDimitry Andric 
64*1db9f3b2SDimitry Andric   /// Prepend path for the clang modules.
65*1db9f3b2SDimitry Andric   std::string PrependPath;
66*1db9f3b2SDimitry Andric 
67*1db9f3b2SDimitry Andric   /// input verification handler(it might be called asynchronously).
68*1db9f3b2SDimitry Andric   DWARFLinker::InputVerificationHandlerTy InputVerificationHandler = nullptr;
69*1db9f3b2SDimitry Andric 
70*1db9f3b2SDimitry Andric   /// A list of all .swiftinterface files referenced by the debug
71*1db9f3b2SDimitry Andric   /// info, mapping Module name to path on disk. The entries need to
72*1db9f3b2SDimitry Andric   /// be uniqued and sorted and there are only few entries expected
73*1db9f3b2SDimitry Andric   /// per compile unit, which is why this is a std::map.
74*1db9f3b2SDimitry Andric   /// this is dsymutil specific fag.
75*1db9f3b2SDimitry Andric   ///
76*1db9f3b2SDimitry Andric   /// (it might be called asynchronously).
77*1db9f3b2SDimitry Andric   DWARFLinker::SwiftInterfacesMapTy *ParseableSwiftInterfaces = nullptr;
78*1db9f3b2SDimitry Andric 
79*1db9f3b2SDimitry Andric   /// A list of remappings to apply to file paths.
80*1db9f3b2SDimitry Andric   ///
81*1db9f3b2SDimitry Andric   /// (it might be called asynchronously).
82*1db9f3b2SDimitry Andric   DWARFLinker::ObjectPrefixMapTy *ObjectPrefixMap = nullptr;
83*1db9f3b2SDimitry Andric };
84*1db9f3b2SDimitry Andric 
85*1db9f3b2SDimitry Andric class DWARFLinkerImpl;
86*1db9f3b2SDimitry Andric 
87*1db9f3b2SDimitry Andric /// This class keeps data and services common for the whole linking process.
88*1db9f3b2SDimitry Andric class LinkingGlobalData {
89*1db9f3b2SDimitry Andric   friend DWARFLinkerImpl;
90*1db9f3b2SDimitry Andric 
91*1db9f3b2SDimitry Andric public:
92*1db9f3b2SDimitry Andric   /// Returns global per-thread allocator.
93*1db9f3b2SDimitry Andric   llvm::parallel::PerThreadBumpPtrAllocator &getAllocator() {
94*1db9f3b2SDimitry Andric     return Allocator;
95*1db9f3b2SDimitry Andric   }
96*1db9f3b2SDimitry Andric 
97*1db9f3b2SDimitry Andric   /// Returns global string pool.
98*1db9f3b2SDimitry Andric   StringPool &getStringPool() { return Strings; }
99*1db9f3b2SDimitry Andric 
100*1db9f3b2SDimitry Andric   /// Set translation function.
101*1db9f3b2SDimitry Andric   void setTranslator(TranslatorFuncTy Translator) {
102*1db9f3b2SDimitry Andric     this->Translator = Translator;
103*1db9f3b2SDimitry Andric   }
104*1db9f3b2SDimitry Andric 
105*1db9f3b2SDimitry Andric   /// Translate specified string.
106*1db9f3b2SDimitry Andric   StringRef translateString(StringRef String) {
107*1db9f3b2SDimitry Andric     if (Translator)
108*1db9f3b2SDimitry Andric       return Translator(String);
109*1db9f3b2SDimitry Andric 
110*1db9f3b2SDimitry Andric     return String;
111*1db9f3b2SDimitry Andric   }
112*1db9f3b2SDimitry Andric 
113*1db9f3b2SDimitry Andric   /// Returns linking options.
114*1db9f3b2SDimitry Andric   const DWARFLinkerOptions &getOptions() const { return Options; }
115*1db9f3b2SDimitry Andric 
116*1db9f3b2SDimitry Andric   /// Set warning handler.
117*1db9f3b2SDimitry Andric   void setWarningHandler(MessageHandlerTy Handler) { WarningHandler = Handler; }
118*1db9f3b2SDimitry Andric 
119*1db9f3b2SDimitry Andric   /// Set error handler.
120*1db9f3b2SDimitry Andric   void setErrorHandler(MessageHandlerTy Handler) { ErrorHandler = Handler; }
121*1db9f3b2SDimitry Andric 
122*1db9f3b2SDimitry Andric   /// Report warning.
123*1db9f3b2SDimitry Andric   void warn(const Twine &Warning, StringRef Context,
124*1db9f3b2SDimitry Andric             const DWARFDie *DIE = nullptr) {
125*1db9f3b2SDimitry Andric     if (WarningHandler)
126*1db9f3b2SDimitry Andric       (WarningHandler)(Warning, Context, DIE);
127*1db9f3b2SDimitry Andric   }
128*1db9f3b2SDimitry Andric 
129*1db9f3b2SDimitry Andric   /// Report warning.
130*1db9f3b2SDimitry Andric   void warn(Error Warning, StringRef Context, const DWARFDie *DIE = nullptr) {
131*1db9f3b2SDimitry Andric     handleAllErrors(std::move(Warning), [&](ErrorInfoBase &Info) {
132*1db9f3b2SDimitry Andric       warn(Info.message(), Context, DIE);
133*1db9f3b2SDimitry Andric     });
134*1db9f3b2SDimitry Andric   }
135*1db9f3b2SDimitry Andric 
136*1db9f3b2SDimitry Andric   /// Report error.
137*1db9f3b2SDimitry Andric   void error(const Twine &Err, StringRef Context,
138*1db9f3b2SDimitry Andric              const DWARFDie *DIE = nullptr) {
139*1db9f3b2SDimitry Andric     if (ErrorHandler)
140*1db9f3b2SDimitry Andric       (ErrorHandler)(Err, Context, DIE);
141*1db9f3b2SDimitry Andric   }
142*1db9f3b2SDimitry Andric 
143*1db9f3b2SDimitry Andric   /// Report error.
144*1db9f3b2SDimitry Andric   void error(Error Err, StringRef Context, const DWARFDie *DIE = nullptr) {
145*1db9f3b2SDimitry Andric     handleAllErrors(std::move(Err), [&](ErrorInfoBase &Info) {
146*1db9f3b2SDimitry Andric       error(Info.message(), Context, DIE);
147*1db9f3b2SDimitry Andric     });
148*1db9f3b2SDimitry Andric   }
149*1db9f3b2SDimitry Andric 
150*1db9f3b2SDimitry Andric protected:
151*1db9f3b2SDimitry Andric   llvm::parallel::PerThreadBumpPtrAllocator Allocator;
152*1db9f3b2SDimitry Andric   StringPool Strings;
153*1db9f3b2SDimitry Andric   TranslatorFuncTy Translator;
154*1db9f3b2SDimitry Andric   DWARFLinkerOptions Options;
155*1db9f3b2SDimitry Andric   MessageHandlerTy WarningHandler;
156*1db9f3b2SDimitry Andric   MessageHandlerTy ErrorHandler;
157*1db9f3b2SDimitry Andric };
158*1db9f3b2SDimitry Andric 
159*1db9f3b2SDimitry Andric } // end of namespace parallel
160*1db9f3b2SDimitry Andric } // end of namespace dwarf_linker
161*1db9f3b2SDimitry Andric } // end of namespace llvm
162*1db9f3b2SDimitry Andric 
163*1db9f3b2SDimitry Andric #endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H
164