From: Chandler Carruth Date: Thu, 17 Oct 2013 03:28:24 +0000 (+0000) Subject: Add support to the Clang driver for forwarding all of gfortran's flags X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b754974ec32ab712ea7d8b52cd8037b24e7d6ed3;p=clang Add support to the Clang driver for forwarding all of gfortran's flags to GCC when asked to compile a fortran input. This fixes a regression with essentially every Fortran compile since we started rejecting unknown flags. Also moves a mis-classified gfortran flag into the nicely documented set. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192867 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index d850cb3a6b..0d579c3fdb 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -190,7 +190,7 @@ def _HASH_HASH_HASH : Flag<["-"], "###">, Flags<[DriverOption, CoreOption]>, HelpText<"Print the commands to run for this compilation">; def _DASH_DASH : Option<["--"], "", KIND_REMAINING_ARGS>, Flags<[DriverOption, CoreOption]>; -def A : JoinedOrSeparate<["-"], "A">; +def A : JoinedOrSeparate<["-"], "A">, Flags<[RenderJoined]>; def B : JoinedOrSeparate<["-"], "B">; def CC : Flag<["-"], "CC">, Flags<[CC1Option]>; def C : Flag<["-"], "C">, Flags<[CC1Option]>; @@ -1420,8 +1420,6 @@ def fuse_ld_EQ : Joined<["-"], "fuse-ld=">, Group; defm align_functions : BooleanFFlag<"align-functions">, Group; def falign_functions_EQ : Joined<["-"], "falign-functions=">, Group; -def ffixed_line_length_VALUE : Joined<["-"], "ffixed-line-length-">, Group; - defm eliminate_unused_debug_types : BooleanFFlag<"eliminate-unused-debug-types">, Group; defm float_store : BooleanFFlag<"float-store">, Group; defm function_attribute_list : BooleanFFlag<"function-attribute-list">, Group; @@ -1453,6 +1451,85 @@ defm tree_vectorizer_verbose : BooleanFFlag<"tree-vectorizer-verbose">, Group, Group; defm unswitch_loops : BooleanFFlag<"unswitch-loops">, Group; + +// gfortran options that we recognize in the driver and pass along when +// invoking GCC to compile Fortran code. +def gfortran_Group : OptionGroup<"gfortran Group">; + +// Generic gfortran options. +def A_DASH : Joined<["-"], "A-">, Group; +def J : JoinedOrSeparate<["-"], "J">, Flags<[RenderJoined]>, Group; +def cpp : Flag<["-"], "cpp">, Group; +def nocpp : Flag<["-"], "nocpp">, Group; +def static_libgfortran : Flag<["-"], "static-libgfortran">, Group; + +// "f" options with values for gfortran. +def fblas_matmul_limit_EQ : Joined<["-"], "fblas-matmul-limit=">, Group; +def fcheck_EQ : Joined<["-"], "fcheck=">, Group; +def fcoarray_EQ : Joined<["-"], "fcoarray=">, Group; +def fconvert_EQ : Joined<["-"], "fconvert=">, Group; +def ffixed_line_length_VALUE : Joined<["-"], "ffixed-line-length-">, Group; +def ffpe_trap_EQ : Joined<["-"], "ffpe-trap=">, Group; +def ffree_line_length_VALUE : Joined<["-"], "ffree-line-length-">, Group; +def finit_character_EQ : Joined<["-"], "finit-character=">, Group; +def finit_integer_EQ : Joined<["-"], "finit-integer=">, Group; +def finit_logical_EQ : Joined<["-"], "finit-logical=">, Group; +def finit_real_EQ : Joined<["-"], "finit-real=">, Group; +def fmax_array_constructor_EQ : Joined<["-"], "fmax-array-constructor=">, Group; +def fmax_errors_EQ : Joined<["-"], "fmax-errors=">, Group; +def fmax_stack_var_size_EQ : Joined<["-"], "fmax-stack-var-size=">, Group; +def fmax_subrecord_length_EQ : Joined<["-"], "fmax-subrecord-length=">, Group; +def frecord_marker_EQ : Joined<["-"], "frecord-marker=">, Group; + +// "f" flags for gfortran. +defm aggressive_function_elimination : BooleanFFlag<"aggressive-function-elimination">, Group; +defm align_commons : BooleanFFlag<"align-commons">, Group; +defm all_intrinsics : BooleanFFlag<"all-intrinsics">, Group; +defm automatic : BooleanFFlag<"automatic">, Group; +defm backslash : BooleanFFlag<"backslash">, Group; +defm backtrace : BooleanFFlag<"backtrace">, Group; +defm bounds_check : BooleanFFlag<"bounds-check">, Group; +defm check_array_temporaries : BooleanFFlag<"check-array-temporaries">, Group; +defm cray_pointer : BooleanFFlag<"cray-pointer">, Group; +defm d_lines_as_code : BooleanFFlag<"d-lines-as-code">, Group; +defm d_lines_as_comments : BooleanFFlag<"d-lines-as-comments">, Group; +defm default_double_8 : BooleanFFlag<"default-double-8">, Group; +defm default_integer_8 : BooleanFFlag<"default-integer-8">, Group; +defm default_real_8 : BooleanFFlag<"default-real-8">, Group; +defm dollar_ok : BooleanFFlag<"dollar-ok">, Group; +defm dump_fortran_optimized : BooleanFFlag<"dump-fortran-optimized">, Group; +defm dump_fortran_original : BooleanFFlag<"dump-fortran-original">, Group; +defm dump_parse_tree : BooleanFFlag<"dump-parse-tree">, Group; +defm external_blas : BooleanFFlag<"external-blas">, Group; +defm f2c : BooleanFFlag<"f2c">, Group; +defm fixed_form : BooleanFFlag<"fixed-form">, Group; +defm free_form : BooleanFFlag<"free-form">, Group; +defm frontend_optimize : BooleanFFlag<"frontend-optimize">, Group; +defm implicit_none : BooleanFFlag<"implicit-none">, Group; +defm init_local_zero : BooleanFFlag<"init-local-zero">, Group; +defm integer_4_integer_8 : BooleanFFlag<"integer-4-integer-8">, Group; +defm intrinsic_modules_path : BooleanFFlag<"intrinsic-modules-path">, Group; +defm max_identifier_length : BooleanFFlag<"max-identifier-length">, Group; +defm module_private : BooleanFFlag<"module-private">, Group; +defm pack_derived : BooleanFFlag<"pack-derived">, Group; +defm protect_parens : BooleanFFlag<"protect-parens">, Group; +defm range_check : BooleanFFlag<"range-check">, Group; +defm real_4_real_10 : BooleanFFlag<"real-4-real-10">, Group; +defm real_4_real_16 : BooleanFFlag<"real-4-real-16">, Group; +defm real_4_real_8 : BooleanFFlag<"real-4-real-8">, Group; +defm real_8_real_10 : BooleanFFlag<"real-8-real-10">, Group; +defm real_8_real_16 : BooleanFFlag<"real-8-real-16">, Group; +defm real_8_real_4 : BooleanFFlag<"real-8-real-4">, Group; +defm realloc_lhs : BooleanFFlag<"realloc-lhs">, Group; +defm recursive : BooleanFFlag<"recursive">, Group; +defm repack_arrays : BooleanFFlag<"repack-arrays">, Group; +defm second_underscore : BooleanFFlag<"second-underscore">, Group; +defm sign_zero : BooleanFFlag<"sign-zero">, Group; +defm stack_arrays : BooleanFFlag<"stack-arrays">, Group; +defm underscoring : BooleanFFlag<"underscoring">, Group; +defm whole_file : BooleanFFlag<"whole-file">, Group; + + include "CC1Options.td" include "CLCompatOptions.td" diff --git a/test/Driver/gfortran.f90 b/test/Driver/gfortran.f90 new file mode 100644 index 0000000000..d531f59cd3 --- /dev/null +++ b/test/Driver/gfortran.f90 @@ -0,0 +1,244 @@ +! Test that Clang can forward all of the flags which are documented as +! being supported by gfortran to GCC when falling back to GCC for +! a fortran input file. +! +! RUN: %clang -no-canonical-prefixes -target i386-linux -### %s -o %t 2>&1 \ +! RUN: -Aquestion=answer \ +! RUN: -A-question=answer \ +! RUN: -C \ +! RUN: -CC \ +! RUN: -Dmacro \ +! RUN: -Dmacro=value \ +! RUN: -H \ +! RUN: -Isome/directory \ +! RUN: -Jsome/other/directory \ +! RUN: -P \ +! RUN: -Umacro \ +! RUN: -Waliasing \ +! RUN: -Walign-commons \ +! RUN: -Wall \ +! RUN: -Wampersand \ +! RUN: -Warray-bounds \ +! RUN: -Wc-binding-type \ +! RUN: -Wcharacter-truncation \ +! RUN: -Wconversion \ +! RUN: -Wfunction-elimination \ +! RUN: -Wimplicit-interface \ +! RUN: -Wimplicit-procedure \ +! RUN: -Wintrinsic-shadow \ +! RUN: -Wintrinsics-std \ +! RUN: -Wline-truncation \ +! RUN: -Wreal-q-constant \ +! RUN: -Wrealloc-lhs \ +! RUN: -Wsurprising \ +! RUN: -Wtabs \ +! RUN: -Wtarget-lifetime \ +! RUN: -Wunderflow \ +! RUN: -Wunused-parameter \ +! RUN: -cpp \ +! RUN: -dD \ +! RUN: -dI \ +! RUN: -dM \ +! RUN: -dN \ +! RUN: -dU \ +! RUN: -faggressive-function-elimination \ +! RUN: -falign-commons \ +! RUN: -fall-intrinsics \ +! RUN: -fautomatic \ +! RUN: -fbackslash \ +! RUN: -fbacktrace \ +! RUN: -fblas-matmul-limit=42 \ +! RUN: -fbounds-check \ +! RUN: -fcheck-array-temporaries \ +! RUN: -fcheck=all \ +! RUN: -fcoarray=none \ +! RUN: -fconvert=foobar \ +! RUN: -fcray-pointer \ +! RUN: -fd-lines-as-code \ +! RUN: -fd-lines-as-comments \ +! RUN: -fdefault-double-8 \ +! RUN: -fdefault-integer-8 \ +! RUN: -fdefault-real-8 \ +! RUN: -fdollar-ok \ +! RUN: -fdump-fortran-optimized \ +! RUN: -fdump-fortran-original \ +! RUN: -fdump-parse-tree \ +! RUN: -fexternal-blas \ +! RUN: -ff2c \ +! RUN: -ffixed-form \ +! RUN: -ffixed-line-length-42 \ +! RUN: -ffpe-trap=list \ +! RUN: -ffree-form \ +! RUN: -ffree-line-length-42 \ +! RUN: -ffrontend-optimize \ +! RUN: -fimplicit-none \ +! RUN: -finit-character=n \ +! RUN: -finit-integer=n \ +! RUN: -finit-local-zero \ +! RUN: -finit-logical=false \ +! RUN: -finit-real=zero \ +! RUN: -finteger-4-integer-8 \ +! RUN: -fintrinsic-modules-path \ +! RUN: -fmax-array-constructor=42 \ +! RUN: -fmax-errors=42 \ +! RUN: -fmax-identifier-length \ +! RUN: -fmax-stack-var-size=42 \ +! RUN: -fmax-subrecord-length=42 \ +! RUN: -fmodule-private \ +! RUN: -fopenmp \ +! RUN: -fpack-derived \ +! RUN: -fprotect-parens \ +! RUN: -frange-check \ +! RUN: -freal-4-real-10 \ +! RUN: -freal-4-real-16 \ +! RUN: -freal-4-real-8 \ +! RUN: -freal-8-real-10 \ +! RUN: -freal-8-real-16 \ +! RUN: -freal-8-real-4 \ +! RUN: -frealloc-lhs \ +! RUN: -frecord-marker=42 \ +! RUN: -frecursive \ +! RUN: -frepack-arrays \ +! RUN: -fsecond-underscore \ +! RUN: -fshort-enums \ +! RUN: -fsign-zero \ +! RUN: -fstack-arrays \ +! RUN: -fsyntax-only \ +! RUN: -funderscoring \ +! RUN: -fwhole-file \ +! RUN: -fworking-directory \ +! RUN: -imultilib \ +! RUN: -iprefix \ +! RUN: -iquote \ +! RUN: -isysroot \ +! RUN: -isystem \ +! RUN: -nocpp \ +! RUN: -nostdinc \ +! RUN: -pedantic \ +! RUN: -pedantic-errors \ +! RUN: -static-libgfortran \ +! RUN: -std=f90 \ +! RUN: -undef \ +! RUN: | FileCheck %s +! +! FIXME: Several of these shouldn't necessarily be rendered separately +! when passing to GCC... Hopefully their driver handles this. +! +! CHECK: "-Aquestion=answer" +! CHECK: "-A-question=answer" +! CHECK: "-C" +! CHECK: "-CC" +! CHECK: "-D" "macro" +! CHECK: "-D" "macro=value" +! CHECK: "-H" +! CHECK: "-I" "some/directory" +! CHECK: "-Jsome/other/directory" +! CHECK: "-P" +! CHECK: "-U" "macro" +! CHECK: "-Waliasing" +! CHECK: "-Walign-commons" +! CHECK: "-Wall" +! CHECK: "-Wampersand" +! CHECK: "-Warray-bounds" +! CHECK: "-Wc-binding-type" +! CHECK: "-Wcharacter-truncation" +! CHECK: "-Wconversion" +! CHECK: "-Wfunction-elimination" +! CHECK: "-Wimplicit-interface" +! CHECK: "-Wimplicit-procedure" +! CHECK: "-Wintrinsic-shadow" +! CHECK: "-Wintrinsics-std" +! CHECK: "-Wline-truncation" +! CHECK: "-Wreal-q-constant" +! CHECK: "-Wrealloc-lhs" +! CHECK: "-Wsurprising" +! CHECK: "-Wtabs" +! CHECK: "-Wtarget-lifetime" +! CHECK: "-Wunderflow" +! CHECK: "-Wunused-parameter" +! CHECK: "-cpp" +! CHECK: "-dD" +! CHECK: "-dI" +! CHECK: "-dM" +! CHECK: "-dN" +! CHECK: "-dU" +! CHECK: "-faggressive-function-elimination" +! CHECK: "-falign-commons" +! CHECK: "-fall-intrinsics" +! CHECK: "-fautomatic" +! CHECK: "-fbackslash" +! CHECK: "-fbacktrace" +! CHECK: "-fblas-matmul-limit=42" +! CHECK: "-fbounds-check" +! CHECK: "-fcheck-array-temporaries" +! CHECK: "-fcheck=all" +! CHECK: "-fcoarray=none" +! CHECK: "-fconvert=foobar" +! CHECK: "-fcray-pointer" +! CHECK: "-fd-lines-as-code" +! CHECK: "-fd-lines-as-comments" +! CHECK: "-fdefault-double-8" +! CHECK: "-fdefault-integer-8" +! CHECK: "-fdefault-real-8" +! CHECK: "-fdollar-ok" +! CHECK: "-fdump-fortran-optimized" +! CHECK: "-fdump-fortran-original" +! CHECK: "-fdump-parse-tree" +! CHECK: "-fexternal-blas" +! CHECK: "-ff2c" +! CHECK: "-ffixed-form" +! CHECK: "-ffixed-line-length-42" +! CHECK: "-ffpe-trap=list" +! CHECK: "-ffree-form" +! CHECK: "-ffree-line-length-42" +! CHECK: "-ffrontend-optimize" +! CHECK: "-fimplicit-none" +! CHECK: "-finit-character=n" +! CHECK: "-finit-integer=n" +! CHECK: "-finit-local-zero" +! CHECK: "-finit-logical=false" +! CHECK: "-finit-real=zero" +! CHECK: "-finteger-4-integer-8" +! CHECK: "-fintrinsic-modules-path" +! CHECK: "-fmax-array-constructor=42" +! CHECK: "-fmax-errors=42" +! CHECK: "-fmax-identifier-length" +! CHECK: "-fmax-stack-var-size=42" +! CHECK: "-fmax-subrecord-length=42" +! CHECK: "-fmodule-private" +! CHECK: "-fopenmp" +! CHECK: "-fpack-derived" +! CHECK: "-fprotect-parens" +! CHECK: "-frange-check" +! CHECK: "-freal-4-real-10" +! CHECK: "-freal-4-real-16" +! CHECK: "-freal-4-real-8" +! CHECK: "-freal-8-real-10" +! CHECK: "-freal-8-real-16" +! CHECK: "-freal-8-real-4" +! CHECK: "-frealloc-lhs" +! CHECK: "-frecord-marker=42" +! CHECK: "-frecursive" +! CHECK: "-frepack-arrays" +! CHECK: "-fsecond-underscore" +! CHECK: "-fshort-enums" +! CHECK: "-fsign-zero" +! CHECK: "-fstack-arrays" +! CHECK: "-funderscoring" +! CHECK: "-fwhole-file" +! CHECK: "-fworking-directory" +! CHECK: "-imultilib" +! CHECK: "-iprefix" +! CHECK: "-iquote" +! CHECK: "-isysroot" +! CHECK: "-isystem" +! CHECK: "-nocpp" +! CHECK: "-nostdinc" +! CHECK: "-pedantic" +! CHECK: "-pedantic-errors" +! CHECK: "-static-libgfortran" +! CHECK: "-std=f90" +! CHECK: "-undef" +! +! Clang understands this one and orders it weirdly. +! CHECK: "-fsyntax-only" diff --git a/test/Driver/lit.local.cfg b/test/Driver/lit.local.cfg index a62ea1a099..c836f20fe5 100644 --- a/test/Driver/lit.local.cfg +++ b/test/Driver/lit.local.cfg @@ -1 +1 @@ -config.suffixes = ['.c', '.cpp', '.h', '.m', '.mm', '.S', '.s'] +config.suffixes = ['.c', '.cpp', '.h', '.m', '.mm', '.S', '.s', '.f90', '.f95']