1d4bcb45dSJez Ng //===-- MCTargetOptionsCommandFlags.cpp -----------------------*- C++ //-*-===// 2ac1d23edSserge-sans-paille // 3ac1d23edSserge-sans-paille // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4ac1d23edSserge-sans-paille // See https://llvm.org/LICENSE.txt for license information. 5ac1d23edSserge-sans-paille // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ac1d23edSserge-sans-paille // 7ac1d23edSserge-sans-paille //===----------------------------------------------------------------------===// 8ac1d23edSserge-sans-paille // 9ac1d23edSserge-sans-paille // This file contains machine code-specific flags that are shared between 10ac1d23edSserge-sans-paille // different command line tools. 11ac1d23edSserge-sans-paille // 12ac1d23edSserge-sans-paille //===----------------------------------------------------------------------===// 13ac1d23edSserge-sans-paille 14ac1d23edSserge-sans-paille #include "llvm/MC/MCTargetOptionsCommandFlags.h" 15f3b20c2aSSimon Pilgrim #include "llvm/MC/MCTargetOptions.h" 16f3b20c2aSSimon Pilgrim #include "llvm/Support/CommandLine.h" 17ac1d23edSserge-sans-paille 18ac1d23edSserge-sans-paille using namespace llvm; 19ac1d23edSserge-sans-paille 20ac1d23edSserge-sans-paille #define MCOPT(TY, NAME) \ 21ac1d23edSserge-sans-paille static cl::opt<TY> *NAME##View; \ 22ac1d23edSserge-sans-paille TY llvm::mc::get##NAME() { \ 23ac1d23edSserge-sans-paille assert(NAME##View && "RegisterMCTargetOptionsFlags not created."); \ 24ac1d23edSserge-sans-paille return *NAME##View; \ 25ac1d23edSserge-sans-paille } 26ac1d23edSserge-sans-paille 27ac1d23edSserge-sans-paille #define MCOPT_EXP(TY, NAME) \ 28ac1d23edSserge-sans-paille MCOPT(TY, NAME) \ 29f4c16c44SFangrui Song std::optional<TY> llvm::mc::getExplicit##NAME() { \ 30ac1d23edSserge-sans-paille if (NAME##View->getNumOccurrences()) { \ 31ac1d23edSserge-sans-paille TY res = *NAME##View; \ 32ac1d23edSserge-sans-paille return res; \ 33ac1d23edSserge-sans-paille } \ 34a38cfc50SKazu Hirata return std::nullopt; \ 35ac1d23edSserge-sans-paille } 36ac1d23edSserge-sans-paille 37ac1d23edSserge-sans-paille MCOPT_EXP(bool, RelaxAll) 38ac1d23edSserge-sans-paille MCOPT(bool, IncrementalLinkerCompatible) 392167881fSFangrui Song MCOPT(bool, FDPIC) 40ac1d23edSserge-sans-paille MCOPT(int, DwarfVersion) 41a8ec9de4SIgor Kudrin MCOPT(bool, Dwarf64) 42d4bcb45dSJez Ng MCOPT(EmitDwarfUnwindType, EmitDwarfUnwind) 43e60b30d5SVy Nguyen MCOPT(bool, EmitCompactUnwindNonCanonical) 44ac1d23edSserge-sans-paille MCOPT(bool, ShowMCInst) 45ac1d23edSserge-sans-paille MCOPT(bool, FatalWarnings) 46ac1d23edSserge-sans-paille MCOPT(bool, NoWarn) 47ac1d23edSserge-sans-paille MCOPT(bool, NoDeprecatedWarn) 489647a6f7SWouter van Oortmerssen MCOPT(bool, NoTypeCheck) 49a91c8398SFangrui Song MCOPT(bool, SaveTempLabels) 501b704e88SFangrui Song MCOPT(bool, Crel) 5146707b0aSFangrui Song MCOPT(bool, ImplicitMapSyms) 52a3319371SFangrui Song MCOPT(bool, X86RelaxRelocations) 53bddab518SJaydeepChauhan14 MCOPT(bool, X86Sse2Avx) 54ac1d23edSserge-sans-paille MCOPT(std::string, ABIName) 55e1f99830SBen Langmuir MCOPT(std::string, AsSecureLogFile) 56ac1d23edSserge-sans-paille 57ac1d23edSserge-sans-paille llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() { 58ac1d23edSserge-sans-paille #define MCBINDOPT(NAME) \ 59ac1d23edSserge-sans-paille do { \ 60ac1d23edSserge-sans-paille NAME##View = std::addressof(NAME); \ 61ac1d23edSserge-sans-paille } while (0) 62ac1d23edSserge-sans-paille 63ac1d23edSserge-sans-paille static cl::opt<bool> RelaxAll( 64ac1d23edSserge-sans-paille "mc-relax-all", cl::desc("When used with filetype=obj, relax all fixups " 65ac1d23edSserge-sans-paille "in the emitted object file")); 66ac1d23edSserge-sans-paille MCBINDOPT(RelaxAll); 67ac1d23edSserge-sans-paille 68ac1d23edSserge-sans-paille static cl::opt<bool> IncrementalLinkerCompatible( 69ac1d23edSserge-sans-paille "incremental-linker-compatible", 70ac1d23edSserge-sans-paille cl::desc( 71ac1d23edSserge-sans-paille "When used with filetype=obj, " 72ac1d23edSserge-sans-paille "emit an object file which can be used with an incremental linker")); 73ac1d23edSserge-sans-paille MCBINDOPT(IncrementalLinkerCompatible); 74ac1d23edSserge-sans-paille 752167881fSFangrui Song static cl::opt<bool> FDPIC("fdpic", cl::desc("Use the FDPIC ABI")); 762167881fSFangrui Song MCBINDOPT(FDPIC); 772167881fSFangrui Song 78ac1d23edSserge-sans-paille static cl::opt<int> DwarfVersion("dwarf-version", cl::desc("Dwarf version"), 79ac1d23edSserge-sans-paille cl::init(0)); 80ac1d23edSserge-sans-paille MCBINDOPT(DwarfVersion); 81ac1d23edSserge-sans-paille 82a8ec9de4SIgor Kudrin static cl::opt<bool> Dwarf64( 83a8ec9de4SIgor Kudrin "dwarf64", 84a8ec9de4SIgor Kudrin cl::desc("Generate debugging info in the 64-bit DWARF format")); 85a8ec9de4SIgor Kudrin MCBINDOPT(Dwarf64); 86a8ec9de4SIgor Kudrin 87d4bcb45dSJez Ng static cl::opt<EmitDwarfUnwindType> EmitDwarfUnwind( 88d4bcb45dSJez Ng "emit-dwarf-unwind", cl::desc("Whether to emit DWARF EH frame entries."), 89d4bcb45dSJez Ng cl::init(EmitDwarfUnwindType::Default), 90d4bcb45dSJez Ng cl::values(clEnumValN(EmitDwarfUnwindType::Always, "always", 91d4bcb45dSJez Ng "Always emit EH frame entries"), 92d4bcb45dSJez Ng clEnumValN(EmitDwarfUnwindType::NoCompactUnwind, 93d4bcb45dSJez Ng "no-compact-unwind", 94d4bcb45dSJez Ng "Only emit EH frame entries when compact unwind is " 95d4bcb45dSJez Ng "not available"), 96d4bcb45dSJez Ng clEnumValN(EmitDwarfUnwindType::Default, "default", 97d4bcb45dSJez Ng "Use target platform default"))); 98d4bcb45dSJez Ng MCBINDOPT(EmitDwarfUnwind); 99d4bcb45dSJez Ng 100e60b30d5SVy Nguyen static cl::opt<bool> EmitCompactUnwindNonCanonical( 101e60b30d5SVy Nguyen "emit-compact-unwind-non-canonical", 102e60b30d5SVy Nguyen cl::desc( 103e60b30d5SVy Nguyen "Whether to try to emit Compact Unwind for non canonical entries."), 104e60b30d5SVy Nguyen cl::init( 105e60b30d5SVy Nguyen false)); // By default, use DWARF for non-canonical personalities. 106e60b30d5SVy Nguyen MCBINDOPT(EmitCompactUnwindNonCanonical); 107e60b30d5SVy Nguyen 108ac1d23edSserge-sans-paille static cl::opt<bool> ShowMCInst( 109ac1d23edSserge-sans-paille "asm-show-inst", 110ac1d23edSserge-sans-paille cl::desc("Emit internal instruction representation to assembly file")); 111ac1d23edSserge-sans-paille MCBINDOPT(ShowMCInst); 112ac1d23edSserge-sans-paille 113ac1d23edSserge-sans-paille static cl::opt<bool> FatalWarnings("fatal-warnings", 114ac1d23edSserge-sans-paille cl::desc("Treat warnings as errors")); 115ac1d23edSserge-sans-paille MCBINDOPT(FatalWarnings); 116ac1d23edSserge-sans-paille 117ac1d23edSserge-sans-paille static cl::opt<bool> NoWarn("no-warn", cl::desc("Suppress all warnings")); 118ac1d23edSserge-sans-paille static cl::alias NoWarnW("W", cl::desc("Alias for --no-warn"), 119ac1d23edSserge-sans-paille cl::aliasopt(NoWarn)); 120ac1d23edSserge-sans-paille MCBINDOPT(NoWarn); 121ac1d23edSserge-sans-paille 122ac1d23edSserge-sans-paille static cl::opt<bool> NoDeprecatedWarn( 123ac1d23edSserge-sans-paille "no-deprecated-warn", cl::desc("Suppress all deprecated warnings")); 124ac1d23edSserge-sans-paille MCBINDOPT(NoDeprecatedWarn); 125ac1d23edSserge-sans-paille 1269647a6f7SWouter van Oortmerssen static cl::opt<bool> NoTypeCheck( 1279647a6f7SWouter van Oortmerssen "no-type-check", cl::desc("Suppress type errors (Wasm)")); 1289647a6f7SWouter van Oortmerssen MCBINDOPT(NoTypeCheck); 1299647a6f7SWouter van Oortmerssen 130a91c8398SFangrui Song static cl::opt<bool> SaveTempLabels( 131a91c8398SFangrui Song "save-temp-labels", cl::desc("Don't discard temporary labels")); 132a91c8398SFangrui Song MCBINDOPT(SaveTempLabels); 133a91c8398SFangrui Song 1341b704e88SFangrui Song static cl::opt<bool> Crel("crel", 1351b704e88SFangrui Song cl::desc("Use CREL relocation format for ELF")); 1361b704e88SFangrui Song MCBINDOPT(Crel); 1371b704e88SFangrui Song 13846707b0aSFangrui Song static cl::opt<bool> ImplicitMapSyms( 13946707b0aSFangrui Song "implicit-mapsyms", 14046707b0aSFangrui Song cl::desc("Allow mapping symbol at section beginning to be implicit, " 14146707b0aSFangrui Song "lowering number of mapping symbols at the expense of some " 14246707b0aSFangrui Song "portability. Recommended for projects that can build all their " 14346707b0aSFangrui Song "object files using this option")); 14446707b0aSFangrui Song MCBINDOPT(ImplicitMapSyms); 14546707b0aSFangrui Song 146a3319371SFangrui Song static cl::opt<bool> X86RelaxRelocations( 147a3319371SFangrui Song "x86-relax-relocations", 1481ca853b2SFeng Zou cl::desc("Emit GOTPCRELX/REX_GOTPCRELX/CODE_4_GOTPCRELX instead of " 1493d34053aSShengchen Kan "GOTPCREL on x86-64 ELF"), 150a3319371SFangrui Song cl::init(true)); 151a3319371SFangrui Song MCBINDOPT(X86RelaxRelocations); 152a3319371SFangrui Song 153bddab518SJaydeepChauhan14 static cl::opt<bool> X86Sse2Avx( 154bddab518SJaydeepChauhan14 "x86-sse2avx", cl::desc("Specify that the assembler should encode SSE " 155bddab518SJaydeepChauhan14 "instructions with VEX prefix")); 156bddab518SJaydeepChauhan14 MCBINDOPT(X86Sse2Avx); 157bddab518SJaydeepChauhan14 158ac1d23edSserge-sans-paille static cl::opt<std::string> ABIName( 159*98dbce3cSCraig Topper "target-abi", 160ac1d23edSserge-sans-paille cl::desc("The name of the ABI to be targeted from the backend."), 161ac1d23edSserge-sans-paille cl::init("")); 162ac1d23edSserge-sans-paille MCBINDOPT(ABIName); 163ac1d23edSserge-sans-paille 164e1f99830SBen Langmuir static cl::opt<std::string> AsSecureLogFile( 165e1f99830SBen Langmuir "as-secure-log-file", cl::desc("As secure log file name"), cl::Hidden); 166e1f99830SBen Langmuir MCBINDOPT(AsSecureLogFile); 167e1f99830SBen Langmuir 168ac1d23edSserge-sans-paille #undef MCBINDOPT 169ac1d23edSserge-sans-paille } 170ac1d23edSserge-sans-paille 171ac1d23edSserge-sans-paille MCTargetOptions llvm::mc::InitMCTargetOptionsFromFlags() { 172ac1d23edSserge-sans-paille MCTargetOptions Options; 173ac1d23edSserge-sans-paille Options.MCRelaxAll = getRelaxAll(); 174ac1d23edSserge-sans-paille Options.MCIncrementalLinkerCompatible = getIncrementalLinkerCompatible(); 1752167881fSFangrui Song Options.FDPIC = getFDPIC(); 176a8ec9de4SIgor Kudrin Options.Dwarf64 = getDwarf64(); 177ac1d23edSserge-sans-paille Options.DwarfVersion = getDwarfVersion(); 178ac1d23edSserge-sans-paille Options.ShowMCInst = getShowMCInst(); 179ac1d23edSserge-sans-paille Options.ABIName = getABIName(); 180ac1d23edSserge-sans-paille Options.MCFatalWarnings = getFatalWarnings(); 181ac1d23edSserge-sans-paille Options.MCNoWarn = getNoWarn(); 182ac1d23edSserge-sans-paille Options.MCNoDeprecatedWarn = getNoDeprecatedWarn(); 1839647a6f7SWouter van Oortmerssen Options.MCNoTypeCheck = getNoTypeCheck(); 184a91c8398SFangrui Song Options.MCSaveTempLabels = getSaveTempLabels(); 1851b704e88SFangrui Song Options.Crel = getCrel(); 18646707b0aSFangrui Song Options.ImplicitMapSyms = getImplicitMapSyms(); 187a3319371SFangrui Song Options.X86RelaxRelocations = getX86RelaxRelocations(); 188bddab518SJaydeepChauhan14 Options.X86Sse2Avx = getX86Sse2Avx(); 189d4bcb45dSJez Ng Options.EmitDwarfUnwind = getEmitDwarfUnwind(); 190e60b30d5SVy Nguyen Options.EmitCompactUnwindNonCanonical = getEmitCompactUnwindNonCanonical(); 191e1f99830SBen Langmuir Options.AsSecureLogFile = getAsSecureLogFile(); 192d4bcb45dSJez Ng 193ac1d23edSserge-sans-paille return Options; 194ac1d23edSserge-sans-paille } 195