aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/config/gcn/mkoffload.cc12
-rw-r--r--gcc/config/nvptx/mkoffload.cc12
-rw-r--r--gcc/doc/invoke.texi5
-rw-r--r--gcc/gcc.cc56
-rw-r--r--libgomp/testsuite/libgomp.c/simd-math-1.c1
-rw-r--r--libgomp/testsuite/libgomp.fortran/fortran-torture_execute_math.f901
-rw-r--r--libgomp/testsuite/libgomp.fortran/fortran.exp2
-rw-r--r--libgomp/testsuite/libgomp.oacc-fortran/fortran-torture_execute_math.f901
-rw-r--r--libgomp/testsuite/libgomp.oacc-fortran/fortran.exp2
9 files changed, 82 insertions, 10 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
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index 38155f8..08bdf28 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -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;
diff --git a/libgomp/testsuite/libgomp.c/simd-math-1.c b/libgomp/testsuite/libgomp.c/simd-math-1.c
index 947bf60..dd2077c 100644
--- a/libgomp/testsuite/libgomp.c/simd-math-1.c
+++ b/libgomp/testsuite/libgomp.c/simd-math-1.c
@@ -4,7 +4,6 @@
/* { dg-do run } */
/* { dg-options "-O2 -ftree-vectorize -fno-math-errno" } */
/* { dg-additional-options -foffload-options=amdgcn-amdhsa=-mstack-size=3000000 { target offload_target_amdgcn } } */
-/* { dg-additional-options -foffload-options=-lm } */
#undef PRINT_RESULT
#define VERBOSE 0
diff --git a/libgomp/testsuite/libgomp.fortran/fortran-torture_execute_math.f90 b/libgomp/testsuite/libgomp.fortran/fortran-torture_execute_math.f90
index 3348a0b..2d0caa6 100644
--- a/libgomp/testsuite/libgomp.fortran/fortran-torture_execute_math.f90
+++ b/libgomp/testsuite/libgomp.fortran/fortran-torture_execute_math.f90
@@ -1,4 +1,3 @@
! { dg-do run }
-! { dg-additional-options -foffload-options=-lm }
include '../../../gcc/testsuite/gfortran.fortran-torture/execute/math.f90'
diff --git a/libgomp/testsuite/libgomp.fortran/fortran.exp b/libgomp/testsuite/libgomp.fortran/fortran.exp
index e69656b..32e4bb2 100644
--- a/libgomp/testsuite/libgomp.fortran/fortran.exp
+++ b/libgomp/testsuite/libgomp.fortran/fortran.exp
@@ -28,7 +28,6 @@ if { $blddir != "" } {
set lang_source_re {^.*\.[fF](|90|95|03|08)$}
set lang_include_flags "-fintrinsic-modules-path=${blddir}"
}
-set lang_link_flags "-foffload=-lgfortran"
lappend ALWAYS_CFLAGS "compiler=$GFORTRAN_UNDER_TEST"
# Initialize dg.
@@ -63,7 +62,6 @@ if { $blddir != "" } {
unset libquadmath_library_path
unset lang_library_paths
}
-unset lang_link_flags
# All done.
dg-finish
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/fortran-torture_execute_math.f90 b/libgomp/testsuite/libgomp.oacc-fortran/fortran-torture_execute_math.f90
index 1b2ac44..edc940c 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/fortran-torture_execute_math.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/fortran-torture_execute_math.f90
@@ -1,5 +1,4 @@
! { dg-do run }
!TODO { dg-prune-output {using 'vector_length \(32\)', ignoring 1} }
-! { dg-additional-options -foffload-options=-lm }
include '../../../gcc/testsuite/gfortran.fortran-torture/execute/math.f90'
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp b/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
index 2e8aa22..e5844ad 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
+++ b/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
@@ -30,7 +30,6 @@ if { $blddir != "" } {
set lang_source_re {^.*\.[fF](|90|95|03|08)$}
set lang_include_flags "-fintrinsic-modules-path=${blddir}"
}
-set lang_link_flags "-foffload=-lgfortran"
lappend ALWAYS_CFLAGS "compiler=$GFORTRAN_UNDER_TEST"
# Initialize dg.
@@ -113,7 +112,6 @@ if { $blddir != "" } {
unset libquadmath_library_path
unset lang_library_paths
}
-unset lang_link_flags
# All done.
dg-finish