clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
147 lines
5.7 KiB
C++
147 lines
5.7 KiB
C++
//===- 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 <map>
|
|
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<size_t>(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<uint8_t>(SectionKind)];
|
|
}
|
|
|
|
/// Recognise the table name and match it with the DebugSectionKind.
|
|
std::optional<DebugSectionKind> parseDebugTableName(StringRef Name);
|
|
|
|
/// The base interface for DWARFLinker implementations.
|
|
class DWARFLinkerBase {
|
|
public:
|
|
virtual ~DWARFLinkerBase() = default;
|
|
using MessageHandlerTy = std::function<void(
|
|
const Twine &Warning, StringRef Context, const DWARFDie *DIE)>;
|
|
using ObjFileLoaderTy = std::function<ErrorOr<DWARFFile &>(
|
|
StringRef ContainerName, StringRef Path)>;
|
|
using InputVerificationHandlerTy =
|
|
std::function<void(const DWARFFile &File, llvm::StringRef Output)>;
|
|
using ObjectPrefixMapTy = std::map<std::string, std::string>;
|
|
using CompileUnitHandlerTy = function_ref<void(const DWARFUnit &Unit)>;
|
|
using SwiftInterfacesMapTy = std::map<std::string, std::string>;
|
|
/// 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
|