24 ArgStringList &CmdArgs) {
25 CmdArgs.push_back(
"-x");
30void Flang::addFortranDialectOptions(
const ArgList &Args,
31 ArgStringList &CmdArgs)
const {
33 CmdArgs, {options::OPT_ffixed_form, options::OPT_ffree_form,
34 options::OPT_ffixed_line_length_EQ, options::OPT_fopenmp,
35 options::OPT_fopenacc, options::OPT_finput_charset_EQ,
36 options::OPT_fimplicit_none, options::OPT_fno_implicit_none,
37 options::OPT_fbackslash, options::OPT_fno_backslash,
38 options::OPT_flogical_abbreviations,
39 options::OPT_fno_logical_abbreviations,
40 options::OPT_fxor_operator, options::OPT_fno_xor_operator,
41 options::OPT_falternative_parameter_statement,
42 options::OPT_fdefault_real_8, options::OPT_fdefault_integer_8,
43 options::OPT_fdefault_double_8, options::OPT_flarge_sizes,
44 options::OPT_fno_automatic});
47void Flang::addPreprocessingOptions(
const ArgList &Args,
48 ArgStringList &CmdArgs)
const {
49 Args.AddAllArgs(CmdArgs,
50 {options::OPT_P, options::OPT_D, options::OPT_U,
51 options::OPT_I, options::OPT_cpp, options::OPT_nocpp});
54void Flang::addOtherOptions(
const ArgList &Args, ArgStringList &CmdArgs)
const {
55 Args.AddAllArgs(CmdArgs,
56 {options::OPT_module_dir, options::OPT_fdebug_module_writer,
57 options::OPT_fintrinsic_modules_path, options::OPT_pedantic,
58 options::OPT_std_EQ, options::OPT_W_Joined,
59 options::OPT_fconvert_EQ, options::OPT_fpass_plugin_EQ,
60 options::OPT_funderscoring, options::OPT_fno_underscoring});
63 Args.getLastArg(options::OPT_Ofast, options::OPT_fstack_arrays,
64 options::OPT_fno_stack_arrays);
66 !stackArrays->getOption().matches(options::OPT_fno_stack_arrays))
67 CmdArgs.push_back(
"-fstack-arrays");
70void Flang::addPicOptions(
const ArgList &Args, ArgStringList &CmdArgs)
const {
73 llvm::Reloc::Model RelocationModel;
76 std::tie(RelocationModel, PICLevel, IsPIE) =
80 CmdArgs.push_back(
"-mrelocation-model");
81 CmdArgs.push_back(RMName);
84 CmdArgs.push_back(
"-pic-level");
85 CmdArgs.push_back(PICLevel == 1 ?
"1" :
"2");
87 CmdArgs.push_back(
"-pic-is-pie");
91void Flang::addTargetOptions(
const ArgList &Args,
92 ArgStringList &CmdArgs)
const {
99 CmdArgs.push_back(
"-target-cpu");
100 CmdArgs.push_back(Args.MakeArgString(CPU));
107 case llvm::Triple::aarch64:
108 case llvm::Triple::riscv64:
109 case llvm::Triple::x86_64:
118 const JobAction &JA,
const ArgList &Args,
119 ArgStringList &CmdArgs)
const {
129 if (IsHostOffloadingAction) {
130 for (
size_t i = 1; i < Inputs.size(); ++i) {
131 if (Inputs[i].getType() != types::TY_Nothing)
133 Args.MakeArgString(
"-fembed-offload-object=" +
138 if (IsOpenMPDevice) {
142 CmdArgs.push_back(
"-fopenmp-is-device");
147 ArgStringList &CmdArgs) {
148 StringRef FPContract;
149 bool HonorINFs =
true;
150 bool HonorNaNs =
true;
151 bool ApproxFunc =
false;
152 bool SignedZeros =
true;
153 bool AssociativeMath =
false;
154 bool ReciprocalMath =
false;
156 if (
const Arg *A = Args.getLastArg(options::OPT_ffp_contract)) {
157 const StringRef Val = A->getValue();
158 if (Val ==
"fast" || Val ==
"off") {
160 }
else if (Val ==
"on") {
163 D.
Diag(diag::warn_drv_unsupported_option_for_flang)
164 << Val << A->getOption().getName() <<
"off";
169 D.
Diag(diag::err_drv_unsupported_option_argument)
170 << A->getSpelling() << Val;
173 for (
const Arg *A : Args) {
174 auto optId = A->getOption().getID();
180 case options::OPT_fhonor_infinities:
183 case options::OPT_fno_honor_infinities:
186 case options::OPT_fhonor_nans:
189 case options::OPT_fno_honor_nans:
192 case options::OPT_fapprox_func:
195 case options::OPT_fno_approx_func:
198 case options::OPT_fsigned_zeros:
201 case options::OPT_fno_signed_zeros:
204 case options::OPT_fassociative_math:
205 AssociativeMath =
true;
207 case options::OPT_fno_associative_math:
208 AssociativeMath =
false;
210 case options::OPT_freciprocal_math:
211 ReciprocalMath =
true;
213 case options::OPT_fno_reciprocal_math:
214 ReciprocalMath =
false;
216 case options::OPT_Ofast:
218 case options::OPT_ffast_math:
221 AssociativeMath =
true;
222 ReciprocalMath =
true;
227 case options::OPT_fno_fast_math:
230 AssociativeMath =
false;
231 ReciprocalMath =
false;
237 if (FPContract ==
"fast")
246 if (!HonorINFs && !HonorNaNs && AssociativeMath && ReciprocalMath &&
247 ApproxFunc && !SignedZeros &&
248 (FPContract ==
"fast" || FPContract ==
"")) {
249 CmdArgs.push_back(
"-ffast-math");
253 if (!FPContract.empty())
254 CmdArgs.push_back(Args.MakeArgString(
"-ffp-contract=" + FPContract));
257 CmdArgs.push_back(
"-menable-no-infs");
260 CmdArgs.push_back(
"-menable-no-nans");
263 CmdArgs.push_back(
"-fapprox-func");
266 CmdArgs.push_back(
"-fno-signed-zeros");
268 if (AssociativeMath && !SignedZeros)
269 CmdArgs.push_back(
"-mreassociate");
272 CmdArgs.push_back(
"-freciprocal-math");
277 const ArgList &Args,
const char *LinkingOutput)
const {
280 const std::string &TripleStr = Triple.getTriple();
283 ArgStringList CmdArgs;
287 CmdArgs.push_back(
"-fc1");
290 CmdArgs.push_back(
"-triple");
291 CmdArgs.push_back(Args.MakeArgString(TripleStr));
293 if (isa<PreprocessJobAction>(JA)) {
294 CmdArgs.push_back(
"-E");
295 }
else if (isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) {
296 if (JA.
getType() == types::TY_Nothing) {
297 CmdArgs.push_back(
"-fsyntax-only");
298 }
else if (JA.
getType() == types::TY_AST) {
299 CmdArgs.push_back(
"-emit-ast");
300 }
else if (JA.
getType() == types::TY_LLVM_IR ||
301 JA.
getType() == types::TY_LTO_IR) {
302 CmdArgs.push_back(
"-emit-llvm");
303 }
else if (JA.
getType() == types::TY_LLVM_BC ||
304 JA.
getType() == types::TY_LTO_BC) {
305 CmdArgs.push_back(
"-emit-llvm-bc");
306 }
else if (JA.
getType() == types::TY_PP_Asm) {
307 CmdArgs.push_back(
"-S");
309 assert(
false &&
"Unexpected output type!");
311 }
else if (isa<AssembleJobAction>(JA)) {
312 CmdArgs.push_back(
"-emit-obj");
314 assert(
false &&
"Unexpected action class for Flang tool.");
323 addPreprocessingOptions(Args, CmdArgs);
325 addFortranDialectOptions(Args, CmdArgs);
330 Args.getLastArg(options::OPT_fcolor_diagnostics,
331 options::OPT_fno_color_diagnostics);
333 CmdArgs.push_back(
"-fcolor-diagnostics");
339 CmdArgs.push_back(
"-flto=full");
343 "the option '-flto=thin' is a work in progress"));
344 CmdArgs.push_back(
"-flto=thin");
348 addPicOptions(Args, CmdArgs);
354 addTargetOptions(Args, CmdArgs);
357 addOtherOptions(Args, CmdArgs);
360 addOffloadOptions(
C, Inputs, JA, Args, CmdArgs);
363 Args.AddAllArgValues(CmdArgs, options::OPT_Xflang);
367 for (
const Arg *A : Args.filtered(options::OPT_mllvm)) {
369 A->render(Args, CmdArgs);
372 for (
const Arg *A : Args.filtered(options::OPT_mmlir)) {
374 A->render(Args, CmdArgs);
378 for (
const Arg *A : Args.filtered(options::OPT_flang_ignored_w_Group)) {
380 D.
Diag(diag::warn_drv_unsupported_diag_option_for_flang)
381 << A->getOption().getName();
385 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group)) {
386 if (A->getOption().matches(options::OPT_O4)) {
387 CmdArgs.push_back(
"-O3");
388 D.
Diag(diag::warn_O4_is_O3);
389 }
else if (A->getOption().matches(options::OPT_Ofast)) {
390 CmdArgs.push_back(
"-O3");
392 A->render(Args, CmdArgs);
397 CmdArgs.push_back(
"-o");
400 assert(Output.
isNothing() &&
"Invalid output.");
403 assert(Input.
isFilename() &&
"Invalid input.");
411 const char *Exec = Args.MakeArgString(D.
GetProgramPath(
"flang-new", TC));
412 C.addCommand(std::make_unique<Command>(JA, *
this,
414 Exec, CmdArgs, Inputs, Output));
static void addDashXForInput(const ArgList &Args, const InputInfo &Input, ArgStringList &CmdArgs)
Add -x lang to CmdArgs for Input.
static void addDashXForInput(const ArgList &Args, const InputInfo &Input, ArgStringList &CmdArgs)
Add -x lang to CmdArgs for Input.
static void addFloatingPointOptions(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs)
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
types::ID getType() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
bool isDeviceOffloading(OffloadKind OKind) const
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticsEngine & getDiags() const
DiagnosticBuilder Diag(unsigned DiagID) const
LTOKind getLTOMode(bool IsOffload=false) const
Get the specific kind of LTO being performed.
std::string GetProgramPath(StringRef Name, const ToolChain &TC) const
GetProgramPath - Lookup Name in the list of program search paths.
ID getPreprocessedType(ID Id)
getPreprocessedType - Get the ID of the type for this input when it has been preprocessed,...
const char * getTypeName(ID Id)
getTypeName - Return the name of the type for Id.
LTOKind
Describes the kind of LTO mode selected via -f(no-)?lto(=.*)? options.
@ C
Languages that the frontend can parse and compile.
static constexpr ResponseFileSupport AtFileUTF8()