brintos

brintos / llvm-project-archived public Read only

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