1 //===- DWARFLinkerGlobalData.h ----------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H
10 #define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H
13 #include "llvm/DWARFLinker/Parallel/DWARFLinker.h"
14 #include "llvm/DWARFLinker/StringPool.h"
15 #include "llvm/Support/PerThreadBumpPtrAllocator.h"
21 namespace dwarf_linker
{
24 using MessageHandlerTy
= std::function
<void(
25 const Twine
&Warning
, StringRef Context
, const DWARFDie
*DIE
)>;
28 struct DWARFLinkerOptions
{
29 /// DWARF version for the output.
30 uint16_t TargetDWARFVersion
= 0;
32 /// Generate processing log to the standard output.
36 bool Statistics
= false;
38 /// Verify the input DWARF.
39 bool VerifyInputDWARF
= false;
41 /// Do not unique types according to ODR
44 /// Update index tables.
45 bool UpdateIndexTablesOnly
= false;
47 /// Whether we want a static variable to force us to keep its enclosing
49 bool KeepFunctionForStatic
= false;
51 /// Allow to generate valid, but non deterministic output.
52 bool AllowNonDeterministicOutput
= false;
54 /// Number of threads.
57 /// The accelerator table kinds
58 SmallVector
<DWARFLinkerBase::AccelTableKind
, 1> AccelTables
;
60 /// Prepend path for the clang modules.
61 std::string PrependPath
;
63 /// input verification handler(it might be called asynchronously).
64 DWARFLinkerBase::InputVerificationHandlerTy InputVerificationHandler
=
67 /// A list of all .swiftinterface files referenced by the debug
68 /// info, mapping Module name to path on disk. The entries need to
69 /// be uniqued and sorted and there are only few entries expected
70 /// per compile unit, which is why this is a std::map.
71 /// this is dsymutil specific fag.
73 /// (it might be called asynchronously).
74 DWARFLinkerBase::SwiftInterfacesMapTy
*ParseableSwiftInterfaces
= nullptr;
76 /// A list of remappings to apply to file paths.
78 /// (it might be called asynchronously).
79 DWARFLinkerBase::ObjectPrefixMapTy
*ObjectPrefixMap
= nullptr;
82 class DWARFLinkerImpl
;
84 /// This class keeps data and services common for the whole linking process.
85 class LinkingGlobalData
{
86 friend DWARFLinkerImpl
;
89 /// Returns global per-thread allocator.
90 llvm::parallel::PerThreadBumpPtrAllocator
&getAllocator() {
94 /// Returns global string pool.
95 StringPool
&getStringPool() { return Strings
; }
97 /// Returns linking options.
98 const DWARFLinkerOptions
&getOptions() const { return Options
; }
100 /// Set warning handler.
101 void setWarningHandler(MessageHandlerTy Handler
) { WarningHandler
= Handler
; }
103 /// Set error handler.
104 void setErrorHandler(MessageHandlerTy Handler
) { ErrorHandler
= Handler
; }
107 void warn(const Twine
&Warning
, StringRef Context
,
108 const DWARFDie
*DIE
= nullptr) {
110 (WarningHandler
)(Warning
, Context
, DIE
);
114 void warn(Error Warning
, StringRef Context
, const DWARFDie
*DIE
= nullptr) {
115 handleAllErrors(std::move(Warning
), [&](ErrorInfoBase
&Info
) {
116 warn(Info
.message(), Context
, DIE
);
121 void error(const Twine
&Err
, StringRef Context
,
122 const DWARFDie
*DIE
= nullptr) {
124 (ErrorHandler
)(Err
, Context
, DIE
);
128 void error(Error Err
, StringRef Context
, const DWARFDie
*DIE
= nullptr) {
129 handleAllErrors(std::move(Err
), [&](ErrorInfoBase
&Info
) {
130 error(Info
.message(), Context
, DIE
);
134 /// Set target triple.
135 void setTargetTriple(const Triple
&TargetTriple
) {
136 this->TargetTriple
= TargetTriple
;
139 /// Optionally return target triple.
140 std::optional
<std::reference_wrapper
<const Triple
>> getTargetTriple() {
142 return std::cref(*TargetTriple
);
148 llvm::parallel::PerThreadBumpPtrAllocator Allocator
;
150 DWARFLinkerOptions Options
;
151 MessageHandlerTy WarningHandler
;
152 MessageHandlerTy ErrorHandler
;
154 /// Triple for output data. May be not set if generation of output
155 /// data is not requested.
156 std::optional
<Triple
> TargetTriple
;
159 } // end of namespace parallel
160 } // end of namespace dwarf_linker
161 } // end of namespace llvm
163 #endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H