Skip to content

Commit 97b6ab9

Browse files
committed
[Driver] Allow Classic Flang driver to accept more Clang options
This patch cherry-picks a number of Visibility changes from the tip of trunk upstream, to make selected Clang options visible to Classic Flang. It also makes target-specific codegen options (-mxxxx) visible to Flang by default. Note that accepting the option does not imply support; Classic Flang may simply ignore certain options for backward compatibility.
1 parent 15cbdd5 commit 97b6ab9

File tree

2 files changed

+91
-4
lines changed

2 files changed

+91
-4
lines changed

clang/include/clang/Driver/Options.td

+71-2
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,11 @@ def hip_Group : OptionGroup<"<HIP group>">, Group<f_Group>,
167167

168168
def m_Group : OptionGroup<"<m group>">, Group<CompileOnly_Group>,
169169
DocName<"Target-dependent compilation options">,
170+
#ifdef ENABLE_CLASSIC_FLANG
171+
Visibility<[ClangOption, CLOption, FlangOption]>;
172+
#else
170173
Visibility<[ClangOption, CLOption]>;
174+
#endif
171175

172176
// Feature groups - these take command line options that correspond directly to
173177
// target specific features and can be translated directly from command line
@@ -199,10 +203,18 @@ def m_wasm_Features_Group : OptionGroup<"<wasm features group>">,
199203
def m_wasm_Features_Driver_Group : OptionGroup<"<wasm driver features group>">,
200204
Group<m_Group>, DocName<"WebAssembly Driver">;
201205
def m_x86_Features_Group : OptionGroup<"<x86 features group>">,
206+
#ifdef ENABLE_CLASSIC_FLANG
207+
Group<m_Group>, Visibility<[ClangOption, CLOption, FlangOption]>,
208+
#else
202209
Group<m_Group>, Visibility<[ClangOption, CLOption]>,
210+
#endif
203211
DocName<"X86">;
204212
def m_x86_AVX10_Features_Group : OptionGroup<"<x86 AVX10 features group>">,
213+
#ifdef ENABLE_CLASSIC_FLANG
214+
Group<m_Group>, Visibility<[ClangOption, CLOption, FlangOption]>,
215+
#else
205216
Group<m_Group>, Visibility<[ClangOption, CLOption]>,
217+
#endif
206218
DocName<"X86 AVX10">;
207219
def m_riscv_Features_Group : OptionGroup<"<riscv features group>">,
208220
Group<m_Group>, DocName<"RISC-V">;
@@ -768,10 +780,22 @@ def _DASH_DASH : Option<["--"], "", KIND_REMAINING_ARGS>,
768780
Flags<[NoXarchOption]>, Visibility<[ClangOption, CLOption, DXCOption]>;
769781
def A : JoinedOrSeparate<["-"], "A">, Flags<[RenderJoined]>,
770782
Group<gfortran_Group>;
771-
def B : JoinedOrSeparate<["-"], "B">, MetaVarName<"<prefix>">,
772783
#ifdef ENABLE_CLASSIC_FLANG
784+
def B : JoinedOrSeparate<["-"], "B">, MetaVarName<"<prefix>">,
773785
Visibility<[ClangOption, FlangOption]>,
774-
#endif
786+
HelpText<"Search $prefix$file for executables, libraries, and data files. "
787+
"If $prefix is a directory, search $prefix/$file">;
788+
def gcc_install_dir_EQ : Joined<["--"], "gcc-install-dir=">,
789+
Visibility<[ClangOption, FlangOption]>,
790+
HelpText<"Use GCC installation in the specified directory. The directory ends with path components like 'lib{,32,64}/gcc{,-cross}/$triple/$version'. "
791+
"Note: executables (e.g. ld) used by the compiler are not overridden by the selected GCC installation">;
792+
def gcc_toolchain : Joined<["--"], "gcc-toolchain=">, Flags<[NoXarchOption]>,
793+
Visibility<[ClangOption, FlangOption]>,
794+
HelpText<
795+
"Specify a directory where Clang can find 'include' and 'lib{,32,64}/gcc{,-cross}/$triple/$version'. "
796+
"Clang will use the GCC installation with the largest version">;
797+
#else
798+
def B : JoinedOrSeparate<["-"], "B">, MetaVarName<"<prefix>">,
775799
HelpText<"Search $prefix$file for executables, libraries, and data files. "
776800
"If $prefix is a directory, search $prefix/$file">;
777801
def gcc_install_dir_EQ : Joined<["--"], "gcc-install-dir=">,
@@ -780,6 +804,7 @@ def gcc_install_dir_EQ : Joined<["--"], "gcc-install-dir=">,
780804
def gcc_toolchain : Joined<["--"], "gcc-toolchain=">, Flags<[NoXarchOption]>,
781805
HelpText<"Specify a directory where Clang can find 'include' and 'lib{,32,64}/gcc{,-cross}/$triple/$version'. "
782806
"Clang will use the GCC installation with the largest version">;
807+
#endif
783808
def gcc_triple_EQ : Joined<["--"], "gcc-triple=">,
784809
HelpText<"Search for the GCC installation with the specified triple.">;
785810
def CC : Flag<["-"], "CC">, Visibility<[ClangOption, CC1Option]>,
@@ -3255,7 +3280,11 @@ defm diagnostics_show_line_numbers : BoolFOption<"diagnostics-show-line-numbers"
32553280
def fno_stack_protector : Flag<["-"], "fno-stack-protector">, Group<f_Group>,
32563281
HelpText<"Disable the use of stack protectors">;
32573282
def fno_strict_aliasing : Flag<["-"], "fno-strict-aliasing">, Group<f_Group>,
3283+
#ifdef ENABLE_CLASSIC_FLANG
3284+
Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>,
3285+
#else
32583286
Visibility<[ClangOption, CLOption, DXCOption]>,
3287+
#endif
32593288
HelpText<"Disable optimizations based on strict aliasing rules">;
32603289
def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group<f_Group>;
32613290
def fno_struct_path_tbaa : Flag<["-"], "fno-struct-path-tbaa">, Group<f_Group>;
@@ -3859,10 +3888,17 @@ def ftrap_function_EQ : Joined<["-"], "ftrap-function=">, Group<f_Group>,
38593888
Visibility<[ClangOption, CC1Option]>,
38603889
HelpText<"Issue call to specified function rather than a trap instruction">,
38613890
MarshallingInfoString<CodeGenOpts<"TrapFuncName">>;
3891+
#ifdef ENABLE_CLASSIC_FLANG
3892+
def funroll_loops : Flag<["-"], "funroll-loops">, Group<f_Group>,
3893+
HelpText<"Turn on loop unroller">, Visibility<[ClangOption, CC1Option, FlangOption]>;
3894+
def fno_unroll_loops : Flag<["-"], "fno-unroll-loops">, Group<f_Group>,
3895+
HelpText<"Turn off loop unroller">, Visibility<[ClangOption, CC1Option, FlangOption]>;
3896+
#else
38623897
def funroll_loops : Flag<["-"], "funroll-loops">, Group<f_Group>,
38633898
HelpText<"Turn on loop unroller">, Visibility<[ClangOption, CC1Option]>;
38643899
def fno_unroll_loops : Flag<["-"], "fno-unroll-loops">, Group<f_Group>,
38653900
HelpText<"Turn off loop unroller">, Visibility<[ClangOption, CC1Option]>;
3901+
#endif
38663902
defm reroll_loops : BoolFOption<"reroll-loops",
38673903
CodeGenOpts<"RerollLoops">, DefaultFalse,
38683904
PosFlag<SetTrue, [], [ClangOption, CC1Option], "Turn on loop reroller">,
@@ -4458,17 +4494,29 @@ def mwatchsimulator_version_min_EQ : Joined<["-"], "mwatchsimulator-version-min=
44584494
def march_EQ : Joined<["-"], "march=">, Group<m_Group>,
44594495
Flags<[TargetSpecific]>, Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>,
44604496
HelpText<"For a list of available architectures for the target use '-mcpu=help'">;
4497+
#ifdef ENABLE_CLASSIC_FLANG
4498+
def masm_EQ : Joined<["-"], "masm=">, Group<m_Group>, Visibility<[ClangOption, FlangOption]>;
4499+
#else
44614500
def masm_EQ : Joined<["-"], "masm=">, Group<m_Group>;
4501+
#endif
44624502
def inline_asm_EQ : Joined<["-"], "inline-asm=">, Group<m_Group>,
44634503
Visibility<[ClangOption, CC1Option]>,
44644504
Values<"att,intel">,
44654505
NormalizedValuesScope<"CodeGenOptions">, NormalizedValues<["IAD_ATT", "IAD_Intel"]>,
44664506
MarshallingInfoEnum<CodeGenOpts<"InlineAsmDialect">, "IAD_ATT">;
44674507
def mcmodel_EQ : Joined<["-"], "mcmodel=">, Group<m_Group>,
4508+
#ifdef ENABLE_CLASSIC_FLANG
4509+
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
4510+
#else
44684511
Visibility<[ClangOption, CC1Option]>,
4512+
#endif
44694513
MarshallingInfoString<TargetOpts<"CodeModel">, [{"default"}]>;
44704514
def mlarge_data_threshold_EQ : Joined<["-"], "mlarge-data-threshold=">, Group<m_Group>,
4515+
#ifdef ENABLE_CLASSIC_FLANG
4516+
Flags<[TargetSpecific]>, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
4517+
#else
44714518
Flags<[TargetSpecific]>, Visibility<[ClangOption, CC1Option]>,
4519+
#endif
44724520
MarshallingInfoInt<TargetOpts<"LargeDataThreshold">, "0">;
44734521
def mtls_size_EQ : Joined<["-"], "mtls-size=">, Group<m_Group>,
44744522
Visibility<[ClangOption, CC1Option]>,
@@ -5033,12 +5081,21 @@ def msoft_float : Flag<["-"], "msoft-float">, Group<m_Group>,
50335081
def mno_fmv : Flag<["-"], "mno-fmv">, Group<f_clang_Group>,
50345082
Visibility<[ClangOption, CC1Option]>,
50355083
HelpText<"Disable function multiversioning">;
5084+
#ifdef ENABLE_CLASSIC_FLANG
5085+
def moutline_atomics : Flag<["-"], "moutline-atomics">, Group<f_clang_Group>,
5086+
Visibility<[ClangOption, CC1Option, FlangOption]>,
5087+
HelpText<"Generate local calls to out-of-line atomic operations">;
5088+
def mno_outline_atomics : Flag<["-"], "mno-outline-atomics">, Group<f_clang_Group>,
5089+
Visibility<[ClangOption, CC1Option, FlangOption]>,
5090+
HelpText<"Don't generate local calls to out-of-line atomic operations">;
5091+
#else
50365092
def moutline_atomics : Flag<["-"], "moutline-atomics">, Group<f_clang_Group>,
50375093
Visibility<[ClangOption, CC1Option]>,
50385094
HelpText<"Generate local calls to out-of-line atomic operations">;
50395095
def mno_outline_atomics : Flag<["-"], "mno-outline-atomics">, Group<f_clang_Group>,
50405096
Visibility<[ClangOption, CC1Option]>,
50415097
HelpText<"Don't generate local calls to out-of-line atomic operations">;
5098+
#endif
50425099
def mno_implicit_float : Flag<["-"], "mno-implicit-float">, Group<m_Group>,
50435100
HelpText<"Don't generate implicit floating point or vector instructions">;
50445101
def mimplicit_float : Flag<["-"], "mimplicit-float">, Group<m_Group>;
@@ -5369,7 +5426,11 @@ def print_prog_name_EQ : Joined<["-", "--"], "print-prog-name=">,
53695426
Visibility<[ClangOption, CLOption]>;
53705427
def print_resource_dir : Flag<["-", "--"], "print-resource-dir">,
53715428
HelpText<"Print the resource directory pathname">,
5429+
#ifdef ENABLE_CLASSIC_FLANG
5430+
Visibility<[ClangOption, CLOption, FlangOption]>;
5431+
#else
53725432
Visibility<[ClangOption, CLOption]>;
5433+
#endif
53735434
def print_search_dirs : Flag<["-", "--"], "print-search-dirs">,
53745435
HelpText<"Print the paths used for finding libraries and programs">,
53755436
Visibility<[ClangOption, CLOption]>;
@@ -5406,11 +5467,19 @@ def rdynamic : Flag<["-"], "rdynamic">, Group<Link_Group>,
54065467
Visibility<[ClangOption, FlangOption]>;
54075468
def resource_dir : Separate<["-"], "resource-dir">,
54085469
Flags<[NoXarchOption, HelpHidden]>,
5470+
#ifdef ENABLE_CLASSIC_FLANG
5471+
Visibility<[ClangOption, CC1Option, CLOption, DXCOption, FlangOption, FC1Option]>,
5472+
#else
54095473
Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>,
5474+
#endif
54105475
HelpText<"The directory which holds the compiler resource files">,
54115476
MarshallingInfoString<HeaderSearchOpts<"ResourceDir">>;
54125477
def resource_dir_EQ : Joined<["-"], "resource-dir=">, Flags<[NoXarchOption]>,
5478+
#ifdef ENABLE_CLASSIC_FLANG
5479+
Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>,
5480+
#else
54135481
Visibility<[ClangOption, CLOption, DXCOption]>,
5482+
#endif
54145483
Alias<resource_dir>;
54155484
def rpath : Separate<["-"], "rpath">, Flags<[LinkerInput]>, Group<Link_Group>,
54165485
Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>;

