| //===- DWARFLinkerGlobalData.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_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H |
| #define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H |
| |
| #include "TypePool.h" |
| #include "llvm/DWARFLinker/Parallel/DWARFLinker.h" |
| #include "llvm/DWARFLinker/StringPool.h" |
| #include "llvm/Support/PerThreadBumpPtrAllocator.h" |
| |
| namespace llvm { |
| |
| class DWARFDie; |
| |
| namespace dwarf_linker { |
| namespace parallel { |
| |
| using MessageHandlerTy = std::function<void( |
| const Twine &Warning, StringRef Context, const DWARFDie *DIE)>; |
| |
| /// linking options |
| struct DWARFLinkerOptions { |
| /// DWARF version for the output. |
| uint16_t TargetDWARFVersion = 0; |
| |
| /// Generate processing log to the standard output. |
| bool Verbose = false; |
| |
| /// Print statistics. |
| bool Statistics = false; |
| |
| /// Verify the input DWARF. |
| bool VerifyInputDWARF = false; |
| |
| /// Do not unique types according to ODR |
| bool NoODR = false; |
| |
| /// Update index tables. |
| bool UpdateIndexTablesOnly = false; |
| |
| /// Whether we want a static variable to force us to keep its enclosing |
| /// function. |
| bool KeepFunctionForStatic = false; |
| |
| /// Allow to generate valid, but non deterministic output. |
| bool AllowNonDeterministicOutput = false; |
| |
| /// Number of threads. |
| unsigned Threads = 1; |
| |
| /// The accelerator table kinds |
| SmallVector<DWARFLinkerBase::AccelTableKind, 1> AccelTables; |
| |
| /// Prepend path for the clang modules. |
| std::string PrependPath; |
| |
| /// input verification handler(it might be called asynchronously). |
| DWARFLinkerBase::InputVerificationHandlerTy InputVerificationHandler = |
| nullptr; |
| |
| /// A list of all .swiftinterface files referenced by the debug |
| /// info, mapping Module name to path on disk. The entries need to |
| /// be uniqued and sorted and there are only few entries expected |
| /// per compile unit, which is why this is a std::map. |
| /// this is dsymutil specific fag. |
| /// |
| /// (it might be called asynchronously). |
| DWARFLinkerBase::SwiftInterfacesMapTy *ParseableSwiftInterfaces = nullptr; |
| |
| /// A list of remappings to apply to file paths. |
| /// |
| /// (it might be called asynchronously). |
| DWARFLinkerBase::ObjectPrefixMapTy *ObjectPrefixMap = nullptr; |
| }; |
| |
| class DWARFLinkerImpl; |
| |
| /// This class keeps data and services common for the whole linking process. |
| class LinkingGlobalData { |
| friend DWARFLinkerImpl; |
| |
| public: |
| /// Returns global per-thread allocator. |
| llvm::parallel::PerThreadBumpPtrAllocator &getAllocator() { |
| return Allocator; |
| } |
| |
| /// Returns global string pool. |
| StringPool &getStringPool() { return Strings; } |
| |
| /// Returns linking options. |
| const DWARFLinkerOptions &getOptions() const { return Options; } |
| |
| /// Set warning handler. |
| void setWarningHandler(MessageHandlerTy Handler) { WarningHandler = Handler; } |
| |
| /// Set error handler. |
| void setErrorHandler(MessageHandlerTy Handler) { ErrorHandler = Handler; } |
| |
| /// Report warning. |
| void warn(const Twine &Warning, StringRef Context, |
| const DWARFDie *DIE = nullptr) { |
| if (WarningHandler) |
| (WarningHandler)(Warning, Context, DIE); |
| } |
| |
| /// Report warning. |
| void warn(Error Warning, StringRef Context, const DWARFDie *DIE = nullptr) { |
| handleAllErrors(std::move(Warning), [&](ErrorInfoBase &Info) { |
| warn(Info.message(), Context, DIE); |
| }); |
| } |
| |
| /// Report error. |
| void error(const Twine &Err, StringRef Context, |
| const DWARFDie *DIE = nullptr) { |
| if (ErrorHandler) |
| (ErrorHandler)(Err, Context, DIE); |
| } |
| |
| /// Report error. |
| void error(Error Err, StringRef Context, const DWARFDie *DIE = nullptr) { |
| handleAllErrors(std::move(Err), [&](ErrorInfoBase &Info) { |
| error(Info.message(), Context, DIE); |
| }); |
| } |
| |
| /// Set target triple. |
| void setTargetTriple(const Triple &TargetTriple) { |
| this->TargetTriple = TargetTriple; |
| } |
| |
| /// Optionally return target triple. |
| std::optional<std::reference_wrapper<const Triple>> getTargetTriple() { |
| if (TargetTriple) |
| return std::cref(*TargetTriple); |
| |
| return std::nullopt; |
| } |
| |
| protected: |
| llvm::parallel::PerThreadBumpPtrAllocator Allocator; |
| StringPool Strings; |
| DWARFLinkerOptions Options; |
| MessageHandlerTy WarningHandler; |
| MessageHandlerTy ErrorHandler; |
| |
| /// Triple for output data. May be not set if generation of output |
| /// data is not requested. |
| std::optional<Triple> TargetTriple; |
| }; |
| |
| } // end of namespace parallel |
| } // end of namespace dwarf_linker |
| } // end of namespace llvm |
| |
| #endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H |