209 lines · cpp
1//===-- MCTargetOptionsCommandFlags.cpp -----------------------*- 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// This file contains machine code-specific flags that are shared between10// different command line tools.11//12//===----------------------------------------------------------------------===//13 14#include "llvm/MC/MCTargetOptionsCommandFlags.h"15#include "llvm/MC/MCTargetOptions.h"16#include "llvm/Support/CommandLine.h"17 18using namespace llvm;19 20#define MCOPT(TY, NAME) \21 static cl::opt<TY> *NAME##View; \22 TY llvm::mc::get##NAME() { \23 assert(NAME##View && "RegisterMCTargetOptionsFlags not created."); \24 return *NAME##View; \25 }26 27#define MCSTROPT(NAME) \28 static cl::opt<std::string> *NAME##View; \29 StringRef llvm::mc::get##NAME() { \30 assert(NAME##View && "RegisterMCTargetOptionsFlags not created."); \31 return *NAME##View; \32 }33 34#define MCOPT_EXP(TY, NAME) \35 MCOPT(TY, NAME) \36 std::optional<TY> llvm::mc::getExplicit##NAME() { \37 if (NAME##View->getNumOccurrences()) { \38 TY res = *NAME##View; \39 return res; \40 } \41 return std::nullopt; \42 }43 44MCOPT_EXP(bool, RelaxAll)45MCOPT(bool, IncrementalLinkerCompatible)46MCOPT(bool, FDPIC)47MCOPT(int, DwarfVersion)48MCOPT(bool, Dwarf64)49MCOPT(EmitDwarfUnwindType, EmitDwarfUnwind)50MCOPT(bool, EmitCompactUnwindNonCanonical)51MCOPT(bool, EmitSFrameUnwind)52MCOPT(bool, ShowMCInst)53MCOPT(bool, FatalWarnings)54MCOPT(bool, NoWarn)55MCOPT(bool, NoDeprecatedWarn)56MCOPT(bool, NoTypeCheck)57MCOPT(bool, SaveTempLabels)58MCOPT(bool, Crel)59MCOPT(bool, ImplicitMapSyms)60MCOPT(bool, X86RelaxRelocations)61MCOPT(bool, X86Sse2Avx)62MCSTROPT(ABIName)63MCSTROPT(AsSecureLogFile)64 65llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() {66#define MCBINDOPT(NAME) \67 do { \68 NAME##View = std::addressof(NAME); \69 } while (0)70 71 static cl::opt<bool> RelaxAll(72 "mc-relax-all", cl::desc("When used with filetype=obj, relax all fixups "73 "in the emitted object file"));74 MCBINDOPT(RelaxAll);75 76 static cl::opt<bool> IncrementalLinkerCompatible(77 "incremental-linker-compatible",78 cl::desc(79 "When used with filetype=obj, "80 "emit an object file which can be used with an incremental linker"));81 MCBINDOPT(IncrementalLinkerCompatible);82 83 static cl::opt<bool> FDPIC("fdpic", cl::desc("Use the FDPIC ABI"));84 MCBINDOPT(FDPIC);85 86 static cl::opt<int> DwarfVersion("dwarf-version", cl::desc("Dwarf version"),87 cl::init(0));88 MCBINDOPT(DwarfVersion);89 90 static cl::opt<bool> Dwarf64(91 "dwarf64",92 cl::desc("Generate debugging info in the 64-bit DWARF format"));93 MCBINDOPT(Dwarf64);94 95 static cl::opt<EmitDwarfUnwindType> EmitDwarfUnwind(96 "emit-dwarf-unwind", cl::desc("Whether to emit DWARF EH frame entries."),97 cl::init(EmitDwarfUnwindType::Default),98 cl::values(clEnumValN(EmitDwarfUnwindType::Always, "always",99 "Always emit EH frame entries"),100 clEnumValN(EmitDwarfUnwindType::NoCompactUnwind,101 "no-compact-unwind",102 "Only emit EH frame entries when compact unwind is "103 "not available"),104 clEnumValN(EmitDwarfUnwindType::Default, "default",105 "Use target platform default")));106 MCBINDOPT(EmitDwarfUnwind);107 108 static cl::opt<bool> EmitCompactUnwindNonCanonical(109 "emit-compact-unwind-non-canonical",110 cl::desc(111 "Whether to try to emit Compact Unwind for non canonical entries."),112 cl::init(113 false)); // By default, use DWARF for non-canonical personalities.114 MCBINDOPT(EmitCompactUnwindNonCanonical);115 116 static cl::opt<bool> EmitSFrameUnwind(117 "gsframe", cl::desc("Whether to emit .sframe unwind sections."),118 cl::init(false));119 MCBINDOPT(EmitSFrameUnwind);120 121 static cl::opt<bool> ShowMCInst(122 "asm-show-inst",123 cl::desc("Emit internal instruction representation to assembly file"));124 MCBINDOPT(ShowMCInst);125 126 static cl::opt<bool> FatalWarnings("fatal-warnings",127 cl::desc("Treat warnings as errors"));128 MCBINDOPT(FatalWarnings);129 130 static cl::opt<bool> NoWarn("no-warn", cl::desc("Suppress all warnings"));131 static cl::alias NoWarnW("W", cl::desc("Alias for --no-warn"),132 cl::aliasopt(NoWarn));133 MCBINDOPT(NoWarn);134 135 static cl::opt<bool> NoDeprecatedWarn(136 "no-deprecated-warn", cl::desc("Suppress all deprecated warnings"));137 MCBINDOPT(NoDeprecatedWarn);138 139 static cl::opt<bool> NoTypeCheck(140 "no-type-check", cl::desc("Suppress type errors (Wasm)"));141 MCBINDOPT(NoTypeCheck);142 143 static cl::opt<bool> SaveTempLabels(144 "save-temp-labels", cl::desc("Don't discard temporary labels"));145 MCBINDOPT(SaveTempLabels);146 147 static cl::opt<bool> Crel("crel",148 cl::desc("Use CREL relocation format for ELF"));149 MCBINDOPT(Crel);150 151 static cl::opt<bool> ImplicitMapSyms(152 "implicit-mapsyms",153 cl::desc("Allow mapping symbol at section beginning to be implicit, "154 "lowering number of mapping symbols at the expense of some "155 "portability. Recommended for projects that can build all their "156 "object files using this option"));157 MCBINDOPT(ImplicitMapSyms);158 159 static cl::opt<bool> X86RelaxRelocations(160 "x86-relax-relocations",161 cl::desc("Emit GOTPCRELX/REX_GOTPCRELX/CODE_4_GOTPCRELX instead of "162 "GOTPCREL on x86-64 ELF"),163 cl::init(true));164 MCBINDOPT(X86RelaxRelocations);165 166 static cl::opt<bool> X86Sse2Avx(167 "x86-sse2avx", cl::desc("Specify that the assembler should encode SSE "168 "instructions with VEX prefix"));169 MCBINDOPT(X86Sse2Avx);170 171 static cl::opt<std::string> ABIName(172 "target-abi",173 cl::desc("The name of the ABI to be targeted from the backend."),174 cl::init(""));175 MCBINDOPT(ABIName);176 177 static cl::opt<std::string> AsSecureLogFile(178 "as-secure-log-file", cl::desc("As secure log file name"), cl::Hidden);179 MCBINDOPT(AsSecureLogFile);180 181#undef MCBINDOPT182}183 184MCTargetOptions llvm::mc::InitMCTargetOptionsFromFlags() {185 MCTargetOptions Options;186 Options.MCRelaxAll = getRelaxAll();187 Options.MCIncrementalLinkerCompatible = getIncrementalLinkerCompatible();188 Options.FDPIC = getFDPIC();189 Options.Dwarf64 = getDwarf64();190 Options.DwarfVersion = getDwarfVersion();191 Options.ShowMCInst = getShowMCInst();192 Options.ABIName = getABIName();193 Options.MCFatalWarnings = getFatalWarnings();194 Options.MCNoWarn = getNoWarn();195 Options.MCNoDeprecatedWarn = getNoDeprecatedWarn();196 Options.MCNoTypeCheck = getNoTypeCheck();197 Options.MCSaveTempLabels = getSaveTempLabels();198 Options.Crel = getCrel();199 Options.ImplicitMapSyms = getImplicitMapSyms();200 Options.X86RelaxRelocations = getX86RelaxRelocations();201 Options.X86Sse2Avx = getX86Sse2Avx();202 Options.EmitDwarfUnwind = getEmitDwarfUnwind();203 Options.EmitCompactUnwindNonCanonical = getEmitCompactUnwindNonCanonical();204 Options.EmitSFrameUnwind = getEmitSFrameUnwind();205 Options.AsSecureLogFile = getAsSecureLogFile();206 207 return Options;208}209