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 & 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