xref: /freebsd-src/contrib/llvm-project/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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