1*1db9f3b2SDimitry Andric //===- DWARFLinkerGlobalData.h ----------------------------------*- C++ -*-===// 2*1db9f3b2SDimitry Andric // 3*1db9f3b2SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*1db9f3b2SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*1db9f3b2SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*1db9f3b2SDimitry Andric // 7*1db9f3b2SDimitry Andric //===----------------------------------------------------------------------===// 8*1db9f3b2SDimitry Andric 9*1db9f3b2SDimitry Andric #ifndef LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H 10*1db9f3b2SDimitry Andric #define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H 11*1db9f3b2SDimitry Andric 12*1db9f3b2SDimitry Andric #include "TypePool.h" 13*1db9f3b2SDimitry Andric #include "llvm/DWARFLinker/Parallel/DWARFLinker.h" 14*1db9f3b2SDimitry Andric #include "llvm/DWARFLinker/StringPool.h" 15*1db9f3b2SDimitry Andric #include "llvm/Support/PerThreadBumpPtrAllocator.h" 16*1db9f3b2SDimitry Andric 17*1db9f3b2SDimitry Andric namespace llvm { 18*1db9f3b2SDimitry Andric 19*1db9f3b2SDimitry Andric class DWARFDie; 20*1db9f3b2SDimitry Andric 21*1db9f3b2SDimitry Andric namespace dwarf_linker { 22*1db9f3b2SDimitry Andric namespace parallel { 23*1db9f3b2SDimitry Andric 24*1db9f3b2SDimitry Andric using TranslatorFuncTy = std::function<StringRef(StringRef)>; 25*1db9f3b2SDimitry Andric using MessageHandlerTy = std::function<void( 26*1db9f3b2SDimitry Andric const Twine &Warning, StringRef Context, const DWARFDie *DIE)>; 27*1db9f3b2SDimitry Andric 28*1db9f3b2SDimitry Andric /// linking options 29*1db9f3b2SDimitry Andric struct DWARFLinkerOptions { 30*1db9f3b2SDimitry Andric /// DWARF version for the output. 31*1db9f3b2SDimitry Andric uint16_t TargetDWARFVersion = 0; 32*1db9f3b2SDimitry Andric 33*1db9f3b2SDimitry Andric /// Generate processing log to the standard output. 34*1db9f3b2SDimitry Andric bool Verbose = false; 35*1db9f3b2SDimitry Andric 36*1db9f3b2SDimitry Andric /// Print statistics. 37*1db9f3b2SDimitry Andric bool Statistics = false; 38*1db9f3b2SDimitry Andric 39*1db9f3b2SDimitry Andric /// Verify the input DWARF. 40*1db9f3b2SDimitry Andric bool VerifyInputDWARF = false; 41*1db9f3b2SDimitry Andric 42*1db9f3b2SDimitry Andric /// Do not emit output. 43*1db9f3b2SDimitry Andric bool NoOutput = false; 44*1db9f3b2SDimitry Andric 45*1db9f3b2SDimitry Andric /// Do not unique types according to ODR 46*1db9f3b2SDimitry Andric bool NoODR = false; 47*1db9f3b2SDimitry Andric 48*1db9f3b2SDimitry Andric /// Update index tables. 49*1db9f3b2SDimitry Andric bool UpdateIndexTablesOnly = false; 50*1db9f3b2SDimitry Andric 51*1db9f3b2SDimitry Andric /// Whether we want a static variable to force us to keep its enclosing 52*1db9f3b2SDimitry Andric /// function. 53*1db9f3b2SDimitry Andric bool KeepFunctionForStatic = false; 54*1db9f3b2SDimitry Andric 55*1db9f3b2SDimitry Andric /// Allow to generate valid, but non deterministic output. 56*1db9f3b2SDimitry Andric bool AllowNonDeterministicOutput = false; 57*1db9f3b2SDimitry Andric 58*1db9f3b2SDimitry Andric /// Number of threads. 59*1db9f3b2SDimitry Andric unsigned Threads = 1; 60*1db9f3b2SDimitry Andric 61*1db9f3b2SDimitry Andric /// The accelerator table kinds 62*1db9f3b2SDimitry Andric SmallVector<DWARFLinker::AccelTableKind, 1> AccelTables; 63*1db9f3b2SDimitry Andric 64*1db9f3b2SDimitry Andric /// Prepend path for the clang modules. 65*1db9f3b2SDimitry Andric std::string PrependPath; 66*1db9f3b2SDimitry Andric 67*1db9f3b2SDimitry Andric /// input verification handler(it might be called asynchronously). 68*1db9f3b2SDimitry Andric DWARFLinker::InputVerificationHandlerTy InputVerificationHandler = nullptr; 69*1db9f3b2SDimitry Andric 70*1db9f3b2SDimitry Andric /// A list of all .swiftinterface files referenced by the debug 71*1db9f3b2SDimitry Andric /// info, mapping Module name to path on disk. The entries need to 72*1db9f3b2SDimitry Andric /// be uniqued and sorted and there are only few entries expected 73*1db9f3b2SDimitry Andric /// per compile unit, which is why this is a std::map. 74*1db9f3b2SDimitry Andric /// this is dsymutil specific fag. 75*1db9f3b2SDimitry Andric /// 76*1db9f3b2SDimitry Andric /// (it might be called asynchronously). 77*1db9f3b2SDimitry Andric DWARFLinker::SwiftInterfacesMapTy *ParseableSwiftInterfaces = nullptr; 78*1db9f3b2SDimitry Andric 79*1db9f3b2SDimitry Andric /// A list of remappings to apply to file paths. 80*1db9f3b2SDimitry Andric /// 81*1db9f3b2SDimitry Andric /// (it might be called asynchronously). 82*1db9f3b2SDimitry Andric DWARFLinker::ObjectPrefixMapTy *ObjectPrefixMap = nullptr; 83*1db9f3b2SDimitry Andric }; 84*1db9f3b2SDimitry Andric 85*1db9f3b2SDimitry Andric class DWARFLinkerImpl; 86*1db9f3b2SDimitry Andric 87*1db9f3b2SDimitry Andric /// This class keeps data and services common for the whole linking process. 88*1db9f3b2SDimitry Andric class LinkingGlobalData { 89*1db9f3b2SDimitry Andric friend DWARFLinkerImpl; 90*1db9f3b2SDimitry Andric 91*1db9f3b2SDimitry Andric public: 92*1db9f3b2SDimitry Andric /// Returns global per-thread allocator. 93*1db9f3b2SDimitry Andric llvm::parallel::PerThreadBumpPtrAllocator &getAllocator() { 94*1db9f3b2SDimitry Andric return Allocator; 95*1db9f3b2SDimitry Andric } 96*1db9f3b2SDimitry Andric 97*1db9f3b2SDimitry Andric /// Returns global string pool. 98*1db9f3b2SDimitry Andric StringPool &getStringPool() { return Strings; } 99*1db9f3b2SDimitry Andric 100*1db9f3b2SDimitry Andric /// Set translation function. 101*1db9f3b2SDimitry Andric void setTranslator(TranslatorFuncTy Translator) { 102*1db9f3b2SDimitry Andric this->Translator = Translator; 103*1db9f3b2SDimitry Andric } 104*1db9f3b2SDimitry Andric 105*1db9f3b2SDimitry Andric /// Translate specified string. 106*1db9f3b2SDimitry Andric StringRef translateString(StringRef String) { 107*1db9f3b2SDimitry Andric if (Translator) 108*1db9f3b2SDimitry Andric return Translator(String); 109*1db9f3b2SDimitry Andric 110*1db9f3b2SDimitry Andric return String; 111*1db9f3b2SDimitry Andric } 112*1db9f3b2SDimitry Andric 113*1db9f3b2SDimitry Andric /// Returns linking options. 114*1db9f3b2SDimitry Andric const DWARFLinkerOptions &getOptions() const { return Options; } 115*1db9f3b2SDimitry Andric 116*1db9f3b2SDimitry Andric /// Set warning handler. 117*1db9f3b2SDimitry Andric void setWarningHandler(MessageHandlerTy Handler) { WarningHandler = Handler; } 118*1db9f3b2SDimitry Andric 119*1db9f3b2SDimitry Andric /// Set error handler. 120*1db9f3b2SDimitry Andric void setErrorHandler(MessageHandlerTy Handler) { ErrorHandler = Handler; } 121*1db9f3b2SDimitry Andric 122*1db9f3b2SDimitry Andric /// Report warning. 123*1db9f3b2SDimitry Andric void warn(const Twine &Warning, StringRef Context, 124*1db9f3b2SDimitry Andric const DWARFDie *DIE = nullptr) { 125*1db9f3b2SDimitry Andric if (WarningHandler) 126*1db9f3b2SDimitry Andric (WarningHandler)(Warning, Context, DIE); 127*1db9f3b2SDimitry Andric } 128*1db9f3b2SDimitry Andric 129*1db9f3b2SDimitry Andric /// Report warning. 130*1db9f3b2SDimitry Andric void warn(Error Warning, StringRef Context, const DWARFDie *DIE = nullptr) { 131*1db9f3b2SDimitry Andric handleAllErrors(std::move(Warning), [&](ErrorInfoBase &Info) { 132*1db9f3b2SDimitry Andric warn(Info.message(), Context, DIE); 133*1db9f3b2SDimitry Andric }); 134*1db9f3b2SDimitry Andric } 135*1db9f3b2SDimitry Andric 136*1db9f3b2SDimitry Andric /// Report error. 137*1db9f3b2SDimitry Andric void error(const Twine &Err, StringRef Context, 138*1db9f3b2SDimitry Andric const DWARFDie *DIE = nullptr) { 139*1db9f3b2SDimitry Andric if (ErrorHandler) 140*1db9f3b2SDimitry Andric (ErrorHandler)(Err, Context, DIE); 141*1db9f3b2SDimitry Andric } 142*1db9f3b2SDimitry Andric 143*1db9f3b2SDimitry Andric /// Report error. 144*1db9f3b2SDimitry Andric void error(Error Err, StringRef Context, const DWARFDie *DIE = nullptr) { 145*1db9f3b2SDimitry Andric handleAllErrors(std::move(Err), [&](ErrorInfoBase &Info) { 146*1db9f3b2SDimitry Andric error(Info.message(), Context, DIE); 147*1db9f3b2SDimitry Andric }); 148*1db9f3b2SDimitry Andric } 149*1db9f3b2SDimitry Andric 150*1db9f3b2SDimitry Andric protected: 151*1db9f3b2SDimitry Andric llvm::parallel::PerThreadBumpPtrAllocator Allocator; 152*1db9f3b2SDimitry Andric StringPool Strings; 153*1db9f3b2SDimitry Andric TranslatorFuncTy Translator; 154*1db9f3b2SDimitry Andric DWARFLinkerOptions Options; 155*1db9f3b2SDimitry Andric MessageHandlerTy WarningHandler; 156*1db9f3b2SDimitry Andric MessageHandlerTy ErrorHandler; 157*1db9f3b2SDimitry Andric }; 158*1db9f3b2SDimitry Andric 159*1db9f3b2SDimitry Andric } // end of namespace parallel 160*1db9f3b2SDimitry Andric } // end of namespace dwarf_linker 161*1db9f3b2SDimitry Andric } // end of namespace llvm 162*1db9f3b2SDimitry Andric 163*1db9f3b2SDimitry Andric #endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERGLOBALDATA_H 164