1 //===- tools/dsymutil/LinkUtils.h - Dwarf linker utilities ------*- 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_TOOLS_DSYMUTIL_LINKOPTIONS_H 10 #define LLVM_TOOLS_DSYMUTIL_LINKOPTIONS_H 11 12 #include "llvm/ADT/Twine.h" 13 #include "llvm/Remarks/RemarkFormat.h" 14 #include "llvm/Support/VirtualFileSystem.h" 15 #include "llvm/Support/WithColor.h" 16 17 #include "llvm/DWARFLinker/Classic/DWARFLinker.h" 18 #include "llvm/DWARFLinker/Classic/DWARFStreamer.h" 19 #include <string> 20 21 namespace llvm { 22 namespace dsymutil { 23 24 enum class DsymutilAccelTableKind : uint8_t { 25 None, 26 Apple, ///< .apple_names, .apple_namespaces, .apple_types, .apple_objc. 27 Dwarf, ///< DWARF v5 .debug_names. 28 Default, ///< Dwarf for DWARF5 or later, Apple otherwise. 29 Pub, ///< .debug_pubnames, .debug_pubtypes 30 }; 31 32 enum class DsymutilDWARFLinkerType : uint8_t { 33 Classic, /// Classic implementation of DWARFLinker. 34 Parallel /// Implementation of DWARFLinker heavily using parallel execution. 35 }; 36 37 struct LinkOptions { 38 /// Verbosity 39 bool Verbose = false; 40 41 /// Quiet 42 bool Quiet = false; 43 44 /// Statistics 45 bool Statistics = false; 46 47 /// Verify the input DWARF. 48 bool VerifyInputDWARF = false; 49 50 /// Skip emitting output 51 bool NoOutput = false; 52 53 /// Do not unique types according to ODR 54 bool NoODR = false; 55 56 /// Update 57 bool Update = false; 58 59 /// Do not check swiftmodule timestamp 60 bool NoTimestamp = false; 61 62 /// Whether we want a static variable to force us to keep its enclosing 63 /// function. 64 bool KeepFunctionForStatic = false; 65 66 /// Type of DWARFLinker to use. 67 DsymutilDWARFLinkerType DWARFLinkerType = DsymutilDWARFLinkerType::Classic; 68 69 /// Use a 64-bit header when emitting universal binaries. 70 bool Fat64 = false; 71 72 /// Number of threads. 73 unsigned Threads = 1; 74 75 // Output file type. 76 dwarf_linker::DWARFLinkerBase::OutputFileType FileType = 77 dwarf_linker::DWARFLinkerBase::OutputFileType::Object; 78 79 /// The accelerator table kind 80 DsymutilAccelTableKind TheAccelTableKind; 81 82 /// -oso-prepend-path 83 std::string PrependPath; 84 85 /// The -object-prefix-map. 86 std::map<std::string, std::string> ObjectPrefixMap; 87 88 /// The Resources directory in the .dSYM bundle. 89 std::optional<std::string> ResourceDir; 90 91 /// Virtual File System. 92 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = 93 vfs::getRealFileSystem(); 94 95 /// -build-variant-suffix. 96 std::string BuildVariantSuffix; 97 98 /// Paths where to search for the .dSYM files of merged libraries. 99 std::vector<std::string> DSYMSearchPaths; 100 101 /// Fields used for linking and placing remarks into the .dSYM bundle. 102 /// @{ 103 104 /// Number of debug maps processed in total. 105 unsigned NumDebugMaps = 0; 106 107 /// -remarks-prepend-path: prepend a path to all the external remark file 108 /// paths found in remark metadata. 109 std::string RemarksPrependPath; 110 111 /// The output format of the remarks. 112 remarks::Format RemarksFormat = remarks::Format::Bitstream; 113 114 /// Whether all remarks should be kept or only remarks with valid debug 115 /// locations. 116 bool RemarksKeepAll = true; 117 /// @} 118 119 LinkOptions() = default; 120 }; 121 122 inline void warn(Twine Warning, Twine Context = {}) { 123 WithColor::warning() << Warning + "\n"; 124 if (!Context.isTriviallyEmpty()) 125 WithColor::note() << Twine("while processing ") + Context + "\n"; 126 } 127 128 inline bool error(Twine Error, Twine Context = {}) { 129 WithColor::error() << Error + "\n"; 130 if (!Context.isTriviallyEmpty()) 131 WithColor::note() << Twine("while processing ") + Context + "\n"; 132 return false; 133 } 134 135 } // end namespace dsymutil 136 } // end namespace llvm 137 138 #endif // LLVM_TOOLS_DSYMUTIL_LINKOPTIONS_H 139