diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2023-06-05 11:26:37 +0200 |
---|---|---|
committer | Thomas Schwinge <thomas@codesourcery.com> | 2023-06-14 11:41:45 +0200 |
commit | 4bcb46b3ade1796c5a57b294f5cca25f00671cac (patch) | |
tree | f2dc223b7d68c446d43ff13e89cae8584ec23128 /gcc | |
parent | e76af2162c7b768ef0a913d485c51a80b08a1020 (diff) | |
download | gcc-4bcb46b3ade1796c5a57b294f5cca25f00671cac.zip gcc-4bcb46b3ade1796c5a57b294f5cca25f00671cac.tar.gz gcc-4bcb46b3ade1796c5a57b294f5cca25f00671cac.tar.bz2 |
driver: Forward '-lgfortran', '-lm' to offloading compilation
..., so that users don't manually need to specify
'-foffload-options=-lgfortran', '-foffload-options=-lm' in addition to
'-lgfortran', '-lm' (specified manually, or implicitly by the driver).
gcc/
* gcc.cc (driver_handle_option): Forward host '-lgfortran', '-lm'
to offloading compilation.
* config/gcn/mkoffload.cc (main): Adjust.
* config/nvptx/mkoffload.cc (main): Likewise.
* doc/invoke.texi (foffload-options): Update example.
libgomp/
* testsuite/libgomp.fortran/fortran.exp (lang_link_flags): Don't
set.
* testsuite/libgomp.oacc-fortran/fortran.exp (lang_link_flags):
Likewise.
* testsuite/libgomp.c/simd-math-1.c: Remove
'-foffload-options=-lm'.
* testsuite/libgomp.fortran/fortran-torture_execute_math.f90:
Likewise.
* testsuite/libgomp.oacc-fortran/fortran-torture_execute_math.f90:
Likewise.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/gcn/mkoffload.cc | 12 | ||||
-rw-r--r-- | gcc/config/nvptx/mkoffload.cc | 12 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 5 | ||||
-rw-r--r-- | gcc/gcc.cc | 56 |
4 files changed, 82 insertions, 3 deletions
diff --git a/gcc/config/gcn/mkoffload.cc b/gcc/config/gcn/mkoffload.cc index 988c123..8b608bf 100644 --- a/gcc/config/gcn/mkoffload.cc +++ b/gcc/config/gcn/mkoffload.cc @@ -946,6 +946,18 @@ main (int argc, char **argv) else if (startswith (argv[i], STR)) gcn_stack_size = atoi (argv[i] + strlen (STR)); #undef STR + /* Translate host into offloading libraries. */ + else if (strcmp (argv[i], "-l_GCC_gfortran") == 0 + || strcmp (argv[i], "-l_GCC_m") == 0) + { + /* Elide '_GCC_'. */ + size_t i_dst = strlen ("-l"); + size_t i_src = strlen ("-l_GCC_"); + char c; + do + c = argv[i][i_dst++] = argv[i][i_src++]; + while (c != '\0'); + } } if (!(fopenacc ^ fopenmp)) diff --git a/gcc/config/nvptx/mkoffload.cc b/gcc/config/nvptx/mkoffload.cc index 6cdea45..aaea9fb 100644 --- a/gcc/config/nvptx/mkoffload.cc +++ b/gcc/config/nvptx/mkoffload.cc @@ -649,6 +649,18 @@ main (int argc, char **argv) else if (strcmp (argv[i], "-dumpbase") == 0 && i + 1 < argc) dumppfx = argv[++i]; + /* Translate host into offloading libraries. */ + else if (strcmp (argv[i], "-l_GCC_gfortran") == 0 + || strcmp (argv[i], "-l_GCC_m") == 0) + { + /* Elide '_GCC_'. */ + size_t i_dst = strlen ("-l"); + size_t i_src = strlen ("-l_GCC_"); + char c; + do + c = argv[i][i_dst++] = argv[i][i_src++]; + while (c != '\0'); + } } if (!(fopenacc ^ fopenmp)) fatal_error (input_location, "either %<-fopenacc%> or %<-fopenmp%> " diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8fa3f9f..9ecbd32 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -2716,9 +2716,8 @@ the @option{-foffload-options=@var{target-list}=@var{options}} form. The Typical command lines are @smallexample --foffload-options=-lgfortran -foffload-options=-lm --foffload-options="-lgfortran -lm" -foffload-options=nvptx-none=-latomic --foffload-options=amdgcn-amdhsa=-march=gfx906 -foffload-options=-lm +-foffload-options='-fno-math-errno -ffinite-math-only' -foffload-options=nvptx-none=-latomic +-foffload-options=amdgcn-amdhsa=-march=gfx906 -foffload-options=-O3 @end smallexample @opindex fopenacc @@ -47,6 +47,9 @@ compilation is specified by a string called a "spec". */ #include "opts-jobserver.h" #include "common/common-target.h" +#ifndef MATH_LIBRARY +#define MATH_LIBRARY "m" +#endif /* Manage the manipulation of env vars. @@ -4117,6 +4120,48 @@ next_item: } } +/* Forward certain options to offloading compilation. */ + +static void +forward_offload_option (size_t opt_index, const char *arg, bool validated) +{ + switch (opt_index) + { + case OPT_l: + /* Use a '_GCC_' prefix and standard name ('-l_GCC_m' irrespective of the + host's 'MATH_LIBRARY', for example), so that the 'mkoffload's can tell + this has been synthesized here, and translate/drop as necessary. */ + /* Note that certain libraries ('-lc', '-lgcc', '-lgomp', for example) + are injected by default in offloading compilation, and therefore not + forwarded here. */ + /* GCC libraries. */ + if (/* '-lgfortran' */ strcmp (arg, "gfortran") == 0 ) + save_switch (concat ("-foffload-options=-l_GCC_", arg, NULL), + 0, NULL, validated, true); + /* Other libraries. */ + else + { + /* The case will need special consideration where on the host + '!need_math', but for offloading compilation still need + '-foffload-options=-l_GCC_m'. The problem is that we don't get + here anything like '-lm', because it's not synthesized in + 'gcc/fortran/gfortranspec.cc:lang_specific_driver', for example. + Generally synthesizing '-foffload-options=-l_GCC_m' etc. in the + language specific drivers is non-trivial, needs very careful + review of their options handling. However, this issue is not + actually relevant for the current set of supported host/offloading + configurations. */ + int need_math = (MATH_LIBRARY[0] != '\0'); + if (/* '-lm' */ (need_math && strcmp (arg, MATH_LIBRARY) == 0)) + save_switch ("-foffload-options=-l_GCC_m", + 0, NULL, validated, true); + } + break; + default: + gcc_unreachable (); + } +} + /* Handle a driver option; arguments and return value as for handle_option. */ @@ -4375,6 +4420,17 @@ driver_handle_option (struct gcc_options *opts, /* POSIX allows separation of -l and the lib arg; canonicalize by concatenating -l with its arg */ add_infile (concat ("-l", arg, NULL), "*"); + + /* Forward to offloading compilation '-l[...]' flags for standard, + well-known libraries. */ + /* Doing this processing here means that we don't get to see libraries + injected via specs, such as '-lquadmath' injected via + '[build]/[target]/libgfortran/libgfortran.spec'. However, this issue + is not actually relevant for the current set of host/offloading + configurations. */ + if (ENABLE_OFFLOADING) + forward_offload_option (opt_index, arg, validated); + do_save = false; break; |