clang/test/Driver/flang/classic-flang.f95

+20-2
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22

33
! Check that the driver invokes flang1 correctly for preprocessed free-form
44
! Fortran code. Also check that the backend is invoked correctly.
5+
! In particular, target-dependent flags (e.g. -mavx for x86_64) should be visible.
56

6-
! RUN: %clang --driver-mode=flang -target x86_64-unknown-linux-gnu -c %s -### 2>&1 \
7+
! RUN: %clang --driver-mode=flang -target x86_64-unknown-linux-gnu -mavx -c %s -### 2>&1 \
78
! RUN: | FileCheck --check-prefix=CHECK-OBJECT %s
89
! CHECK-OBJECT: "{{.*}}flang1"
910
! CHECK-OBJECT-NOT: "-preprocess"
1011
! CHECK-OBJECT-SAME: "-freeform"
1112
! CHECK-OBJECT-NEXT: "{{.*}}flang2"
1213
! CHECK-OBJECT-SAME: "-asm" [[LLFILE:.*.ll]]
1314
! CHECK-OBJECT-NEXT: {{clang.* "-cc1"}}
15+
! CHECK-OBJECT-SAME: "-target-feature" "+avx"
1416
! CHECK-OBJECT-SAME: "-o" "classic-flang.o"
1517
! CHECK-OBJECT-SAME: "-x" "ir"
1618
! CHECK-OBJECT-SAME: [[LLFILE]]
@@ -31,17 +33,33 @@
3133

