19 using namespace clang;
22 void Flang::AddFortranDialectOptions(
const ArgList &Args,
23 ArgStringList &CmdArgs)
const {
25 CmdArgs, {options::OPT_ffixed_form, options::OPT_ffree_form,
26 options::OPT_ffixed_line_length_EQ, options::OPT_fopenmp,
27 options::OPT_fopenacc, options::OPT_finput_charset_EQ,
28 options::OPT_fimplicit_none, options::OPT_fno_implicit_none,
29 options::OPT_fbackslash, options::OPT_fno_backslash,
30 options::OPT_flogical_abbreviations,
31 options::OPT_fno_logical_abbreviations,
32 options::OPT_fxor_operator, options::OPT_fno_xor_operator,
33 options::OPT_falternative_parameter_statement,
34 options::OPT_fdefault_real_8, options::OPT_fdefault_integer_8,
35 options::OPT_fdefault_double_8, options::OPT_flarge_sizes});
38 void Flang::AddPreprocessingOptions(
const ArgList &Args,
39 ArgStringList &CmdArgs)
const {
40 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I,
41 options::OPT_cpp, options::OPT_nocpp});
44 void Flang::AddOtherOptions(
const ArgList &Args, ArgStringList &CmdArgs)
const {
45 Args.AddAllArgs(CmdArgs,
46 {options::OPT_module_dir, options::OPT_fdebug_module_writer,
47 options::OPT_fintrinsic_modules_path, options::OPT_pedantic,
48 options::OPT_std_EQ, options::OPT_W_Joined});
53 const ArgList &Args,
const char *LinkingOutput)
const {
54 const auto &TC = getToolChain();
60 ArgStringList CmdArgs;
63 CmdArgs.push_back(
"-fc1");
71 if (isa<PreprocessJobAction>(JA)) {
72 CmdArgs.push_back(
"-E");
73 }
else if (isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) {
74 if (JA.
getType() == types::TY_Nothing) {
75 CmdArgs.push_back(
"-fsyntax-only");
76 }
else if (JA.
getType() == types::TY_AST) {
77 CmdArgs.push_back(
"-emit-ast");
78 }
else if (JA.
getType() == types::TY_LLVM_IR ||
79 JA.
getType() == types::TY_LTO_IR) {
80 CmdArgs.push_back(
"-emit-llvm");
81 }
else if (JA.
getType() == types::TY_LLVM_BC ||
82 JA.
getType() == types::TY_LTO_BC) {
83 CmdArgs.push_back(
"-emit-llvm-bc");
84 }
else if (JA.
getType() == types::TY_PP_Asm) {
85 CmdArgs.push_back(
"-S");
87 assert(
false &&
"Unexpected output type!");
89 }
else if (isa<AssembleJobAction>(JA)) {
90 CmdArgs.push_back(
"-emit-obj");
92 assert(
false &&
"Unexpected action class for Flang tool.");
101 AddPreprocessingOptions(Args, CmdArgs);
103 AddFortranDialectOptions(Args, CmdArgs);
106 AddOtherOptions(Args, CmdArgs);
109 Args.AddAllArgValues(CmdArgs, options::OPT_Xflang);
112 CmdArgs.push_back(
"-o");
115 assert(Output.
isNothing() &&
"Invalid output.");
118 assert(Input.
isFilename() &&
"Invalid input.");
121 const auto& D = C.getDriver();
124 const char *Exec = Args.MakeArgString(D.GetProgramPath(
"flang-new", TC));
125 C.addCommand(std::make_unique<Command>(JA, *
this,
127 Exec, CmdArgs, Inputs, Output));