xref: /freebsd/contrib/llvm-project/llvm/include/llvm/DWARFLinker/DWARFLinkerBase.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 //===- DWARFLinkerBase.h ----------------------------------------*- C++ -*-===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_DWARFLINKER_DWARFLINKERBASE_H
10 #define LLVM_DWARFLINKER_DWARFLINKERBASE_H
11 #include "AddressesMap.h"
12 #include "DWARFFile.h"
13 #include "llvm/ADT/AddressRanges.h"
14 #include "llvm/ADT/DenseMap.h"
15 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
16 #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
17 #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
18 #include "llvm/DebugInfo/DWARF/DWARFDie.h"
19 #include "llvm/DebugInfo/DWARF/DWARFExpression.h"
20 #include <map>
21 namespace llvm {
22 class DWARFUnit;
23 
24 namespace dwarf_linker {
25 
26 /// List of tracked debug tables.
27 enum class DebugSectionKind : uint8_t {
28   DebugInfo = 0,
29   DebugLine,
30   DebugFrame,
31   DebugRange,
32   DebugRngLists,
33   DebugLoc,
34   DebugLocLists,
35   DebugARanges,
36   DebugAbbrev,
37   DebugMacinfo,
38   DebugMacro,
39   DebugAddr,
40   DebugStr,
41   DebugLineStr,
42   DebugStrOffsets,
43   DebugPubNames,
44   DebugPubTypes,
45   DebugNames,
46   AppleNames,
47   AppleNamespaces,
48   AppleObjC,
49   AppleTypes,
50   NumberOfEnumEntries // must be last
51 };
52 
53 static constexpr size_t SectionKindsNum =
54     static_cast<size_t>(DebugSectionKind::NumberOfEnumEntries);
55 
56 static constexpr StringLiteral SectionNames[SectionKindsNum] = {
57     "debug_info",     "debug_line",     "debug_frame",       "debug_ranges",
58     "debug_rnglists", "debug_loc",      "debug_loclists",    "debug_aranges",
59     "debug_abbrev",   "debug_macinfo",  "debug_macro",       "debug_addr",
60     "debug_str",      "debug_line_str", "debug_str_offsets", "debug_pubnames",
61     "debug_pubtypes", "debug_names",    "apple_names",       "apple_namespac",
62     "apple_objc",     "apple_types"};
63 
64 /// Return the name of the section.
65 static constexpr const StringLiteral &
getSectionName(DebugSectionKind SectionKind)66 getSectionName(DebugSectionKind SectionKind) {
67   return SectionNames[static_cast<uint8_t>(SectionKind)];
68 }
69 
70 /// Recognise the table name and match it with the DebugSectionKind.
71 std::optional<DebugSectionKind> parseDebugTableName(StringRef Name);
72 
73 /// The base interface for DWARFLinker implementations.
74 class DWARFLinkerBase {
75 public:
76   virtual ~DWARFLinkerBase() = default;
77   using MessageHandlerTy = std::function<void(
78       const Twine &Warning, StringRef Context, const DWARFDie *DIE)>;
79   using ObjFileLoaderTy = std::function<ErrorOr<DWARFFile &>(
80       StringRef ContainerName, StringRef Path)>;
81   using InputVerificationHandlerTy =
82       std::function<void(const DWARFFile &File, llvm::StringRef Output)>;
83   using ObjectPrefixMapTy = std::map<std::string, std::string>;
84   using CompileUnitHandlerTy = function_ref<void(const DWARFUnit &Unit)>;
85   using SwiftInterfacesMapTy = std::map<std::string, std::string>;
86   /// Type of output file.
87   enum class OutputFileType : uint8_t {
88     Object,
89     Assembly,
90   };
91   /// The kind of accelerator tables to be emitted.
92   enum class AccelTableKind : uint8_t {
93     Apple,     ///< .apple_names, .apple_namespaces, .apple_types, .apple_objc.
94     Pub,       ///< .debug_pubnames, .debug_pubtypes
95     DebugNames ///< .debug_names.
96   };
97   /// Add an object file to be linked. Pre-load compile unit die. Call
98   /// \p OnCUDieLoaded for each compile unit die. If \p File has reference to
99   /// a Clang module and UpdateIndexTablesOnly == false then the module is be
100   /// pre-loaded by \p Loader.
101   ///
102   /// \pre a call to setNoODR(true) and/or setUpdateIndexTablesOnly(bool Update)
103   ///      must be made when required.
104   virtual void addObjectFile(
105       DWARFFile &File, ObjFileLoaderTy Loader = nullptr,
106       CompileUnitHandlerTy OnCUDieLoaded = [](const DWARFUnit &) {}) = 0;
107   /// Link the debug info for all object files added through calls to
108   /// addObjectFile.
109   virtual Error link() = 0;
110   /// A number of methods setting various linking options:
111   /// Enable logging to standard output.
112   virtual void setVerbosity(bool Verbose) = 0;
113   /// Print statistics to standard output.
114   virtual void setStatistics(bool Statistics) = 0;
115   /// Verify the input DWARF.
116   virtual void setVerifyInputDWARF(bool Verify) = 0;
117   /// Do not unique types according to ODR.
118   virtual void setNoODR(bool NoODR) = 0;
119   /// Update index tables only (do not modify rest of DWARF).
120   virtual void setUpdateIndexTablesOnly(bool Update) = 0;
121   /// Allows generating non-deterministic output in exchange for more
122   /// parallelism.
123   virtual void setAllowNonDeterministicOutput(bool) = 0;
124   /// Set whether to keep the enclosing function for a static variable.
125   virtual void setKeepFunctionForStatic(bool KeepFunctionForStatic) = 0;
126   /// Use specified number of threads for parallel files linking.
127   virtual void setNumThreads(unsigned NumThreads) = 0;
128   /// Add kind of accelerator tables to be generated.
129   virtual void addAccelTableKind(AccelTableKind Kind) = 0;
130   /// Set prepend path for clang modules.
131   virtual void setPrependPath(StringRef Ppath) = 0;
132   /// Set estimated objects files amount, for preliminary data allocation.
133   virtual void setEstimatedObjfilesAmount(unsigned ObjFilesNum) = 0;
134   /// Set verification handler used to report verification errors.
135   virtual void
136   setInputVerificationHandler(InputVerificationHandlerTy Handler) = 0;
137   /// Set map for Swift interfaces.
138   virtual void setSwiftInterfacesMap(SwiftInterfacesMapTy *Map) = 0;
139   /// Set prefix map for objects.
140   virtual void setObjectPrefixMap(ObjectPrefixMapTy *Map) = 0;
141   /// Set target DWARF version.
142   virtual Error setTargetDWARFVersion(uint16_t TargetDWARFVersion) = 0;
143 };
144 } // end namespace dwarf_linker
145 } // end namespace llvm
146 #endif // LLVM_DWARFLINKER_DWARFLINKERBASE_H
147