3234
! Check that the backend job (clang -cc1) is not combined into the compile job
3335
! (flang2) even if -integrated-as is specified.
36+
! Also, check that AArch64-specific target-dependent flags are visible.
3437

35-
! RUN: %clang --driver-mode=flang -target x86_64-unknown-linux-gnu -integrated-as -S %s -### 2>&1 \
38+
! RUN: %clang --driver-mode=flang -target aarch64-unknown-linux-gnu -integrated-as -mno-outline-atomics -S %s -### 2>&1 \
3639
! RUN: | FileCheck --check-prefix=CHECK-ASM %s
3740
! CHECK-ASM: "{{.*}}flang1"
3841
! CHECK-ASM-NEXT: "{{.*}}flang2"
3942
! CHECK-ASM-SAME: "-asm" [[LLFILE:.*.ll]]
4043
! CHECK-ASM-NEXT: {{clang.* "-cc1"}}
44+
! CHECK-ASM-SAME: "-target-feature" "-outline-atomics"
4145
! CHECK-ASM-SAME: "-o" "classic-flang.s"
4246
! CHECK-ASM-SAME: "-x" "ir"
4347
! CHECK-ASM-SAME: [[LLFILE]]
4448

49+
! Check that other target-independent compiler flags are visible.
50+
! RUN: %clang --driver-mode=flang -target x86_64-unknown-linux-gnu --gcc-install-dir=%S/../Inputs/debian_multiarch_tree/usr/lib/gcc/x86_64-linux-gnu/10/ -fno-strict-aliasing -funroll-loops %s -### 2>&1 \
51+
! RUN: | FileCheck --check-prefix=CHECK-FFLAGS %s
52+
! CHECK-FFLAGS: "{{.*}}flang1"
53+
! CHECK-FFLAGS-NEXT: "{{.*}}flang2"
54+
! CHECK-FFLAGS-SAME: "-asm" [[LLFILE:.*.ll]]
55+
! CHECK-FFLAGS-NEXT: {{clang.* "-cc1"}}
56+
! CHECK-FFLAGS-SAME: "-relaxed-aliasing"
57+
! CHECK-FFLAGS-SAME: "-funroll-loops"
58+
! CHECK-FFLAGS-SAME: "-x" "ir"
59+
! CHECK-FFLAGS-SAME: [[LLFILE]]
60+
! CHECK-FFLAGS-NEXT: "{{.*}}ld{{(.exe)?}}"
61+
! CHECK-FFLAGS-SAME: "-L{{[^ ]*[/\\]+}}debian_multiarch_tree/usr/lib/gcc/x86_64-linux-gnu/10"
62+
4563
! Check that the linker job is given the correct libraries and library paths.
4664

4765
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -mp \

0 commit comments

Comments
 (0)