//===- 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; /// 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 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> 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 TargetTriple; }; } // end of namespace parallel } // end of namespace dwarf_linker } // end of namespace llvm #endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H