[flang-commits] [clang] [flang] [Flang][Driver] NFC: Move Flang/Fortran only options to a separate file (PR #194398)
Kiran Chandramohan via flang-commits
flang-commits at lists.llvm.org
Tue Apr 28 04:06:19 PDT 2026
https://github.com/kiranchandramohan updated https://github.com/llvm/llvm-project/pull/194398
>From cf25cc4046b963dda6d3fb26caf1c26df6ee7e08 Mon Sep 17 00:00:00 2001
From: Kiran Chandramohan <kiran.chandramohan at arm.com>
Date: Mon, 27 Apr 2026 16:37:11 +0200
Subject: [PATCH 1/2] [Flang][Driver] NFC: Move Flang/Fortran only options to a
separate file
This PR factors out the Flang/Fortranly only options from Options.td
into a separately file (FlangOptions.td).
Assisted-by: codex
---
clang/include/clang/Options/FlangOptions.td | 417 ++++++++++++++++++++
clang/include/clang/Options/Options.td | 402 +------------------
2 files changed, 418 insertions(+), 401 deletions(-)
create mode 100644 clang/include/clang/Options/FlangOptions.td
diff --git a/clang/include/clang/Options/FlangOptions.td b/clang/include/clang/Options/FlangOptions.td
new file mode 100644
index 0000000000000..6657bb698cd07
--- /dev/null
+++ b/clang/include/clang/Options/FlangOptions.td
@@ -0,0 +1,417 @@
+//===--- FlangOptions.td - Flang-specific options ------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file holds Flang-specific option definitions extracted from
+// clang/include/clang/Options/Options.td.
+//
+//===----------------------------------------------------------------------===//
+
+def flang_ignored_w_Group : OptionGroup<"<flang ignored W group>">,
+ Group<W_Group>, Flags<[Ignored]>, Visibility<[FlangOption]>;
+
+multiclass FlangIgnoredDiagOpt<string name> {
+ def unsupported_warning_w#NAME : Flag<["-", "--"], "W"#name>,
+ Visibility<[FlangOption]>, Group<flang_ignored_w_Group>;
+}
+
+// Generic gfortran options.
+def A_DASH : Joined<["-"], "A-">, Group<gfortran_Group>;
+def static_libgfortran : Flag<["-"], "static-libgfortran">, Group<gfortran_Group>;
+
+// "f" options with values for gfortran.
+def fblas_matmul_limit_EQ : Joined<["-"], "fblas-matmul-limit=">, Group<gfortran_Group>;
+def fcheck_EQ : Joined<["-"], "fcheck=">, Group<gfortran_Group>;
+def ffpe_trap_EQ : Joined<["-"], "ffpe-trap=">, Group<gfortran_Group>;
+def ffree_line_length_VALUE : Joined<["-"], "ffree-line-length-">, Group<gfortran_Group>;
+def finit_character_EQ : Joined<["-"], "finit-character=">, Group<gfortran_Group>;
+def finit_integer_EQ : Joined<["-"], "finit-integer=">, Group<gfortran_Group>;
+def finit_logical_EQ : Joined<["-"], "finit-logical=">, Group<gfortran_Group>;
+def finit_real_EQ : Joined<["-"], "finit-real=">, Group<gfortran_Group>;
+def fmax_array_constructor_EQ : Joined<["-"], "fmax-array-constructor=">, Group<gfortran_Group>;
+def fmax_errors_EQ : Joined<["-"], "fmax-errors=">, Group<gfortran_Group>;
+def fmax_stack_var_size_EQ : Joined<["-"], "fmax-stack-var-size=">, Group<gfortran_Group>;
+def fmax_subrecord_length_EQ : Joined<["-"], "fmax-subrecord-length=">, Group<gfortran_Group>;
+def frecord_marker_EQ : Joined<["-"], "frecord-marker=">, Group<gfortran_Group>;
+
+// "f" flags for gfortran.
+defm aggressive_function_elimination : BooleanFFlag<"aggressive-function-elimination">, Group<gfortran_Group>;
+defm align_commons : BooleanFFlag<"align-commons">, Group<gfortran_Group>;
+defm all_intrinsics : BooleanFFlag<"all-intrinsics">, Group<gfortran_Group>;
+def fautomatic : Flag<["-"], "fautomatic">; // -fno-automatic is significant
+defm backtrace : BooleanFFlag<"backtrace">, Group<gfortran_Group>;
+defm bounds_check : BooleanFFlag<"bounds-check">, Group<gfortran_Group>;
+defm check_array_temporaries : BooleanFFlag<"check-array-temporaries">, Group<gfortran_Group>;
+defm cray_pointer : BooleanFFlag<"cray-pointer">, Group<gfortran_Group>;
+defm d_lines_as_code : BooleanFFlag<"d-lines-as-code">,
+ HelpText<"Treat fixed form lines with 'd' or 'D' in the "
+ "first column as blank.">,
+ Group<f_Group>,
+ Visibility<[FlangOption, FC1Option]>;
+defm d_lines_as_comments : BooleanFFlag<"d-lines-as-comments">,
+ HelpText<"Treat fixed form lines with 'd' or 'D' in "
+ "the first column as comments.">,
+ Group<f_Group>,
+ Visibility<[FlangOption, FC1Option]>;
+defm dollar_ok : BooleanFFlag<"dollar-ok">, Group<gfortran_Group>;
+defm dump_fortran_optimized : BooleanFFlag<"dump-fortran-optimized">, Group<gfortran_Group>;
+defm dump_fortran_original : BooleanFFlag<"dump-fortran-original">, Group<gfortran_Group>;
+defm dump_parse_tree : BooleanFFlag<"dump-parse-tree">, Group<gfortran_Group>;
+defm external_blas : BooleanFFlag<"external-blas">, Group<gfortran_Group>;
+defm f2c : BooleanFFlag<"f2c">, Group<gfortran_Group>;
+defm frontend_optimize : BooleanFFlag<"frontend-optimize">, Group<gfortran_Group>;
+defm init_local_zero : BooleanFFlag<"init-local-zero">, Group<gfortran_Group>;
+defm integer_4_integer_8 : BooleanFFlag<"integer-4-integer-8">, Group<gfortran_Group>;
+defm max_identifier_length : BooleanFFlag<"max-identifier-length">, Group<gfortran_Group>;
+defm module_private : BooleanFFlag<"module-private">, Group<gfortran_Group>;
+defm pack_derived : BooleanFFlag<"pack-derived">, Group<gfortran_Group>;
+//defm protect_parens : BooleanFFlag<"protect-parens">, Group<gfortran_Group>;
+defm range_check : BooleanFFlag<"range-check">, Group<gfortran_Group>;
+defm real_4_real_10 : BooleanFFlag<"real-4-real-10">, Group<gfortran_Group>;
+defm real_4_real_16 : BooleanFFlag<"real-4-real-16">, Group<gfortran_Group>;
+defm real_4_real_8 : BooleanFFlag<"real-4-real-8">, Group<gfortran_Group>;
+defm real_8_real_10 : BooleanFFlag<"real-8-real-10">, Group<gfortran_Group>;
+defm real_8_real_16 : BooleanFFlag<"real-8-real-16">, Group<gfortran_Group>;
+defm real_8_real_4 : BooleanFFlag<"real-8-real-4">, Group<gfortran_Group>;
+defm recursive : BooleanFFlag<"recursive">, Group<gfortran_Group>;
+defm second_underscore : BooleanFFlag<"second-underscore">, Group<gfortran_Group>;
+defm sign_zero : BooleanFFlag<"sign-zero">, Group<gfortran_Group>;
+defm whole_file : BooleanFFlag<"whole-file">, Group<gfortran_Group>;
+
+// -W <arg> options unsupported by the flang compiler
+// If any of these options are passed into flang's compiler driver,
+// a warning will be raised and the argument will be claimed
+defm : FlangIgnoredDiagOpt<"extra">;
+defm : FlangIgnoredDiagOpt<"aliasing">;
+defm : FlangIgnoredDiagOpt<"ampersand">;
+defm : FlangIgnoredDiagOpt<"array-bounds">;
+defm : FlangIgnoredDiagOpt<"c-binding-type">;
+defm : FlangIgnoredDiagOpt<"character-truncation">;
+defm : FlangIgnoredDiagOpt<"conversion">;
+defm : FlangIgnoredDiagOpt<"do-subscript">;
+defm : FlangIgnoredDiagOpt<"function-elimination">;
+defm : FlangIgnoredDiagOpt<"implicit-interface">;
+defm : FlangIgnoredDiagOpt<"implicit-procedure">;
+defm : FlangIgnoredDiagOpt<"intrinsic-shadow">;
+defm : FlangIgnoredDiagOpt<"use-without-only">;
+defm : FlangIgnoredDiagOpt<"intrinsics-std">;
+defm : FlangIgnoredDiagOpt<"line-truncation">;
+defm : FlangIgnoredDiagOpt<"no-align-commons">;
+defm : FlangIgnoredDiagOpt<"no-overwrite-recursive">;
+defm : FlangIgnoredDiagOpt<"no-tabs">;
+defm : FlangIgnoredDiagOpt<"real-q-constant">;
+defm : FlangIgnoredDiagOpt<"surprising">;
+defm : FlangIgnoredDiagOpt<"underflow">;
+defm : FlangIgnoredDiagOpt<"unused-parameter">;
+defm : FlangIgnoredDiagOpt<"realloc-lhs">;
+defm : FlangIgnoredDiagOpt<"realloc-lhs-all">;
+defm : FlangIgnoredDiagOpt<"frontend-loop-interchange">;
+defm : FlangIgnoredDiagOpt<"target-lifetime">;
+
+def shared_libflangrt : Flag<["-"], "shared-libflangrt">,
+ HelpText<"Link the flang-rt shared library">, Group<Link_Group>,
+ Visibility<[FlangOption]>, Flags<[NoArgumentUnused]>;
+def static_libflangrt : Flag<["-"], "static-libflangrt">,
+ HelpText<"Link the flang-rt static library">, Group<Link_Group>,
+ Visibility<[FlangOption]>, Flags<[NoArgumentUnused]>;
+
+//===----------------------------------------------------------------------===//
+// FLangOption + NoXarchOption
+//===----------------------------------------------------------------------===//
+
+def flang_experimental_hlfir : Flag<["-"], "flang-experimental-hlfir">,
+ Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>,
+ HelpText<"Use HLFIR lowering (experimental)">;
+
+def flang_deprecated_no_hlfir : Flag<["-"], "flang-deprecated-no-hlfir">,
+ Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>,
+ HelpText<"Do not use HLFIR lowering (deprecated)">;
+
+//===----------------------------------------------------------------------===//
+// FLangOption + CoreOption + NoXarchOption
+//===----------------------------------------------------------------------===//
+
+def Xflang : Separate<["-"], "Xflang">,
+ HelpText<"Pass <arg> to the flang compiler">, MetaVarName<"<arg>">,
+ Flags<[NoXarchOption]>, Visibility<[FlangOption, CLOption]>,
+ Group<CompileOnly_Group>;
+
+//===----------------------------------------------------------------------===//
+// FlangOption and FC1 Options
+//===----------------------------------------------------------------------===//
+
+let Visibility = [FC1Option, FlangOption] in {
+
+def cpp : Flag<["-"], "cpp">, Group<f_Group>,
+ HelpText<"Enable predefined and command line preprocessor macros">;
+def nocpp : Flag<["-"], "nocpp">, Group<f_Group>,
+ HelpText<"Disable predefined and command line preprocessor macros">;
+def module_dir : JoinedOrSeparate<["-"], "module-dir">, MetaVarName<"<dir>">,
+ HelpText<"Put MODULE files in <dir>">,
+ DocBrief<[{This option specifies where to put .mod files for compiled modules.
+It is also added to the list of directories to be searched by an USE statement.
+The default is the current directory.}]>;
+
+def ffixed_form : Flag<["-"], "ffixed-form">, Group<f_Group>,
+ HelpText<"Process source files in fixed form">;
+def ffree_form : Flag<["-"], "ffree-form">, Group<f_Group>,
+ HelpText<"Process source files in free form">;
+def ffixed_line_length_EQ : Joined<["-"], "ffixed-line-length=">, Group<f_Group>,
+ HelpText<"Use <value> as character line width in fixed mode">,
+ DocBrief<[{Set column after which characters are ignored in typical fixed-form lines in the source
+file}]>;
+def ffixed_line_length_VALUE : Joined<["-"], "ffixed-line-length-">, Group<f_Group>, Alias<ffixed_line_length_EQ>;
+def fconvert_EQ : Joined<["-"], "fconvert=">, Group<f_Group>,
+ HelpText<"Set endian conversion of data for unformatted files">;
+def fdefault_double_8 : Flag<["-"],"fdefault-double-8">, Group<f_Group>,
+ HelpText<"Set the default double precision kind to an 8 byte wide type">;
+def fdefault_integer_8 : Flag<["-"],"fdefault-integer-8">, Group<f_Group>,
+ HelpText<"Set the default integer and logical kind to an 8 byte wide type">;
+def fdefault_real_8 : Flag<["-"],"fdefault-real-8">, Group<f_Group>,
+ HelpText<"Set the default real kind to an 8 byte wide type">;
+def fdefault_integer_4 : Flag<["-"],"fdefault-integer-4">, Group<f_Group>,
+ HelpText<"Set the default integer and logical kind to a 4 byte wide type">;
+def fdefault_real_4 : Flag<["-"],"fdefault-real-4">, Group<f_Group>,
+ HelpText<"Set the default real kind to a 4 byte wide type">;
+def fdisable_real_3 : Flag<["-"],"fdisable-real-3">, Group<f_Group>,
+ HelpText<"Disable real(KIND=3) from TargetCharacteristics">, Flags<[HelpHidden]>;
+def fdisable_real_10 : Flag<["-"],"fdisable-real-10">, Group<f_Group>,
+ HelpText<"Disable real(KIND=10) from TargetCharacteristics">, Flags<[HelpHidden]>;
+def fdisable_integer_2 : Flag<["-"],"fdisable-integer-2">, Group<f_Group>,
+ HelpText<"Disable integer(KIND=2) from TargetCharacteristics">, Flags<[HelpHidden]>;
+def fdisable_integer_16 : Flag<["-"],"fdisable-integer-16">, Group<f_Group>,
+ HelpText<"Disable integer(KIND=16) from TargetCharacteristics">, Flags<[HelpHidden]>;
+def flarge_sizes : Flag<["-"],"flarge-sizes">, Group<f_Group>,
+ HelpText<"Use INTEGER(KIND=8) for the result type in size-related intrinsics">;
+
+def falternative_parameter_statement : Flag<["-"], "falternative-parameter-statement">, Group<f_Group>,
+ HelpText<"Enable the old style PARAMETER statement">;
+def fintrinsic_modules_path : Separate<["-"], "fintrinsic-modules-path">, Group<f_Group>, MetaVarName<"<dir>">,
+ HelpText<"Specify where to find the compiled intrinsic modules">,
+ DocBrief<[{This option specifies the location of pre-compiled intrinsic modules,
+ if they are not in the default location expected by the compiler.}]>;
+def fintrinsic_modules_path_EQ : Joined<["-"], "fintrinsic-modules-path=">,
+ Group<f_Group>, Alias<fintrinsic_modules_path>;
+
+defm backslash : OptInFC1FFlag<"backslash", "Specify that backslash in string introduces an escape character">;
+defm xor_operator : OptInFC1FFlag<"xor-operator", "Enable .XOR. as a synonym of .NEQV.">;
+defm logical_abbreviations : OptInFC1FFlag<"logical-abbreviations", "Enable logical abbreviations">;
+defm implicit_none : OptInFC1FFlag<"implicit-none", "No implicit typing allowed unless overridden by IMPLICIT statements">;
+defm implicit_none_ext : OptInFC1FFlag<"implicit-none-ext", "No implicit externals allowed">;
+defm underscoring : OptInFC1FFlag<"underscoring", "Appends one trailing underscore to external names">;
+defm ppc_native_vec_elem_order: BoolOptionWithoutMarshalling<"f", "ppc-native-vector-element-order",
+ PosFlag<SetTrue, [], [ClangOption], "Specifies PowerPC native vector element order (default)">,
+ NegFlag<SetFalse, [], [ClangOption], "Specifies PowerPC non-native vector element order">>;
+defm unsigned : OptInFC1FFlag<"unsigned", "Enables UNSIGNED type">;
+
+def fno_automatic : Flag<["-"], "fno-automatic">, Group<f_Group>,
+ HelpText<"Implies the SAVE attribute for non-automatic local objects in subprograms unless RECURSIVE">;
+
+defm repack_arrays
+ : BoolOptionWithoutMarshalling<
+ "f", "repack-arrays", PosFlag<SetTrue, [], [], "Pack">,
+ NegFlag<SetFalse, [], [], "Do not pack">,
+ BothFlags<[], [],
+ " non-contiguous assumed shape dummy arrays into "
+ "contiguous memory">>,
+ DocBrief<[{Create temporary copies of non-contiguous assumed shape dummy
+arrays in subprogram prologues, and destroy them in subprogram epilogues.
+The temporary copy is initialized with values from the original array
+in the prologue, if needed. In the epilogue, the current values
+in the temporary array are copied into the original array, if needed.
+
+Accessing the contiguous temporary in the program code may result
+in faster execution comparing to accessing elements of the original array,
+when they are sparse in memory. At the same time, the overhead
+of copying values between the original and the temporary arrays
+may be significant, which may slow down some programs.
+
+Enabling array repacking may also change the behavior of certain
+programs:
+
+* The copy actions may introduce a data race in valid OpenACC/OpenMP programs.
+ For example, if different threads execute the same subprogram
+ with a non-contiguous assumed shape dummy array, and the different threads
+ access unrelated parts of the array, then the whole array copy
+ made in each thread will cause a data race.
+* OpenACC/OpenMP offload programs may behave incorrectly with regards
+ to the device data environment, due to the fact that the original
+ array and the temporary may have different presence status on the device.
+* ``IS_CONTIGUOUS`` intrinsic may return ``TRUE`` with the array repacking
+ enabled, whereas if would return ``FALSE`` with the repacking disabled.
+* The result of ``LOC`` intrinsic applied to an actual argument associated
+ with a non-contiguous assumed shape dummy array, may be different
+ from the result of ``LOC`` applied to the dummy array.}]>;
+
+def frepack_arrays_contiguity_EQ
+ : Joined<["-"], "frepack-arrays-contiguity=">,
+ Group<f_Group>,
+ Values<"whole,innermost">,
+ HelpText<
+ "When -frepack-arrays is in effect, 'whole' enables "
+ "repacking for arrays that are non-contiguous in any dimension, "
+ "'innermost' enables repacking for arrays that are non-contiguous "
+ "in the innermost dimension (the default)">;
+
+defm save_main_program : BoolOptionWithoutMarshalling<"f", "save-main-program",
+ PosFlag<SetTrue, [], [],
+ "Place all main program variables in static memory (otherwise scalars may be placed on the stack)">,
+ NegFlag<SetFalse, [], [],
+ "Allow placing main program variables on the stack (default)">>;
+
+defm stack_arrays : BoolOptionWithoutMarshalling<"f", "stack-arrays",
+ PosFlag<SetTrue, [], [ClangOption], "Attempt to allocate array temporaries on the stack, no matter their size">,
+ NegFlag<SetFalse, [], [ClangOption], "Allocate array temporaries on the heap (default)">>;
+
+defm safe_trampoline : BoolOptionWithoutMarshalling<"f",
+ "safe-trampoline",
+ PosFlag<SetTrue, [], [FlangOption], "Use W^X compliant runtime trampoline pool for internal procedures">,
+ NegFlag<SetFalse, [], [FlangOption], "Use stack-based trampolines for internal procedures (default, may require executable stack)">>;
+
+defm loop_versioning : BoolOptionWithoutMarshalling<"f", "version-loops-for-stride",
+ PosFlag<SetTrue, [], [ClangOption], "Create unit-strided versions of loops">,
+ NegFlag<SetFalse, [], [ClangOption], "Do not create unit-strided loops (default)">>;
+
+defm stack_repack_arrays
+ : BoolOptionWithoutMarshalling<
+ "f", "stack-repack-arrays",
+ PosFlag<SetTrue, [], [],
+ "Attempt to allocate array temporaries created under "
+ "-frepack-arrays on the stack">,
+ NegFlag<
+ SetFalse, [], [],
+ "Allocate -frepack-arrays temporaries on the heap (default)">>,
+ DocBrief<[{Controls whether the array temporaries created under
+**-frepack-arrays** are allocated on the stack or on the heap.
+
+By default, the heap is used. Allocations of polymorphic types
+are always done on the heap, though this may change in future releases.
+ }]>;
+
+defm unsafe_cray_pointers : BoolOptionWithoutMarshalling<"f", "unsafe-cray-pointers",
+ PosFlag<SetTrue, [], [FlangOption, FC1Option], "Optimizations allow for unsafe Cray pointer usages">,
+ NegFlag<SetFalse, [], [FlangOption, FC1Option], "Optimizations don't allow for unsafe Cray pointer usages (default)">>;
+
+def fhermetic_module_files : Flag<["-"], "fhermetic-module-files">, Group<f_Group>,
+ HelpText<"Emit hermetic module files (no nested USE association)">;
+
+def fdo_concurrent_to_openmp_EQ : Joined<["-"], "fdo-concurrent-to-openmp=">,
+ HelpText<"Try to map `do concurrent` loops to OpenMP [none|host|device]">,
+ Values<"none, host, device">;
+} // let Visibility = [FC1Option, FlangOption]
+
+def J : JoinedOrSeparate<["-"], "J">,
+ Flags<[RenderJoined]>, Visibility<[FlangOption, FC1Option]>,
+ Group<gfortran_Group>,
+ Alias<module_dir>;
+
+def ffast_real_mod : Flag<["-"], "ffast-real-mod">,
+ Group<f_Group>, Visibility<[FlangOption, FC1Option]>,
+ HelpText<"Enable optimization of MOD for REAL types">;
+def fno_fast_real_mod : Flag<["-"], "fno-fast-real-mod">,
+ Group<f_Group>, Visibility<[FlangOption, FC1Option]>,
+ HelpText<"Disable optimization of MOD for REAL types in presence of -ffast-math">;
+
+defm init_global_zero : BoolOptionWithoutMarshalling<"f", "init-global-zero",
+ PosFlag<SetTrue, [], [FlangOption, FC1Option],
+ "Zero initialize globals without default initialization (default)">,
+ NegFlag<SetFalse, [], [FlangOption, FC1Option],
+ "Do not zero initialize globals without default initialization">>;
+
+def fno_realloc_lhs : Flag<["-"], "fno-realloc-lhs">, Group<f_Group>,
+ HelpText<"An allocatable left-hand side of an intrinsic assignment is assumed to be allocated and match the shape/type of the right-hand side">,
+ Visibility<[FlangOption, FC1Option]>;
+def frealloc_lhs : Flag<["-"], "frealloc-lhs">, Group<f_Group>,
+ Visibility<[FlangOption, FC1Option]>,
+ HelpText<"If an allocatable left-hand side of an intrinsic assignment is unallocated or its shape/type does not match the right-hand side, then it is automatically (re)allocated">;
+
+//===----------------------------------------------------------------------===//
+// Coarray Options
+//===----------------------------------------------------------------------===//
+
+def fcoarray : Flag<["-"], "fcoarray">,
+ Group<f_Group>,
+ Visibility<[FlangOption, FC1Option]>,
+ HelpText<"Enable Coarray features">;
+
+//===----------------------------------------------------------------------===//
+// FC1 Options
+//===----------------------------------------------------------------------===//
+
+let Visibility = [FC1Option] in {
+
+def ffp_maxmin_behavior_EQ
+ : Joined<["-"], "ffp-maxmin-behavior=">,
+ Flags<[HelpHidden]>,
+ Group<f_Group>,
+ Values<"legacy,portable,extremum,extremenum">,
+ HelpText<"Control max/min and [max|min][loc|val] behavior: "
+ "legacy (cmp+select), portable (same as legacy, "
+ " but may use max/minNum when -fno-signed-zeros "
+ "-fno-honor-nans), extremum (IEEE-754-2019 maximum/minimum), "
+ "extremenum (IEEE-754-2008 max/minNum)">;
+
+def fget_definition : MultiArg<["-"], "fget-definition", 3>,
+ HelpText<"Get the symbol definition from <line> <start-column> <end-column>">,
+ Group<Action_Group>;
+def test_io : Flag<["-"], "test-io">, Group<Action_Group>,
+ HelpText<"Run the InputOuputTest action. Use for development and testing only.">;
+def fdebug_unparse_no_sema : Flag<["-"], "fdebug-unparse-no-sema">, Group<Action_Group>,
+ HelpText<"Unparse and stop (skips the semantic checks)">,
+ DocBrief<[{Only run the parser, then unparse the parse-tree and output the
+generated Fortran source file. Semantic checks are disabled.}]>;
+def fdebug_unparse : Flag<["-"], "fdebug-unparse">, Group<Action_Group>,
+ HelpText<"Unparse and stop.">,
+ DocBrief<[{Run the parser and the semantic checks. Then unparse the
+parse-tree and output the generated Fortran source file.}]>;
+def fdebug_unparse_with_symbols : Flag<["-"], "fdebug-unparse-with-symbols">, Group<Action_Group>,
+ HelpText<"Unparse with symbols and stop.">;
+def fdebug_unparse_with_modules : Flag<["-"], "fdebug-unparse-with-modules">, Group<Action_Group>,
+ HelpText<"Unparse with dependent modules and stop.">;
+def fdebug_dump_symbols : Flag<["-"], "fdebug-dump-symbols">, Group<Action_Group>,
+ HelpText<"Dump symbols after the semantic analysis">;
+def fdebug_dump_parse_tree : Flag<["-"], "fdebug-dump-parse-tree">, Group<Action_Group>,
+ HelpText<"Dump the parse tree">,
+ DocBrief<[{Run the Parser and the semantic checks, and then output the
+parse tree.}]>;
+def fdebug_dump_pft : Flag<["-"], "fdebug-dump-pft">, Group<Action_Group>,
+ HelpText<"Dump the pre-fir parse tree">;
+def fdebug_dump_parse_tree_no_sema : Flag<["-"], "fdebug-dump-parse-tree-no-sema">, Group<Action_Group>,
+ HelpText<"Dump the parse tree (skips the semantic checks)">,
+ DocBrief<[{Run the Parser and then output the parse tree. Semantic
+checks are disabled.}]>;
+def fdebug_dump_all : Flag<["-"], "fdebug-dump-all">, Group<Action_Group>,
+ HelpText<"Dump symbols and the parse tree after the semantic checks">;
+def fdebug_dump_provenance : Flag<["-"], "fdebug-dump-provenance">, Group<Action_Group>,
+ HelpText<"Dump provenance">;
+def fdebug_dump_parsing_log : Flag<["-"], "fdebug-dump-parsing-log">, Group<Action_Group>,
+ HelpText<"Run instrumented parse and dump the parsing log">;
+def fdebug_measure_parse_tree : Flag<["-"], "fdebug-measure-parse-tree">, Group<Action_Group>,
+ HelpText<"Measure the parse tree">;
+def fdebug_pre_fir_tree : Flag<["-"], "fdebug-pre-fir-tree">, Group<Action_Group>,
+ HelpText<"Dump the pre-FIR tree">;
+def fdebug_module_writer : Flag<["-"],"fdebug-module-writer">,
+ HelpText<"Enable debug messages while writing module files">;
+def fget_symbols_sources : Flag<["-"], "fget-symbols-sources">, Group<Action_Group>,
+ HelpText<"Dump symbols and their source code locations">;
+
+def module_suffix : Separate<["-"], "module-suffix">, Group<f_Group>, MetaVarName<"<suffix>">,
+ HelpText<"Use <suffix> as the suffix for module files (the default value is `.mod`)">;
+def fno_reformat : Flag<["-"], "fno-reformat">, Group<Preprocessor_Group>,
+ HelpText<"Dump the cooked character stream in -E mode">;
+def fpreprocess_include_lines : Flag<["-"], "fpreprocess-include-lines">, Group<Preprocessor_Group>,
+ HelpText<"Treat INCLUDE lines like #include directives in -E mode">;
+defm analyzed_objects_for_unparse : OptOutFC1FFlag<"analyzed-objects-for-unparse", "", "Do not use the analyzed objects when unparsing">;
+
+def emit_fir : Flag<["-"], "emit-fir">, Group<Action_Group>,
+ HelpText<"Build the parse tree, then lower it to FIR">;
+def emit_mlir : Flag<["-"], "emit-mlir">, Alias<emit_fir>;
+
+def emit_hlfir : Flag<["-"], "emit-hlfir">, Group<Action_Group>,
+ HelpText<"Build the parse tree, then lower it to HLFIR">;
+
+} // let Visibility = [FC1Option]
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index c16c41ad4057d..c64ebba6f3dbf 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -300,10 +300,6 @@ def clang_ignored_f_Group : OptionGroup<"<clang ignored f group>">,
def clang_ignored_m_Group : OptionGroup<"<clang ignored m group>">,
Group<m_Group>, Flags<[Ignored]>;
-// Unsupported flang groups
-def flang_ignored_w_Group : OptionGroup<"<flang ignored W group>">,
- Group<W_Group>, Flags<[Ignored]>, Visibility<[FlangOption]>;
-
// Group for clang options in the process of deprecation.
// Please include the version that deprecated the flag as comment to allow
// easier garbage collection.
@@ -2949,12 +2945,6 @@ def fno_unsafe_math_optimizations : Flag<["-"], "fno-unsafe-math-optimizations">
Group<f_Group>;
def fassociative_math : Flag<["-"], "fassociative-math">, Visibility<[ClangOption, FlangOption]>, Group<f_Group>;
def fno_associative_math : Flag<["-"], "fno-associative-math">, Visibility<[ClangOption, FlangOption]>, Group<f_Group>;
-def ffast_real_mod : Flag<["-"], "ffast-real-mod">,
- Group<f_Group>, Visibility<[FlangOption, FC1Option]>,
- HelpText<"Enable optimization of MOD for REAL types">;
-def fno_fast_real_mod : Flag<["-"], "fno-fast-real-mod">,
- Group<f_Group>, Visibility<[FlangOption, FC1Option]>,
- HelpText<"Disable optimization of MOD for REAL types in presence of -ffast-math">;
defm reciprocal_math : BoolFOption<"reciprocal-math",
LangOpts<"AllowRecip">, DefaultFalse,
PosFlag<SetTrue, [], [ClangOption, CC1Option, FC1Option, FlangOption],
@@ -3891,9 +3881,6 @@ defm diagnostics_show_line_numbers : BoolFOption<"diagnostics-show-line-numbers"
NegFlag<SetFalse, [], [ClangOption, CC1Option],
"Show line numbers in diagnostic code snippets">,
PosFlag<SetTrue>>;
-def fno_realloc_lhs : Flag<["-"], "fno-realloc-lhs">, Group<f_Group>,
- HelpText<"An allocatable left-hand side of an intrinsic assignment is assumed to be allocated and match the shape/type of the right-hand side">,
- Visibility<[FlangOption, FC1Option]>;
def fno_stack_protector : Flag<["-"], "fno-stack-protector">, Group<f_Group>,
HelpText<"Disable the use of stack protectors">;
def fno_strict_aliasing : Flag<["-"], "fno-strict-aliasing">, Group<f_Group>,
@@ -3902,11 +3889,6 @@ def fno_strict_aliasing : Flag<["-"], "fno-strict-aliasing">, Group<f_Group>,
def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group<f_Group>;
def fno_struct_path_tbaa : Flag<["-"], "fno-struct-path-tbaa">, Group<f_Group>;
def fno_strict_enums : Flag<["-"], "fno-strict-enums">, Group<f_Group>;
-defm init_global_zero : BoolOptionWithoutMarshalling<"f", "init-global-zero",
- PosFlag<SetTrue, [], [FlangOption, FC1Option],
- "Zero initialize globals without default initialization (default)">,
- NegFlag<SetFalse, [], [FlangOption, FC1Option],
- "Do not zero initialize globals without default initialization">>;
def fno_pointer_tbaa : Flag<["-"], "fno-pointer-tbaa">, Group<f_Group>;
def fno_temp_file : Flag<["-"], "fno-temp-file">, Group<f_Group>,
Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>, HelpText<
@@ -4868,9 +4850,6 @@ defm stack_size_section : BoolFOption<"stack-size-section",
PosFlag<SetTrue, [], [ClangOption, CC1Option],
"Emit section containing metadata on function stack sizes">,
NegFlag<SetFalse>>;
-def frealloc_lhs : Flag<["-"], "frealloc-lhs">, Group<f_Group>,
- Visibility<[FlangOption, FC1Option]>,
- HelpText<"If an allocatable left-hand side of an intrinsic assignment is unallocated or its shape/type does not match the right-hand side, then it is automatically (re)allocated">;
def fstack_usage : Flag<["-"], "fstack-usage">, Group<f_Group>,
HelpText<"Emit .su file containing information on function stack sizes">;
def stack_usage_file : Separate<["-"], "stack-usage-file">,
@@ -7352,11 +7331,6 @@ multiclass BooleanFFlag<string name> {
def fno_#NAME : Flag<["-"], "fno-"#name>;
}
-multiclass FlangIgnoredDiagOpt<string name> {
- def unsupported_warning_w#NAME : Flag<["-", "--"], "W"#name>,
- Visibility<[FlangOption]>, Group<flang_ignored_w_Group>;
-}
-
defm : BooleanFFlag<"keep-inline-functions">, Group<clang_ignored_gcc_optimization_f_Group>;
def fprofile_dir : Joined<["-"], "fprofile-dir=">, Group<f_Group>;
@@ -7467,98 +7441,7 @@ defm whole_program : BooleanFFlag<"whole-program">, Group<clang_ignored_gcc_opti
defm devirtualize : BooleanFFlag<"devirtualize">,
Group<clang_ignored_gcc_optimization_f_Group>;
-// Generic gfortran options.
-def A_DASH : Joined<["-"], "A-">, Group<gfortran_Group>;
-def static_libgfortran : Flag<["-"], "static-libgfortran">, Group<gfortran_Group>;
-
-// "f" options with values for gfortran.
-def fblas_matmul_limit_EQ : Joined<["-"], "fblas-matmul-limit=">, Group<gfortran_Group>;
-def fcheck_EQ : Joined<["-"], "fcheck=">, Group<gfortran_Group>;
-def ffpe_trap_EQ : Joined<["-"], "ffpe-trap=">, Group<gfortran_Group>;
-def ffree_line_length_VALUE : Joined<["-"], "ffree-line-length-">, Group<gfortran_Group>;
-def finit_character_EQ : Joined<["-"], "finit-character=">, Group<gfortran_Group>;
-def finit_integer_EQ : Joined<["-"], "finit-integer=">, Group<gfortran_Group>;
-def finit_logical_EQ : Joined<["-"], "finit-logical=">, Group<gfortran_Group>;
-def finit_real_EQ : Joined<["-"], "finit-real=">, Group<gfortran_Group>;
-def fmax_array_constructor_EQ : Joined<["-"], "fmax-array-constructor=">, Group<gfortran_Group>;
-def fmax_errors_EQ : Joined<["-"], "fmax-errors=">, Group<gfortran_Group>;
-def fmax_stack_var_size_EQ : Joined<["-"], "fmax-stack-var-size=">, Group<gfortran_Group>;
-def fmax_subrecord_length_EQ : Joined<["-"], "fmax-subrecord-length=">, Group<gfortran_Group>;
-def frecord_marker_EQ : Joined<["-"], "frecord-marker=">, Group<gfortran_Group>;
-
-// "f" flags for gfortran.
-defm aggressive_function_elimination : BooleanFFlag<"aggressive-function-elimination">, Group<gfortran_Group>;
-defm align_commons : BooleanFFlag<"align-commons">, Group<gfortran_Group>;
-defm all_intrinsics : BooleanFFlag<"all-intrinsics">, Group<gfortran_Group>;
-def fautomatic : Flag<["-"], "fautomatic">; // -fno-automatic is significant
-defm backtrace : BooleanFFlag<"backtrace">, Group<gfortran_Group>;
-defm bounds_check : BooleanFFlag<"bounds-check">, Group<gfortran_Group>;
-defm check_array_temporaries : BooleanFFlag<"check-array-temporaries">, Group<gfortran_Group>;
-defm cray_pointer : BooleanFFlag<"cray-pointer">, Group<gfortran_Group>;
-defm d_lines_as_code : BooleanFFlag<"d-lines-as-code">,
- HelpText<"Treat fixed form lines with 'd' or 'D' in the "
- "first column as blank.">,
- Group<f_Group>,
- Visibility<[FlangOption, FC1Option]>;
-defm d_lines_as_comments : BooleanFFlag<"d-lines-as-comments">,
- HelpText<"Treat fixed form lines with 'd' or 'D' in "
- "the first column as comments.">,
- Group<f_Group>,
- Visibility<[FlangOption, FC1Option]>;
-defm dollar_ok : BooleanFFlag<"dollar-ok">, Group<gfortran_Group>;
-defm dump_fortran_optimized : BooleanFFlag<"dump-fortran-optimized">, Group<gfortran_Group>;
-defm dump_fortran_original : BooleanFFlag<"dump-fortran-original">, Group<gfortran_Group>;
-defm dump_parse_tree : BooleanFFlag<"dump-parse-tree">, Group<gfortran_Group>;
-defm external_blas : BooleanFFlag<"external-blas">, Group<gfortran_Group>;
-defm f2c : BooleanFFlag<"f2c">, Group<gfortran_Group>;
-defm frontend_optimize : BooleanFFlag<"frontend-optimize">, Group<gfortran_Group>;
-defm init_local_zero : BooleanFFlag<"init-local-zero">, Group<gfortran_Group>;
-defm integer_4_integer_8 : BooleanFFlag<"integer-4-integer-8">, Group<gfortran_Group>;
-defm max_identifier_length : BooleanFFlag<"max-identifier-length">, Group<gfortran_Group>;
-defm module_private : BooleanFFlag<"module-private">, Group<gfortran_Group>;
-defm pack_derived : BooleanFFlag<"pack-derived">, Group<gfortran_Group>;
-//defm protect_parens : BooleanFFlag<"protect-parens">, Group<gfortran_Group>;
-defm range_check : BooleanFFlag<"range-check">, Group<gfortran_Group>;
-defm real_4_real_10 : BooleanFFlag<"real-4-real-10">, Group<gfortran_Group>;
-defm real_4_real_16 : BooleanFFlag<"real-4-real-16">, Group<gfortran_Group>;
-defm real_4_real_8 : BooleanFFlag<"real-4-real-8">, Group<gfortran_Group>;
-defm real_8_real_10 : BooleanFFlag<"real-8-real-10">, Group<gfortran_Group>;
-defm real_8_real_16 : BooleanFFlag<"real-8-real-16">, Group<gfortran_Group>;
-defm real_8_real_4 : BooleanFFlag<"real-8-real-4">, Group<gfortran_Group>;
-defm recursive : BooleanFFlag<"recursive">, Group<gfortran_Group>;
-defm second_underscore : BooleanFFlag<"second-underscore">, Group<gfortran_Group>;
-defm sign_zero : BooleanFFlag<"sign-zero">, Group<gfortran_Group>;
-defm whole_file : BooleanFFlag<"whole-file">, Group<gfortran_Group>;
-
-// -W <arg> options unsupported by the flang compiler
-// If any of these options are passed into flang's compiler driver,
-// a warning will be raised and the argument will be claimed
-defm : FlangIgnoredDiagOpt<"extra">;
-defm : FlangIgnoredDiagOpt<"aliasing">;
-defm : FlangIgnoredDiagOpt<"ampersand">;
-defm : FlangIgnoredDiagOpt<"array-bounds">;
-defm : FlangIgnoredDiagOpt<"c-binding-type">;
-defm : FlangIgnoredDiagOpt<"character-truncation">;
-defm : FlangIgnoredDiagOpt<"conversion">;
-defm : FlangIgnoredDiagOpt<"do-subscript">;
-defm : FlangIgnoredDiagOpt<"function-elimination">;
-defm : FlangIgnoredDiagOpt<"implicit-interface">;
-defm : FlangIgnoredDiagOpt<"implicit-procedure">;
-defm : FlangIgnoredDiagOpt<"intrinsic-shadow">;
-defm : FlangIgnoredDiagOpt<"use-without-only">;
-defm : FlangIgnoredDiagOpt<"intrinsics-std">;
-defm : FlangIgnoredDiagOpt<"line-truncation">;
-defm : FlangIgnoredDiagOpt<"no-align-commons">;
-defm : FlangIgnoredDiagOpt<"no-overwrite-recursive">;
-defm : FlangIgnoredDiagOpt<"no-tabs">;
-defm : FlangIgnoredDiagOpt<"real-q-constant">;
-defm : FlangIgnoredDiagOpt<"surprising">;
-defm : FlangIgnoredDiagOpt<"underflow">;
-defm : FlangIgnoredDiagOpt<"unused-parameter">;
-defm : FlangIgnoredDiagOpt<"realloc-lhs">;
-defm : FlangIgnoredDiagOpt<"realloc-lhs-all">;
-defm : FlangIgnoredDiagOpt<"frontend-loop-interchange">;
-defm : FlangIgnoredDiagOpt<"target-lifetime">;
+include "FlangOptions.td"
// C++ SYCL options
let Group = sycl_Group in {
@@ -7581,280 +7464,6 @@ let Flags = [TargetSpecific] in {
defm android_pad_segment : BooleanFFlag<"android-pad-segment">, Group<f_Group>;
} // let Flags = [TargetSpecific]
-def shared_libflangrt : Flag<["-"], "shared-libflangrt">,
- HelpText<"Link the flang-rt shared library">, Group<Link_Group>,
- Visibility<[FlangOption]>, Flags<[NoArgumentUnused]>;
-def static_libflangrt : Flag<["-"], "static-libflangrt">,
- HelpText<"Link the flang-rt static library">, Group<Link_Group>,
- Visibility<[FlangOption]>, Flags<[NoArgumentUnused]>;
-
-//===----------------------------------------------------------------------===//
-// FLangOption + NoXarchOption
-//===----------------------------------------------------------------------===//
-
-def flang_experimental_hlfir : Flag<["-"], "flang-experimental-hlfir">,
- Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>,
- HelpText<"Use HLFIR lowering (experimental)">;
-
-def flang_deprecated_no_hlfir : Flag<["-"], "flang-deprecated-no-hlfir">,
- Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>,
- HelpText<"Do not use HLFIR lowering (deprecated)">;
-
-//===----------------------------------------------------------------------===//
-// FLangOption + CoreOption + NoXarchOption
-//===----------------------------------------------------------------------===//
-
-def Xflang : Separate<["-"], "Xflang">,
- HelpText<"Pass <arg> to the flang compiler">, MetaVarName<"<arg>">,
- Flags<[NoXarchOption]>, Visibility<[FlangOption, CLOption]>,
- Group<CompileOnly_Group>;
-
-//===----------------------------------------------------------------------===//
-// FlangOption and FC1 Options
-//===----------------------------------------------------------------------===//
-
-let Visibility = [FC1Option, FlangOption] in {
-
-def cpp : Flag<["-"], "cpp">, Group<f_Group>,
- HelpText<"Enable predefined and command line preprocessor macros">;
-def nocpp : Flag<["-"], "nocpp">, Group<f_Group>,
- HelpText<"Disable predefined and command line preprocessor macros">;
-def module_dir : JoinedOrSeparate<["-"], "module-dir">, MetaVarName<"<dir>">,
- HelpText<"Put MODULE files in <dir>">,
- DocBrief<[{This option specifies where to put .mod files for compiled modules.
-It is also added to the list of directories to be searched by an USE statement.
-The default is the current directory.}]>;
-
-def ffixed_form : Flag<["-"], "ffixed-form">, Group<f_Group>,
- HelpText<"Process source files in fixed form">;
-def ffree_form : Flag<["-"], "ffree-form">, Group<f_Group>,
- HelpText<"Process source files in free form">;
-def ffixed_line_length_EQ : Joined<["-"], "ffixed-line-length=">, Group<f_Group>,
- HelpText<"Use <value> as character line width in fixed mode">,
- DocBrief<[{Set column after which characters are ignored in typical fixed-form lines in the source
-file}]>;
-def ffixed_line_length_VALUE : Joined<["-"], "ffixed-line-length-">, Group<f_Group>, Alias<ffixed_line_length_EQ>;
-def fconvert_EQ : Joined<["-"], "fconvert=">, Group<f_Group>,
- HelpText<"Set endian conversion of data for unformatted files">;
-def fdefault_double_8 : Flag<["-"],"fdefault-double-8">, Group<f_Group>,
- HelpText<"Set the default double precision kind to an 8 byte wide type">;
-def fdefault_integer_8 : Flag<["-"],"fdefault-integer-8">, Group<f_Group>,
- HelpText<"Set the default integer and logical kind to an 8 byte wide type">;
-def fdefault_real_8 : Flag<["-"],"fdefault-real-8">, Group<f_Group>,
- HelpText<"Set the default real kind to an 8 byte wide type">;
-def fdefault_integer_4 : Flag<["-"],"fdefault-integer-4">, Group<f_Group>,
- HelpText<"Set the default integer and logical kind to a 4 byte wide type">;
-def fdefault_real_4 : Flag<["-"],"fdefault-real-4">, Group<f_Group>,
- HelpText<"Set the default real kind to a 4 byte wide type">;
-def fdisable_real_3 : Flag<["-"],"fdisable-real-3">, Group<f_Group>,
- HelpText<"Disable real(KIND=3) from TargetCharacteristics">, Flags<[HelpHidden]>;
-def fdisable_real_10 : Flag<["-"],"fdisable-real-10">, Group<f_Group>,
- HelpText<"Disable real(KIND=10) from TargetCharacteristics">, Flags<[HelpHidden]>;
-def fdisable_integer_2 : Flag<["-"],"fdisable-integer-2">, Group<f_Group>,
- HelpText<"Disable integer(KIND=2) from TargetCharacteristics">, Flags<[HelpHidden]>;
-def fdisable_integer_16 : Flag<["-"],"fdisable-integer-16">, Group<f_Group>,
- HelpText<"Disable integer(KIND=16) from TargetCharacteristics">, Flags<[HelpHidden]>;
-def flarge_sizes : Flag<["-"],"flarge-sizes">, Group<f_Group>,
- HelpText<"Use INTEGER(KIND=8) for the result type in size-related intrinsics">;
-
-def falternative_parameter_statement : Flag<["-"], "falternative-parameter-statement">, Group<f_Group>,
- HelpText<"Enable the old style PARAMETER statement">;
-def fintrinsic_modules_path : Separate<["-"], "fintrinsic-modules-path">, Group<f_Group>, MetaVarName<"<dir>">,
- HelpText<"Specify where to find the compiled intrinsic modules">,
- DocBrief<[{This option specifies the location of pre-compiled intrinsic modules,
- if they are not in the default location expected by the compiler.}]>;
-def fintrinsic_modules_path_EQ : Joined<["-"], "fintrinsic-modules-path=">,
- Group<f_Group>, Alias<fintrinsic_modules_path>;
-
-defm backslash : OptInFC1FFlag<"backslash", "Specify that backslash in string introduces an escape character">;
-defm xor_operator : OptInFC1FFlag<"xor-operator", "Enable .XOR. as a synonym of .NEQV.">;
-defm logical_abbreviations : OptInFC1FFlag<"logical-abbreviations", "Enable logical abbreviations">;
-defm implicit_none : OptInFC1FFlag<"implicit-none", "No implicit typing allowed unless overridden by IMPLICIT statements">;
-defm implicit_none_ext : OptInFC1FFlag<"implicit-none-ext", "No implicit externals allowed">;
-defm underscoring : OptInFC1FFlag<"underscoring", "Appends one trailing underscore to external names">;
-defm ppc_native_vec_elem_order: BoolOptionWithoutMarshalling<"f", "ppc-native-vector-element-order",
- PosFlag<SetTrue, [], [ClangOption], "Specifies PowerPC native vector element order (default)">,
- NegFlag<SetFalse, [], [ClangOption], "Specifies PowerPC non-native vector element order">>;
-defm unsigned : OptInFC1FFlag<"unsigned", "Enables UNSIGNED type">;
-
-def fno_automatic : Flag<["-"], "fno-automatic">, Group<f_Group>,
- HelpText<"Implies the SAVE attribute for non-automatic local objects in subprograms unless RECURSIVE">;
-
-defm repack_arrays
- : BoolOptionWithoutMarshalling<
- "f", "repack-arrays", PosFlag<SetTrue, [], [], "Pack">,
- NegFlag<SetFalse, [], [], "Do not pack">,
- BothFlags<[], [],
- " non-contiguous assumed shape dummy arrays into "
- "contiguous memory">>,
- DocBrief<[{Create temporary copies of non-contiguous assumed shape dummy
-arrays in subprogram prologues, and destroy them in subprogram epilogues.
-The temporary copy is initialized with values from the original array
-in the prologue, if needed. In the epilogue, the current values
-in the temporary array are copied into the original array, if needed.
-
-Accessing the contiguous temporary in the program code may result
-in faster execution comparing to accessing elements of the original array,
-when they are sparse in memory. At the same time, the overhead
-of copying values between the original and the temporary arrays
-may be significant, which may slow down some programs.
-
-Enabling array repacking may also change the behavior of certain
-programs:
-
-* The copy actions may introduce a data race in valid OpenACC/OpenMP programs.
- For example, if different threads execute the same subprogram
- with a non-contiguous assumed shape dummy array, and the different threads
- access unrelated parts of the array, then the whole array copy
- made in each thread will cause a data race.
-* OpenACC/OpenMP offload programs may behave incorrectly with regards
- to the device data environment, due to the fact that the original
- array and the temporary may have different presence status on the device.
-* ``IS_CONTIGUOUS`` intrinsic may return ``TRUE`` with the array repacking
- enabled, whereas if would return ``FALSE`` with the repacking disabled.
-* The result of ``LOC`` intrinsic applied to an actual argument associated
- with a non-contiguous assumed shape dummy array, may be different
- from the result of ``LOC`` applied to the dummy array.}]>;
-
-def frepack_arrays_contiguity_EQ
- : Joined<["-"], "frepack-arrays-contiguity=">,
- Group<f_Group>,
- Values<"whole,innermost">,
- HelpText<
- "When -frepack-arrays is in effect, 'whole' enables "
- "repacking for arrays that are non-contiguous in any dimension, "
- "'innermost' enables repacking for arrays that are non-contiguous "
- "in the innermost dimension (the default)">;
-
-defm save_main_program : BoolOptionWithoutMarshalling<"f", "save-main-program",
- PosFlag<SetTrue, [], [],
- "Place all main program variables in static memory (otherwise scalars may be placed on the stack)">,
- NegFlag<SetFalse, [], [],
- "Allow placing main program variables on the stack (default)">>;
-
-defm stack_arrays : BoolOptionWithoutMarshalling<"f", "stack-arrays",
- PosFlag<SetTrue, [], [ClangOption], "Attempt to allocate array temporaries on the stack, no matter their size">,
- NegFlag<SetFalse, [], [ClangOption], "Allocate array temporaries on the heap (default)">>;
-
-defm safe_trampoline : BoolOptionWithoutMarshalling<"f",
- "safe-trampoline",
- PosFlag<SetTrue, [], [FlangOption], "Use W^X compliant runtime trampoline pool for internal procedures">,
- NegFlag<SetFalse, [], [FlangOption], "Use stack-based trampolines for internal procedures (default, may require executable stack)">>;
-
-defm loop_versioning : BoolOptionWithoutMarshalling<"f", "version-loops-for-stride",
- PosFlag<SetTrue, [], [ClangOption], "Create unit-strided versions of loops">,
- NegFlag<SetFalse, [], [ClangOption], "Do not create unit-strided loops (default)">>;
-
-defm stack_repack_arrays
- : BoolOptionWithoutMarshalling<
- "f", "stack-repack-arrays",
- PosFlag<SetTrue, [], [],
- "Attempt to allocate array temporaries created under "
- "-frepack-arrays on the stack">,
- NegFlag<
- SetFalse, [], [],
- "Allocate -frepack-arrays temporaries on the heap (default)">>,
- DocBrief<[{Controls whether the array temporaries created under
-**-frepack-arrays** are allocated on the stack or on the heap.
-
-By default, the heap is used. Allocations of polymorphic types
-are always done on the heap, though this may change in future releases.
- }]>;
-
-defm unsafe_cray_pointers : BoolOptionWithoutMarshalling<"f", "unsafe-cray-pointers",
- PosFlag<SetTrue, [], [FlangOption, FC1Option], "Optimizations allow for unsafe Cray pointer usages">,
- NegFlag<SetFalse, [], [FlangOption, FC1Option], "Optimizations don't allow for unsafe Cray pointer usages (default)">>;
-
-def fhermetic_module_files : Flag<["-"], "fhermetic-module-files">, Group<f_Group>,
- HelpText<"Emit hermetic module files (no nested USE association)">;
-
-def fdo_concurrent_to_openmp_EQ : Joined<["-"], "fdo-concurrent-to-openmp=">,
- HelpText<"Try to map `do concurrent` loops to OpenMP [none|host|device]">,
- Values<"none, host, device">;
-} // let Visibility = [FC1Option, FlangOption]
-
-def J : JoinedOrSeparate<["-"], "J">,
- Flags<[RenderJoined]>, Visibility<[FlangOption, FC1Option]>,
- Group<gfortran_Group>,
- Alias<module_dir>;
-
-//===----------------------------------------------------------------------===//
-// FC1 Options
-//===----------------------------------------------------------------------===//
-
-let Visibility = [FC1Option] in {
-
-def ffp_maxmin_behavior_EQ
- : Joined<["-"], "ffp-maxmin-behavior=">,
- Flags<[HelpHidden]>,
- Group<f_Group>,
- Values<"legacy,portable,extremum,extremenum">,
- HelpText<"Control max/min and [max|min][loc|val] behavior: "
- "legacy (cmp+select), portable (same as legacy, "
- " but may use max/minNum when -fno-signed-zeros "
- "-fno-honor-nans), extremum (IEEE-754-2019 maximum/minimum), "
- "extremenum (IEEE-754-2008 max/minNum)">;
-
-def fget_definition : MultiArg<["-"], "fget-definition", 3>,
- HelpText<"Get the symbol definition from <line> <start-column> <end-column>">,
- Group<Action_Group>;
-def test_io : Flag<["-"], "test-io">, Group<Action_Group>,
- HelpText<"Run the InputOuputTest action. Use for development and testing only.">;
-def fdebug_unparse_no_sema : Flag<["-"], "fdebug-unparse-no-sema">, Group<Action_Group>,
- HelpText<"Unparse and stop (skips the semantic checks)">,
- DocBrief<[{Only run the parser, then unparse the parse-tree and output the
-generated Fortran source file. Semantic checks are disabled.}]>;
-def fdebug_unparse : Flag<["-"], "fdebug-unparse">, Group<Action_Group>,
- HelpText<"Unparse and stop.">,
- DocBrief<[{Run the parser and the semantic checks. Then unparse the
-parse-tree and output the generated Fortran source file.}]>;
-def fdebug_unparse_with_symbols : Flag<["-"], "fdebug-unparse-with-symbols">, Group<Action_Group>,
- HelpText<"Unparse with symbols and stop.">;
-def fdebug_unparse_with_modules : Flag<["-"], "fdebug-unparse-with-modules">, Group<Action_Group>,
- HelpText<"Unparse with dependent modules and stop.">;
-def fdebug_dump_symbols : Flag<["-"], "fdebug-dump-symbols">, Group<Action_Group>,
- HelpText<"Dump symbols after the semantic analysis">;
-def fdebug_dump_parse_tree : Flag<["-"], "fdebug-dump-parse-tree">, Group<Action_Group>,
- HelpText<"Dump the parse tree">,
- DocBrief<[{Run the Parser and the semantic checks, and then output the
-parse tree.}]>;
-def fdebug_dump_pft : Flag<["-"], "fdebug-dump-pft">, Group<Action_Group>,
- HelpText<"Dump the pre-fir parse tree">;
-def fdebug_dump_parse_tree_no_sema : Flag<["-"], "fdebug-dump-parse-tree-no-sema">, Group<Action_Group>,
- HelpText<"Dump the parse tree (skips the semantic checks)">,
- DocBrief<[{Run the Parser and then output the parse tree. Semantic
-checks are disabled.}]>;
-def fdebug_dump_all : Flag<["-"], "fdebug-dump-all">, Group<Action_Group>,
- HelpText<"Dump symbols and the parse tree after the semantic checks">;
-def fdebug_dump_provenance : Flag<["-"], "fdebug-dump-provenance">, Group<Action_Group>,
- HelpText<"Dump provenance">;
-def fdebug_dump_parsing_log : Flag<["-"], "fdebug-dump-parsing-log">, Group<Action_Group>,
- HelpText<"Run instrumented parse and dump the parsing log">;
-def fdebug_measure_parse_tree : Flag<["-"], "fdebug-measure-parse-tree">, Group<Action_Group>,
- HelpText<"Measure the parse tree">;
-def fdebug_pre_fir_tree : Flag<["-"], "fdebug-pre-fir-tree">, Group<Action_Group>,
- HelpText<"Dump the pre-FIR tree">;
-def fdebug_module_writer : Flag<["-"],"fdebug-module-writer">,
- HelpText<"Enable debug messages while writing module files">;
-def fget_symbols_sources : Flag<["-"], "fget-symbols-sources">, Group<Action_Group>,
- HelpText<"Dump symbols and their source code locations">;
-
-def module_suffix : Separate<["-"], "module-suffix">, Group<f_Group>, MetaVarName<"<suffix>">,
- HelpText<"Use <suffix> as the suffix for module files (the default value is `.mod`)">;
-def fno_reformat : Flag<["-"], "fno-reformat">, Group<Preprocessor_Group>,
- HelpText<"Dump the cooked character stream in -E mode">;
-def fpreprocess_include_lines : Flag<["-"], "fpreprocess-include-lines">, Group<Preprocessor_Group>,
- HelpText<"Treat INCLUDE lines like #include directives in -E mode">;
-defm analyzed_objects_for_unparse : OptOutFC1FFlag<"analyzed-objects-for-unparse", "", "Do not use the analyzed objects when unparsing">;
-
-def emit_fir : Flag<["-"], "emit-fir">, Group<Action_Group>,
- HelpText<"Build the parse tree, then lower it to FIR">;
-def emit_mlir : Flag<["-"], "emit-mlir">, Alias<emit_fir>;
-
-def emit_hlfir : Flag<["-"], "emit-hlfir">, Group<Action_Group>,
- HelpText<"Build the parse tree, then lower it to HLFIR">;
-
-} // let Visibility = [FC1Option]
//===----------------------------------------------------------------------===//
// Target Options (cc1 + cc1as)
@@ -9271,15 +8880,6 @@ def fopenmp_host_ir_file_path : Separate<["-"], "fopenmp-host-ir-file-path">,
} // let Visibility = [CC1Option, FC1Option]
-//===----------------------------------------------------------------------===//
-// Coarray Options
-//===----------------------------------------------------------------------===//
-
-def fcoarray : Flag<["-"], "fcoarray">,
- Group<f_Group>,
- Visibility<[FlangOption, FC1Option]>,
- HelpText<"Enable Coarray features">;
-
//===----------------------------------------------------------------------===//
// SYCL Options
//===----------------------------------------------------------------------===//
>From f5511449b63c874bf33bb3fb5beaf1466b05aa14 Mon Sep 17 00:00:00 2001
From: Kiran Chandramohan <kiran.chandramohan at arm.com>
Date: Tue, 28 Apr 2026 13:03:36 +0200
Subject: [PATCH 2/2] Address review comments in Options and document in
FlangDriver.md
---
clang/include/clang/Options/FlangOptions.td | 41 +++++++--------------
flang/docs/FlangDriver.md | 14 ++++---
2 files changed, 22 insertions(+), 33 deletions(-)
diff --git a/clang/include/clang/Options/FlangOptions.td b/clang/include/clang/Options/FlangOptions.td
index 6657bb698cd07..ffb64646709df 100644
--- a/clang/include/clang/Options/FlangOptions.td
+++ b/clang/include/clang/Options/FlangOptions.td
@@ -5,11 +5,6 @@
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
-//
-// This file holds Flang-specific option definitions extracted from
-// clang/include/clang/Options/Options.td.
-//
-//===----------------------------------------------------------------------===//
def flang_ignored_w_Group : OptionGroup<"<flang ignored W group>">,
Group<W_Group>, Flags<[Ignored]>, Visibility<[FlangOption]>;
@@ -82,9 +77,9 @@ defm second_underscore : BooleanFFlag<"second-underscore">, Group<gfortran_Group
defm sign_zero : BooleanFFlag<"sign-zero">, Group<gfortran_Group>;
defm whole_file : BooleanFFlag<"whole-file">, Group<gfortran_Group>;
-// -W <arg> options unsupported by the flang compiler
-// If any of these options are passed into flang's compiler driver,
-// a warning will be raised and the argument will be claimed
+// -W <arg> options unsupported by flang.
+// If any of these options are passed to flang's driver,
+// a warning will be raised and the argument will be claimed.
defm : FlangIgnoredDiagOpt<"extra">;
defm : FlangIgnoredDiagOpt<"aliasing">;
defm : FlangIgnoredDiagOpt<"ampersand">;
@@ -120,7 +115,7 @@ def static_libflangrt : Flag<["-"], "static-libflangrt">,
Visibility<[FlangOption]>, Flags<[NoArgumentUnused]>;
//===----------------------------------------------------------------------===//
-// FLangOption + NoXarchOption
+// FlangOption + NoXarchOption
//===----------------------------------------------------------------------===//
def flang_experimental_hlfir : Flag<["-"], "flang-experimental-hlfir">,
@@ -132,12 +127,12 @@ def flang_deprecated_no_hlfir : Flag<["-"], "flang-deprecated-no-hlfir">,
HelpText<"Do not use HLFIR lowering (deprecated)">;
//===----------------------------------------------------------------------===//
-// FLangOption + CoreOption + NoXarchOption
+// FlangOption + CoreOption + NoXarchOption
//===----------------------------------------------------------------------===//
def Xflang : Separate<["-"], "Xflang">,
HelpText<"Pass <arg> to the flang compiler">, MetaVarName<"<arg>">,
- Flags<[NoXarchOption]>, Visibility<[FlangOption, CLOption]>,
+ Flags<[NoXarchOption]>, Visibility<[FlangOption]>,
Group<CompileOnly_Group>;
//===----------------------------------------------------------------------===//
@@ -302,31 +297,22 @@ def fhermetic_module_files : Flag<["-"], "fhermetic-module-files">, Group<f_Grou
def fdo_concurrent_to_openmp_EQ : Joined<["-"], "fdo-concurrent-to-openmp=">,
HelpText<"Try to map `do concurrent` loops to OpenMP [none|host|device]">,
Values<"none, host, device">;
-} // let Visibility = [FC1Option, FlangOption]
def J : JoinedOrSeparate<["-"], "J">,
- Flags<[RenderJoined]>, Visibility<[FlangOption, FC1Option]>,
- Group<gfortran_Group>,
- Alias<module_dir>;
+ Flags<[RenderJoined]>, Group<gfortran_Group>, Alias<module_dir>;
-def ffast_real_mod : Flag<["-"], "ffast-real-mod">,
- Group<f_Group>, Visibility<[FlangOption, FC1Option]>,
+def ffast_real_mod : Flag<["-"], "ffast-real-mod">, Group<f_Group>,
HelpText<"Enable optimization of MOD for REAL types">;
-def fno_fast_real_mod : Flag<["-"], "fno-fast-real-mod">,
- Group<f_Group>, Visibility<[FlangOption, FC1Option]>,
+def fno_fast_real_mod : Flag<["-"], "fno-fast-real-mod">, Group<f_Group>,
HelpText<"Disable optimization of MOD for REAL types in presence of -ffast-math">;
defm init_global_zero : BoolOptionWithoutMarshalling<"f", "init-global-zero",
- PosFlag<SetTrue, [], [FlangOption, FC1Option],
- "Zero initialize globals without default initialization (default)">,
- NegFlag<SetFalse, [], [FlangOption, FC1Option],
- "Do not zero initialize globals without default initialization">>;
+ PosFlag<SetTrue, [], [], "Zero initialize globals without default initialization (default)">,
+ NegFlag<SetFalse, [], [], "Do not zero initialize globals without default initialization">>;
def fno_realloc_lhs : Flag<["-"], "fno-realloc-lhs">, Group<f_Group>,
- HelpText<"An allocatable left-hand side of an intrinsic assignment is assumed to be allocated and match the shape/type of the right-hand side">,
- Visibility<[FlangOption, FC1Option]>;
+ HelpText<"An allocatable left-hand side of an intrinsic assignment is assumed to be allocated and match the shape/type of the right-hand side">;
def frealloc_lhs : Flag<["-"], "frealloc-lhs">, Group<f_Group>,
- Visibility<[FlangOption, FC1Option]>,
HelpText<"If an allocatable left-hand side of an intrinsic assignment is unallocated or its shape/type does not match the right-hand side, then it is automatically (re)allocated">;
//===----------------------------------------------------------------------===//
@@ -335,9 +321,10 @@ def frealloc_lhs : Flag<["-"], "frealloc-lhs">, Group<f_Group>,
def fcoarray : Flag<["-"], "fcoarray">,
Group<f_Group>,
- Visibility<[FlangOption, FC1Option]>,
HelpText<"Enable Coarray features">;
+} // let Visibility = [FC1Option, FlangOption]
+
//===----------------------------------------------------------------------===//
// FC1 Options
//===----------------------------------------------------------------------===//
diff --git a/flang/docs/FlangDriver.md b/flang/docs/FlangDriver.md
index 63f2ce3e67570..53319dab1ac5d 100644
--- a/flang/docs/FlangDriver.md
+++ b/flang/docs/FlangDriver.md
@@ -76,7 +76,8 @@ will ignore it when used without `Xflang`.
As hinted above, `flang` and `flang -fc1` are two separate tools. The
fact that these tools are accessed through one binary, `flang`, is just an
implementation detail. Each tool has a separate list of options, albeit defined
-in the same file: `clang/include/clang/Options/Options.td`.
+in the same files: `clang/include/clang/Options/Options.td` and
+`clang/include/clang/Options/FlangOptions.td`.
The separation helps us split various tasks and allows us to implement more
specialised tools. In particular, `flang` is not aware of various
@@ -111,9 +112,10 @@ in terms of Clang's driver library, `clangDriver`. This approach allows us to:
* leverage Clang's ability to drive various backends available in LLVM, as well
as linkers and assemblers.
One implication of this dependency on Clang is that all of Flang's compiler
-options are defined alongside Clang's options in
-`clang/include/clang/Options/Options.td`. For options that are common for both
-Flang and Clang, the corresponding definitions are shared.
+options are defined inside the Clang subproject. Flang-only options are in
+``clang/include/clang/Options/FlangOptions.td`. For options that are common for both
+Flang and Clang, the corresponding definitions are shared in
+`clang/include/clang/Options/Options.td`.
Internally, a `clangDriver` based compiler driver works by creating actions
that correspond to various compilation phases, e.g. `PreprocessJobClass`,
@@ -242,8 +244,8 @@ Adding a new compiler option in Flang consists of two steps:
### Option Definition
All of Flang's compiler and frontend driver options are defined in
-`clang/include/clang/Options/Options.td` in Clang. When adding a new option to
-Flang, you will either:
+`clang/include/clang/Options/FlangOptions.td` and `clang/include/clang/Options/Options.td`
+in Clang. When adding a new option to Flang, you will either:
* extend the existing definition for an option that is already available
in one of Clang's drivers (e.g. `clang`), but not yet available in Flang, or
* add a completely new definition if the option that you are adding has not
More information about the flang-commits
mailing list