//===- DWARFLinkerBase.h ----------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_DWARFLINKER_DWARFLINKERBASE_H #define LLVM_DWARFLINKER_DWARFLINKERBASE_H #include "AddressesMap.h" #include "DWARFFile.h" #include "llvm/ADT/AddressRanges.h" #include "llvm/ADT/DenseMap.h" #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h" #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h" #include "llvm/DebugInfo/DWARF/DWARFDie.h" #include "llvm/DebugInfo/DWARF/DWARFExpression.h" #include namespace llvm { class DWARFUnit; namespace dwarf_linker { /// List of tracked debug tables. enum class DebugSectionKind : uint8_t { DebugInfo = 0, DebugLine, DebugFrame, DebugRange, DebugRngLists, DebugLoc, DebugLocLists, DebugARanges, DebugAbbrev, DebugMacinfo, DebugMacro, DebugAddr, DebugStr, DebugLineStr, DebugStrOffsets, DebugPubNames, DebugPubTypes, DebugNames, AppleNames, AppleNamespaces, AppleObjC, AppleTypes, NumberOfEnumEntries // must be last }; static constexpr size_t SectionKindsNum = static_cast(DebugSectionKind::NumberOfEnumEntries); static constexpr StringLiteral SectionNames[SectionKindsNum] = { "debug_info", "debug_line", "debug_frame", "debug_ranges", "debug_rnglists", "debug_loc", "debug_loclists", "debug_aranges", "debug_abbrev", "debug_macinfo", "debug_macro", "debug_addr", "debug_str", "debug_line_str", "debug_str_offsets", "debug_pubnames", "debug_pubtypes", "debug_names", "apple_names", "apple_namespac", "apple_objc", "apple_types"}; /// Return the name of the section. static constexpr const StringLiteral & getSectionName(DebugSectionKind SectionKind) { return SectionNames[static_cast(SectionKind)]; } /// Recognise the table name and match it with the DebugSectionKind. std::optional parseDebugTableName(StringRef Name); /// The base interface for DWARFLinker implementations. class DWARFLinkerBase { public: virtual ~DWARFLinkerBase() = default; using MessageHandlerTy = std::function; using ObjFileLoaderTy = std::function( StringRef ContainerName, StringRef Path)>; using InputVerificationHandlerTy = std::function; using ObjectPrefixMapTy = std::map; using CompileUnitHandlerTy = function_ref; using TranslatorFuncTy = std::function; using SwiftInterfacesMapTy = std::map; /// Type of output file. enum class OutputFileType : uint8_t { Object, Assembly, }; /// The kind of accelerator tables to be emitted. enum class AccelTableKind : uint8_t { Apple, ///< .apple_names, .apple_namespaces, .apple_types, .apple_objc. Pub, ///< .debug_pubnames, .debug_pubtypes DebugNames ///< .debug_names. }; /// Add an object file to be linked. Pre-load compile unit die. Call /// \p OnCUDieLoaded for each compile unit die. If \p File has reference to /// a Clang module and UpdateIndexTablesOnly == false then the module is be /// pre-loaded by \p Loader. /// /// \pre a call to setNoODR(true) and/or setUpdateIndexTablesOnly(bool Update) /// must be made when required. virtual void addObjectFile( DWARFFile &File, ObjFileLoaderTy Loader = nullptr, CompileUnitHandlerTy OnCUDieLoaded = [](const DWARFUnit &) {}) = 0; /// Link the debug info for all object files added through calls to /// addObjectFile. virtual Error link() = 0; /// A number of methods setting various linking options: /// Enable logging to standard output. virtual void setVerbosity(bool Verbose) = 0; /// Print statistics to standard output. virtual void setStatistics(bool Statistics) = 0; /// Verify the input DWARF. virtual void setVerifyInputDWARF(bool Verify) = 0; /// Do not unique types according to ODR. virtual void setNoODR(bool NoODR) = 0; /// Update index tables only (do not modify rest of DWARF). virtual void setUpdateIndexTablesOnly(bool Update) = 0; /// Allows generating non-deterministic output in exchange for more /// parallelism. virtual void setAllowNonDeterministicOutput(bool) = 0; /// Set whether to keep the enclosing function for a static variable. virtual void setKeepFunctionForStatic(bool KeepFunctionForStatic) = 0; /// Use specified number of threads for parallel files linking. virtual void setNumThreads(unsigned NumThreads) = 0; /// Add kind of accelerator tables to be generated. virtual void addAccelTableKind(AccelTableKind Kind) = 0; /// Set prepend path for clang modules. virtual void setPrependPath(StringRef Ppath) = 0; /// Set estimated objects files amount, for preliminary data allocation. virtual void setEstimatedObjfilesAmount(unsigned ObjFilesNum) = 0; /// Set verification handler used to report verification errors. virtual void setInputVerificationHandler(InputVerificationHandlerTy Handler) = 0; /// Set map for Swift interfaces. virtual void setSwiftInterfacesMap(SwiftInterfacesMapTy *Map) = 0; /// Set prefix map for objects. virtual void setObjectPrefixMap(ObjectPrefixMapTy *Map) = 0; /// Set target DWARF version. virtual Error setTargetDWARFVersion(uint16_t TargetDWARFVersion) = 0; }; } // end namespace dwarf_linker } // end namespace llvm #endif // LLVM_DWARFLINKER_DWARFLINKERBASE_H