181ad6265SDimitry Andric //===-- MCTargetOptionsCommandFlags.cpp -----------------------*- C++ //-*-===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric // 95ffd83dbSDimitry Andric // This file contains machine code-specific flags that are shared between 105ffd83dbSDimitry Andric // different command line tools. 115ffd83dbSDimitry Andric // 125ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 135ffd83dbSDimitry Andric 145ffd83dbSDimitry Andric #include "llvm/MC/MCTargetOptionsCommandFlags.h" 155ffd83dbSDimitry Andric #include "llvm/MC/MCTargetOptions.h" 165ffd83dbSDimitry Andric #include "llvm/Support/CommandLine.h" 175ffd83dbSDimitry Andric 185ffd83dbSDimitry Andric using namespace llvm; 195ffd83dbSDimitry Andric 205ffd83dbSDimitry Andric #define MCOPT(TY, NAME) \ 215ffd83dbSDimitry Andric static cl::opt<TY> *NAME##View; \ 225ffd83dbSDimitry Andric TY llvm::mc::get##NAME() { \ 235ffd83dbSDimitry Andric assert(NAME##View && "RegisterMCTargetOptionsFlags not created."); \ 245ffd83dbSDimitry Andric return *NAME##View; \ 255ffd83dbSDimitry Andric } 265ffd83dbSDimitry Andric 275ffd83dbSDimitry Andric #define MCOPT_EXP(TY, NAME) \ 285ffd83dbSDimitry Andric MCOPT(TY, NAME) \ 29bdd1243dSDimitry Andric std::optional<TY> llvm::mc::getExplicit##NAME() { \ 305ffd83dbSDimitry Andric if (NAME##View->getNumOccurrences()) { \ 315ffd83dbSDimitry Andric TY res = *NAME##View; \ 325ffd83dbSDimitry Andric return res; \ 335ffd83dbSDimitry Andric } \ 34bdd1243dSDimitry Andric return std::nullopt; \ 355ffd83dbSDimitry Andric } 365ffd83dbSDimitry Andric 375ffd83dbSDimitry Andric MCOPT_EXP(bool, RelaxAll) 385ffd83dbSDimitry Andric MCOPT(bool, IncrementalLinkerCompatible) 39*0fca6ea1SDimitry Andric MCOPT(bool, FDPIC) 405ffd83dbSDimitry Andric MCOPT(int, DwarfVersion) 415ffd83dbSDimitry Andric MCOPT(bool, Dwarf64) 4281ad6265SDimitry Andric MCOPT(EmitDwarfUnwindType, EmitDwarfUnwind) 4306c3fb27SDimitry Andric MCOPT(bool, EmitCompactUnwindNonCanonical) 445ffd83dbSDimitry Andric MCOPT(bool, ShowMCInst) 455ffd83dbSDimitry Andric MCOPT(bool, FatalWarnings) 465ffd83dbSDimitry Andric MCOPT(bool, NoWarn) 475ffd83dbSDimitry Andric MCOPT(bool, NoDeprecatedWarn) 48fe6060f1SDimitry Andric MCOPT(bool, NoTypeCheck) 49*0fca6ea1SDimitry Andric MCOPT(bool, SaveTempLabels) 50*0fca6ea1SDimitry Andric MCOPT(bool, Crel) 51*0fca6ea1SDimitry Andric MCOPT(bool, X86RelaxRelocations) 52*0fca6ea1SDimitry Andric MCOPT(bool, X86Sse2Avx) 535ffd83dbSDimitry Andric MCOPT(std::string, ABIName) 54bdd1243dSDimitry Andric MCOPT(std::string, AsSecureLogFile) 555ffd83dbSDimitry Andric 565ffd83dbSDimitry Andric llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() { 575ffd83dbSDimitry Andric #define MCBINDOPT(NAME) \ 585ffd83dbSDimitry Andric do { \ 595ffd83dbSDimitry Andric NAME##View = std::addressof(NAME); \ 605ffd83dbSDimitry Andric } while (0) 615ffd83dbSDimitry Andric 625ffd83dbSDimitry Andric static cl::opt<bool> RelaxAll( 635ffd83dbSDimitry Andric "mc-relax-all", cl::desc("When used with filetype=obj, relax all fixups " 645ffd83dbSDimitry Andric "in the emitted object file")); 655ffd83dbSDimitry Andric MCBINDOPT(RelaxAll); 665ffd83dbSDimitry Andric 675ffd83dbSDimitry Andric static cl::opt<bool> IncrementalLinkerCompatible( 685ffd83dbSDimitry Andric "incremental-linker-compatible", 695ffd83dbSDimitry Andric cl::desc( 705ffd83dbSDimitry Andric "When used with filetype=obj, " 715ffd83dbSDimitry Andric "emit an object file which can be used with an incremental linker")); 725ffd83dbSDimitry Andric MCBINDOPT(IncrementalLinkerCompatible); 735ffd83dbSDimitry Andric 74*0fca6ea1SDimitry Andric static cl::opt<bool> FDPIC("fdpic", cl::desc("Use the FDPIC ABI")); 75*0fca6ea1SDimitry Andric MCBINDOPT(FDPIC); 76*0fca6ea1SDimitry Andric 775ffd83dbSDimitry Andric static cl::opt<int> DwarfVersion("dwarf-version", cl::desc("Dwarf version"), 785ffd83dbSDimitry Andric cl::init(0)); 795ffd83dbSDimitry Andric MCBINDOPT(DwarfVersion); 805ffd83dbSDimitry Andric 815ffd83dbSDimitry Andric static cl::opt<bool> Dwarf64( 825ffd83dbSDimitry Andric "dwarf64", 835ffd83dbSDimitry Andric cl::desc("Generate debugging info in the 64-bit DWARF format")); 845ffd83dbSDimitry Andric MCBINDOPT(Dwarf64); 855ffd83dbSDimitry Andric 8681ad6265SDimitry Andric static cl::opt<EmitDwarfUnwindType> EmitDwarfUnwind( 8781ad6265SDimitry Andric "emit-dwarf-unwind", cl::desc("Whether to emit DWARF EH frame entries."), 8881ad6265SDimitry Andric cl::init(EmitDwarfUnwindType::Default), 8981ad6265SDimitry Andric cl::values(clEnumValN(EmitDwarfUnwindType::Always, "always", 9081ad6265SDimitry Andric "Always emit EH frame entries"), 9181ad6265SDimitry Andric clEnumValN(EmitDwarfUnwindType::NoCompactUnwind, 9281ad6265SDimitry Andric "no-compact-unwind", 9381ad6265SDimitry Andric "Only emit EH frame entries when compact unwind is " 9481ad6265SDimitry Andric "not available"), 9581ad6265SDimitry Andric clEnumValN(EmitDwarfUnwindType::Default, "default", 9681ad6265SDimitry Andric "Use target platform default"))); 9781ad6265SDimitry Andric MCBINDOPT(EmitDwarfUnwind); 9881ad6265SDimitry Andric 9906c3fb27SDimitry Andric static cl::opt<bool> EmitCompactUnwindNonCanonical( 10006c3fb27SDimitry Andric "emit-compact-unwind-non-canonical", 10106c3fb27SDimitry Andric cl::desc( 10206c3fb27SDimitry Andric "Whether to try to emit Compact Unwind for non canonical entries."), 10306c3fb27SDimitry Andric cl::init( 10406c3fb27SDimitry Andric false)); // By default, use DWARF for non-canonical personalities. 10506c3fb27SDimitry Andric MCBINDOPT(EmitCompactUnwindNonCanonical); 10606c3fb27SDimitry Andric 1075ffd83dbSDimitry Andric static cl::opt<bool> ShowMCInst( 1085ffd83dbSDimitry Andric "asm-show-inst", 1095ffd83dbSDimitry Andric cl::desc("Emit internal instruction representation to assembly file")); 1105ffd83dbSDimitry Andric MCBINDOPT(ShowMCInst); 1115ffd83dbSDimitry Andric 1125ffd83dbSDimitry Andric static cl::opt<bool> FatalWarnings("fatal-warnings", 1135ffd83dbSDimitry Andric cl::desc("Treat warnings as errors")); 1145ffd83dbSDimitry Andric MCBINDOPT(FatalWarnings); 1155ffd83dbSDimitry Andric 1165ffd83dbSDimitry Andric static cl::opt<bool> NoWarn("no-warn", cl::desc("Suppress all warnings")); 1175ffd83dbSDimitry Andric static cl::alias NoWarnW("W", cl::desc("Alias for --no-warn"), 1185ffd83dbSDimitry Andric cl::aliasopt(NoWarn)); 1195ffd83dbSDimitry Andric MCBINDOPT(NoWarn); 1205ffd83dbSDimitry Andric 1215ffd83dbSDimitry Andric static cl::opt<bool> NoDeprecatedWarn( 1225ffd83dbSDimitry Andric "no-deprecated-warn", cl::desc("Suppress all deprecated warnings")); 1235ffd83dbSDimitry Andric MCBINDOPT(NoDeprecatedWarn); 1245ffd83dbSDimitry Andric 125fe6060f1SDimitry Andric static cl::opt<bool> NoTypeCheck( 126fe6060f1SDimitry Andric "no-type-check", cl::desc("Suppress type errors (Wasm)")); 127fe6060f1SDimitry Andric MCBINDOPT(NoTypeCheck); 128fe6060f1SDimitry Andric 129*0fca6ea1SDimitry Andric static cl::opt<bool> SaveTempLabels( 130*0fca6ea1SDimitry Andric "save-temp-labels", cl::desc("Don't discard temporary labels")); 131*0fca6ea1SDimitry Andric MCBINDOPT(SaveTempLabels); 132*0fca6ea1SDimitry Andric 133*0fca6ea1SDimitry Andric static cl::opt<bool> Crel("crel", 134*0fca6ea1SDimitry Andric cl::desc("Use CREL relocation format for ELF")); 135*0fca6ea1SDimitry Andric MCBINDOPT(Crel); 136*0fca6ea1SDimitry Andric 137*0fca6ea1SDimitry Andric static cl::opt<bool> X86RelaxRelocations( 138*0fca6ea1SDimitry Andric "x86-relax-relocations", 139*0fca6ea1SDimitry Andric cl::desc( 140*0fca6ea1SDimitry Andric "Emit GOTPCRELX/REX_GOTPCRELX instead of GOTPCREL on x86-64 ELF"), 141*0fca6ea1SDimitry Andric cl::init(true)); 142*0fca6ea1SDimitry Andric MCBINDOPT(X86RelaxRelocations); 143*0fca6ea1SDimitry Andric 144*0fca6ea1SDimitry Andric static cl::opt<bool> X86Sse2Avx( 145*0fca6ea1SDimitry Andric "x86-sse2avx", cl::desc("Specify that the assembler should encode SSE " 146*0fca6ea1SDimitry Andric "instructions with VEX prefix")); 147*0fca6ea1SDimitry Andric MCBINDOPT(X86Sse2Avx); 148*0fca6ea1SDimitry Andric 1495ffd83dbSDimitry Andric static cl::opt<std::string> ABIName( 1505ffd83dbSDimitry Andric "target-abi", cl::Hidden, 1515ffd83dbSDimitry Andric cl::desc("The name of the ABI to be targeted from the backend."), 1525ffd83dbSDimitry Andric cl::init("")); 1535ffd83dbSDimitry Andric MCBINDOPT(ABIName); 1545ffd83dbSDimitry Andric 155bdd1243dSDimitry Andric static cl::opt<std::string> AsSecureLogFile( 156bdd1243dSDimitry Andric "as-secure-log-file", cl::desc("As secure log file name"), cl::Hidden); 157bdd1243dSDimitry Andric MCBINDOPT(AsSecureLogFile); 158bdd1243dSDimitry Andric 1595ffd83dbSDimitry Andric #undef MCBINDOPT 1605ffd83dbSDimitry Andric } 1615ffd83dbSDimitry Andric 1625ffd83dbSDimitry Andric MCTargetOptions llvm::mc::InitMCTargetOptionsFromFlags() { 1635ffd83dbSDimitry Andric MCTargetOptions Options; 1645ffd83dbSDimitry Andric Options.MCRelaxAll = getRelaxAll(); 1655ffd83dbSDimitry Andric Options.MCIncrementalLinkerCompatible = getIncrementalLinkerCompatible(); 166*0fca6ea1SDimitry Andric Options.FDPIC = getFDPIC(); 1675ffd83dbSDimitry Andric Options.Dwarf64 = getDwarf64(); 1685ffd83dbSDimitry Andric Options.DwarfVersion = getDwarfVersion(); 1695ffd83dbSDimitry Andric Options.ShowMCInst = getShowMCInst(); 1705ffd83dbSDimitry Andric Options.ABIName = getABIName(); 1715ffd83dbSDimitry Andric Options.MCFatalWarnings = getFatalWarnings(); 1725ffd83dbSDimitry Andric Options.MCNoWarn = getNoWarn(); 1735ffd83dbSDimitry Andric Options.MCNoDeprecatedWarn = getNoDeprecatedWarn(); 174fe6060f1SDimitry Andric Options.MCNoTypeCheck = getNoTypeCheck(); 175*0fca6ea1SDimitry Andric Options.MCSaveTempLabels = getSaveTempLabels(); 176*0fca6ea1SDimitry Andric Options.Crel = getCrel(); 177*0fca6ea1SDimitry Andric Options.X86RelaxRelocations = getX86RelaxRelocations(); 178*0fca6ea1SDimitry Andric Options.X86Sse2Avx = getX86Sse2Avx(); 17981ad6265SDimitry Andric Options.EmitDwarfUnwind = getEmitDwarfUnwind(); 18006c3fb27SDimitry Andric Options.EmitCompactUnwindNonCanonical = getEmitCompactUnwindNonCanonical(); 181bdd1243dSDimitry Andric Options.AsSecureLogFile = getAsSecureLogFile(); 18281ad6265SDimitry Andric 1835ffd83dbSDimitry Andric return Options; 1845ffd83dbSDimitry Andric } 185