1*ac1d23edSserge-sans-paille //===-- MCTargetOptionsCommandFlags.cpp --------------------------*- C++
2*ac1d23edSserge-sans-paille //-*-===//
3*ac1d23edSserge-sans-paille //
4*ac1d23edSserge-sans-paille // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*ac1d23edSserge-sans-paille // See https://llvm.org/LICENSE.txt for license information.
6*ac1d23edSserge-sans-paille // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*ac1d23edSserge-sans-paille //
8*ac1d23edSserge-sans-paille //===----------------------------------------------------------------------===//
9*ac1d23edSserge-sans-paille //
10*ac1d23edSserge-sans-paille // This file contains machine code-specific flags that are shared between
11*ac1d23edSserge-sans-paille // different command line tools.
12*ac1d23edSserge-sans-paille //
13*ac1d23edSserge-sans-paille //===----------------------------------------------------------------------===//
14*ac1d23edSserge-sans-paille 
15*ac1d23edSserge-sans-paille #include "llvm/MC/MCTargetOptionsCommandFlags.h"
16*ac1d23edSserge-sans-paille 
17*ac1d23edSserge-sans-paille using namespace llvm;
18*ac1d23edSserge-sans-paille 
19*ac1d23edSserge-sans-paille #define MCOPT(TY, NAME)                                                        \
20*ac1d23edSserge-sans-paille   static cl::opt<TY> *NAME##View;                                              \
21*ac1d23edSserge-sans-paille   TY llvm::mc::get##NAME() {                                                   \
22*ac1d23edSserge-sans-paille     assert(NAME##View && "RegisterMCTargetOptionsFlags not created.");         \
23*ac1d23edSserge-sans-paille     return *NAME##View;                                                        \
24*ac1d23edSserge-sans-paille   }
25*ac1d23edSserge-sans-paille 
26*ac1d23edSserge-sans-paille #define MCOPT_EXP(TY, NAME)                                                    \
27*ac1d23edSserge-sans-paille   MCOPT(TY, NAME)                                                              \
28*ac1d23edSserge-sans-paille   Optional<TY> llvm::mc::getExplicit##NAME() {                                 \
29*ac1d23edSserge-sans-paille     if (NAME##View->getNumOccurrences()) {                                     \
30*ac1d23edSserge-sans-paille       TY res = *NAME##View;                                                    \
31*ac1d23edSserge-sans-paille       return res;                                                              \
32*ac1d23edSserge-sans-paille     }                                                                          \
33*ac1d23edSserge-sans-paille     return None;                                                               \
34*ac1d23edSserge-sans-paille   }
35*ac1d23edSserge-sans-paille 
36*ac1d23edSserge-sans-paille MCOPT_EXP(bool, RelaxAll)
37*ac1d23edSserge-sans-paille MCOPT(bool, IncrementalLinkerCompatible)
38*ac1d23edSserge-sans-paille MCOPT(int, DwarfVersion)
39*ac1d23edSserge-sans-paille MCOPT(bool, ShowMCInst)
40*ac1d23edSserge-sans-paille MCOPT(bool, FatalWarnings)
41*ac1d23edSserge-sans-paille MCOPT(bool, NoWarn)
42*ac1d23edSserge-sans-paille MCOPT(bool, NoDeprecatedWarn)
43*ac1d23edSserge-sans-paille MCOPT(std::string, ABIName)
44*ac1d23edSserge-sans-paille 
45*ac1d23edSserge-sans-paille llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() {
46*ac1d23edSserge-sans-paille #define MCBINDOPT(NAME)                                                        \
47*ac1d23edSserge-sans-paille   do {                                                                         \
48*ac1d23edSserge-sans-paille     NAME##View = std::addressof(NAME);                                         \
49*ac1d23edSserge-sans-paille   } while (0)
50*ac1d23edSserge-sans-paille 
51*ac1d23edSserge-sans-paille   static cl::opt<bool> RelaxAll(
52*ac1d23edSserge-sans-paille       "mc-relax-all", cl::desc("When used with filetype=obj, relax all fixups "
53*ac1d23edSserge-sans-paille                                "in the emitted object file"));
54*ac1d23edSserge-sans-paille   MCBINDOPT(RelaxAll);
55*ac1d23edSserge-sans-paille 
56*ac1d23edSserge-sans-paille   static cl::opt<bool> IncrementalLinkerCompatible(
57*ac1d23edSserge-sans-paille       "incremental-linker-compatible",
58*ac1d23edSserge-sans-paille       cl::desc(
59*ac1d23edSserge-sans-paille           "When used with filetype=obj, "
60*ac1d23edSserge-sans-paille           "emit an object file which can be used with an incremental linker"));
61*ac1d23edSserge-sans-paille   MCBINDOPT(IncrementalLinkerCompatible);
62*ac1d23edSserge-sans-paille 
63*ac1d23edSserge-sans-paille   static cl::opt<int> DwarfVersion("dwarf-version", cl::desc("Dwarf version"),
64*ac1d23edSserge-sans-paille                                    cl::init(0));
65*ac1d23edSserge-sans-paille   MCBINDOPT(DwarfVersion);
66*ac1d23edSserge-sans-paille 
67*ac1d23edSserge-sans-paille   static cl::opt<bool> ShowMCInst(
68*ac1d23edSserge-sans-paille       "asm-show-inst",
69*ac1d23edSserge-sans-paille       cl::desc("Emit internal instruction representation to assembly file"));
70*ac1d23edSserge-sans-paille   MCBINDOPT(ShowMCInst);
71*ac1d23edSserge-sans-paille 
72*ac1d23edSserge-sans-paille   static cl::opt<bool> FatalWarnings("fatal-warnings",
73*ac1d23edSserge-sans-paille                                      cl::desc("Treat warnings as errors"));
74*ac1d23edSserge-sans-paille   MCBINDOPT(FatalWarnings);
75*ac1d23edSserge-sans-paille 
76*ac1d23edSserge-sans-paille   static cl::opt<bool> NoWarn("no-warn", cl::desc("Suppress all warnings"));
77*ac1d23edSserge-sans-paille   static cl::alias NoWarnW("W", cl::desc("Alias for --no-warn"),
78*ac1d23edSserge-sans-paille                            cl::aliasopt(NoWarn));
79*ac1d23edSserge-sans-paille   MCBINDOPT(NoWarn);
80*ac1d23edSserge-sans-paille 
81*ac1d23edSserge-sans-paille   static cl::opt<bool> NoDeprecatedWarn(
82*ac1d23edSserge-sans-paille       "no-deprecated-warn", cl::desc("Suppress all deprecated warnings"));
83*ac1d23edSserge-sans-paille   MCBINDOPT(NoDeprecatedWarn);
84*ac1d23edSserge-sans-paille 
85*ac1d23edSserge-sans-paille   static cl::opt<std::string> ABIName(
86*ac1d23edSserge-sans-paille       "target-abi", cl::Hidden,
87*ac1d23edSserge-sans-paille       cl::desc("The name of the ABI to be targeted from the backend."),
88*ac1d23edSserge-sans-paille       cl::init(""));
89*ac1d23edSserge-sans-paille   MCBINDOPT(ABIName);
90*ac1d23edSserge-sans-paille 
91*ac1d23edSserge-sans-paille #undef MCBINDOPT
92*ac1d23edSserge-sans-paille }
93*ac1d23edSserge-sans-paille 
94*ac1d23edSserge-sans-paille MCTargetOptions llvm::mc::InitMCTargetOptionsFromFlags() {
95*ac1d23edSserge-sans-paille   MCTargetOptions Options;
96*ac1d23edSserge-sans-paille   Options.MCRelaxAll = getRelaxAll();
97*ac1d23edSserge-sans-paille   Options.MCIncrementalLinkerCompatible = getIncrementalLinkerCompatible();
98*ac1d23edSserge-sans-paille   Options.DwarfVersion = getDwarfVersion();
99*ac1d23edSserge-sans-paille   Options.ShowMCInst = getShowMCInst();
100*ac1d23edSserge-sans-paille   Options.ABIName = getABIName();
101*ac1d23edSserge-sans-paille   Options.MCFatalWarnings = getFatalWarnings();
102*ac1d23edSserge-sans-paille   Options.MCNoWarn = getNoWarn();
103*ac1d23edSserge-sans-paille   Options.MCNoDeprecatedWarn = getNoDeprecatedWarn();
104*ac1d23edSserge-sans-paille   return Options;
105*ac1d23edSserge-sans-paille }
106