aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/collect-utils.c1
-rw-r--r--gcc/collect-utils.h1
-rw-r--r--gcc/config/gcn/mkoffload.c51
-rw-r--r--gcc/config/nvptx/mkoffload.c31
-rw-r--r--gcc/lto-wrapper.c13
-rw-r--r--gcc/testsuite/lib/scanoffload.exp45
-rw-r--r--gcc/testsuite/lib/scanoffloadrtl.exp49
-rw-r--r--gcc/testsuite/lib/scanoffloadtree.exp51
8 files changed, 184 insertions, 58 deletions
diff --git a/gcc/collect-utils.c b/gcc/collect-utils.c
index e85843b..d4fa2c3 100644
--- a/gcc/collect-utils.c
+++ b/gcc/collect-utils.c
@@ -34,6 +34,7 @@ static char *response_file;
bool debug;
bool verbose;
bool save_temps;
+const char *dumppfx;
/* Notify user of a non-error. */
diff --git a/gcc/collect-utils.h b/gcc/collect-utils.h
index e7c955f..6ff7d9d 100644
--- a/gcc/collect-utils.h
+++ b/gcc/collect-utils.h
@@ -37,6 +37,7 @@ extern void utils_cleanup (bool);
extern bool debug;
extern bool verbose;
extern bool save_temps;
+extern const char *dumppfx;
/* Provided by the tool itself. */
diff --git a/gcc/config/gcn/mkoffload.c b/gcc/config/gcn/mkoffload.c
index 4a99d70..14f422e 100644
--- a/gcc/config/gcn/mkoffload.c
+++ b/gcc/config/gcn/mkoffload.c
@@ -41,6 +41,7 @@ static const char *gcn_s1_name;
static const char *gcn_s2_name;
static const char *gcn_o_name;
static const char *gcn_cfile_name;
+static const char *gcn_dumpbase;
enum offload_abi offload_abi = OFFLOAD_ABI_UNSET;
@@ -496,6 +497,12 @@ compile_native (const char *infile, const char *outfile, const char *compiler)
obstack_ptr_grow (&argv_obstack, "-save-temps");
if (verbose)
obstack_ptr_grow (&argv_obstack, "-v");
+ obstack_ptr_grow (&argv_obstack, "-dumpdir");
+ obstack_ptr_grow (&argv_obstack, "");
+ obstack_ptr_grow (&argv_obstack, "-dumpbase");
+ obstack_ptr_grow (&argv_obstack, gcn_dumpbase);
+ obstack_ptr_grow (&argv_obstack, "-dumpbase-ext");
+ obstack_ptr_grow (&argv_obstack, ".c");
switch (offload_abi)
{
case OFFLOAD_ABI_LP64:
@@ -611,6 +618,9 @@ main (int argc, char **argv)
save_temps = true;
else if (strcmp (argv[i], "-v") == 0)
verbose = true;
+ else if (strcmp (argv[i], "-dumpbase") == 0
+ && i + 1 < argc)
+ dumppfx = argv[++i];
}
if (!(fopenacc ^ fopenmp))
fatal_error (input_location, "either -fopenacc or -fopenmp must be set");
@@ -628,11 +638,6 @@ main (int argc, char **argv)
gcc_unreachable ();
}
- gcn_s1_name = make_temp_file (".mkoffload.1.s");
- gcn_s2_name = make_temp_file (".mkoffload.2.s");
- gcn_o_name = make_temp_file (".mkoffload.hsaco");
- gcn_cfile_name = make_temp_file (".c");
-
/* Build arguments for compiler pass. */
struct obstack cc_argv_obstack;
obstack_init (&cc_argv_obstack);
@@ -656,6 +661,35 @@ main (int argc, char **argv)
obstack_ptr_grow (&cc_argv_obstack, argv[ix]);
}
+ if (!dumppfx)
+ dumppfx = outname;
+
+ const char *mko_dumpbase = concat (dumppfx, ".mkoffload", NULL);
+ const char *hsaco_dumpbase = concat (dumppfx, ".mkoffload.hsaco", NULL);
+ gcn_dumpbase = concat (dumppfx, ".c", NULL);
+
+ if (save_temps)
+ {
+ gcn_s1_name = concat (mko_dumpbase, ".1.s", NULL);
+ gcn_s2_name = concat (mko_dumpbase, ".2.s", NULL);
+ gcn_o_name = hsaco_dumpbase;
+ gcn_cfile_name = gcn_dumpbase;
+ }
+ else
+ {
+ gcn_s1_name = make_temp_file (".mkoffload.1.s");
+ gcn_s2_name = make_temp_file (".mkoffload.2.s");
+ gcn_o_name = make_temp_file (".mkoffload.hsaco");
+ gcn_cfile_name = make_temp_file (".c");
+ }
+
+ obstack_ptr_grow (&cc_argv_obstack, "-dumpdir");
+ obstack_ptr_grow (&cc_argv_obstack, "");
+ obstack_ptr_grow (&cc_argv_obstack, "-dumpbase");
+ obstack_ptr_grow (&cc_argv_obstack, mko_dumpbase);
+ obstack_ptr_grow (&cc_argv_obstack, "-dumpbase-ext");
+ obstack_ptr_grow (&cc_argv_obstack, "");
+
obstack_ptr_grow (&cc_argv_obstack, "-o");
obstack_ptr_grow (&cc_argv_obstack, gcn_s1_name);
obstack_ptr_grow (&cc_argv_obstack, NULL);
@@ -674,6 +708,13 @@ main (int argc, char **argv)
|| strncmp (argv[i], "-march", 6) == 0)
obstack_ptr_grow (&ld_argv_obstack, argv[i]);
+ obstack_ptr_grow (&cc_argv_obstack, "-dumpdir");
+ obstack_ptr_grow (&cc_argv_obstack, "");
+ obstack_ptr_grow (&cc_argv_obstack, "-dumpbase");
+ obstack_ptr_grow (&cc_argv_obstack, hsaco_dumpbase);
+ obstack_ptr_grow (&cc_argv_obstack, "-dumpbase-ext");
+ obstack_ptr_grow (&cc_argv_obstack, "");
+
obstack_ptr_grow (&ld_argv_obstack, "-o");
obstack_ptr_grow (&ld_argv_obstack, gcn_o_name);
obstack_ptr_grow (&ld_argv_obstack, NULL);
diff --git a/gcc/config/nvptx/mkoffload.c b/gcc/config/nvptx/mkoffload.c
index 803b585..efdf9b9 100644
--- a/gcc/config/nvptx/mkoffload.c
+++ b/gcc/config/nvptx/mkoffload.c
@@ -55,6 +55,7 @@ static id_map *var_ids, **vars_tail = &var_ids;
/* Files to unlink. */
static const char *ptx_name;
static const char *ptx_cfile_name;
+static const char *ptx_dumpbase;
enum offload_abi offload_abi = OFFLOAD_ABI_UNSET;
@@ -369,6 +370,12 @@ compile_native (const char *infile, const char *outfile, const char *compiler)
obstack_ptr_grow (&argv_obstack, "-save-temps");
if (verbose)
obstack_ptr_grow (&argv_obstack, "-v");
+ obstack_ptr_grow (&argv_obstack, "-dumpdir");
+ obstack_ptr_grow (&argv_obstack, "");
+ obstack_ptr_grow (&argv_obstack, "-dumpbase");
+ obstack_ptr_grow (&argv_obstack, ptx_dumpbase);
+ obstack_ptr_grow (&argv_obstack, "-dumpbase-ext");
+ obstack_ptr_grow (&argv_obstack, ".c");
switch (offload_abi)
{
case OFFLOAD_ABI_LP64:
@@ -486,6 +493,9 @@ main (int argc, char **argv)
save_temps = true;
else if (strcmp (argv[i], "-v") == 0)
verbose = true;
+ else if (strcmp (argv[i], "-dumpbase") == 0
+ && i + 1 < argc)
+ dumppfx = argv[++i];
}
if (!(fopenacc ^ fopenmp))
fatal_error (input_location, "either %<-fopenacc%> or %<-fopenmp%> "
@@ -521,7 +531,14 @@ main (int argc, char **argv)
obstack_ptr_grow (&argv_obstack, argv[ix]);
}
- ptx_cfile_name = make_temp_file (".c");
+ if (!dumppfx)
+ dumppfx = outname;
+
+ ptx_dumpbase = concat (dumppfx, ".c", NULL);
+ if (save_temps)
+ ptx_cfile_name = ptx_dumpbase;
+ else
+ ptx_cfile_name = make_temp_file (".c");
out = fopen (ptx_cfile_name, "w");
if (!out)
@@ -531,7 +548,17 @@ main (int argc, char **argv)
configurations. */
if (offload_abi == OFFLOAD_ABI_LP64)
{
- ptx_name = make_temp_file (".mkoffload");
+ char *mko_dumpbase = concat (dumppfx, ".mkoffload", NULL);
+ if (save_temps)
+ ptx_name = mko_dumpbase;
+ else
+ ptx_name = make_temp_file (".mkoffload");
+ obstack_ptr_grow (&argv_obstack, "-dumpdir");
+ obstack_ptr_grow (&argv_obstack, "");
+ obstack_ptr_grow (&argv_obstack, "-dumpbase");
+ obstack_ptr_grow (&argv_obstack, mko_dumpbase);
+ obstack_ptr_grow (&argv_obstack, "-dumpbase-ext");
+ obstack_ptr_grow (&argv_obstack, "");
obstack_ptr_grow (&argv_obstack, "-o");
obstack_ptr_grow (&argv_obstack, ptx_name);
obstack_ptr_grow (&argv_obstack, NULL);
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index 8fbca7c..939a83a 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -830,6 +830,7 @@ compile_offload_image (const char *target, const char *compiler_path,
unsigned int linker_opt_count)
{
char *filename = NULL;
+ char *dumpbase;
char **argv;
char *suffix
= XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
@@ -853,8 +854,13 @@ compile_offload_image (const char *target, const char *compiler_path,
"could not find %s in %s (consider using %<-B%>)",
suffix + 1, compiler_path);
+ dumpbase = concat (dumppfx, "x", target, NULL);
+
/* Generate temporary output file name. */
- filename = make_temp_file (".target.o");
+ if (save_temps)
+ filename = concat (dumpbase, ".o", NULL);
+ else
+ filename = make_temp_file (".target.o");
struct obstack argv_obstack;
obstack_init (&argv_obstack);
@@ -875,6 +881,9 @@ compile_offload_image (const char *target, const char *compiler_path,
compiler_opt_count);
append_diag_options (&argv_obstack, linker_opts, linker_opt_count);
+ obstack_ptr_grow (&argv_obstack, "-dumpbase");
+ obstack_ptr_grow (&argv_obstack, dumpbase);
+
/* Append options specified by -foffload last. In case of conflicting
options we expect offload compiler to choose the latest. */
append_offload_options (&argv_obstack, target, compiler_opts,
@@ -1298,7 +1307,7 @@ run_gcc (unsigned argc, char *argv[])
bool linker_output_rel = false;
bool skip_debug = false;
unsigned n_debugobj;
- const char *dumppfx = NULL, *incoming_dumppfx = NULL;
+ const char *incoming_dumppfx = dumppfx = NULL;
static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
/* Get the driver and options. */
diff --git a/gcc/testsuite/lib/scanoffload.exp b/gcc/testsuite/lib/scanoffload.exp
new file mode 100644
index 0000000..ec0d7a6
--- /dev/null
+++ b/gcc/testsuite/lib/scanoffload.exp
@@ -0,0 +1,45 @@
+# Copyright (C) 2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Utility for scanning offloading dump output, used by libgomp.exp.
+
+# Format an offload dump suffix given the offload target name in
+# OFFTGT and any suffix, probably empty, in SUFFIX.
+proc scoff-format { offtgt suffix } {
+ return ".x$offtgt.mkoffload$suffix"
+}
+
+# Wrapper for scan procs.
+# Argument 0 is the index of the argument to replace when calling
+# argument 1 with the remaining arguments. Use end-1 or end or so.
+proc scoff { args } {
+ set idx [lindex $args 0]
+ set prc [lindex $args 1]
+ set args [lreplace $args 0 1]
+
+ global offload_target
+ if [info exists offload_target] {
+ set target $offload_target
+ if { "$target" != "disable" } {
+ eval $prc [lreplace $args $idx $idx "[scoff-format $target [lindex $args $idx]]"]
+ }
+ } else {
+ global offload_targets
+ foreach target [split $offload_targets ","] {
+ eval $prc [lreplace $args $idx $idx "[scoff-format $target [lindex $args $idx]]"]
+ }
+ }
+}
diff --git a/gcc/testsuite/lib/scanoffloadrtl.exp b/gcc/testsuite/lib/scanoffloadrtl.exp
index 69e4e7c..be457f7 100644
--- a/gcc/testsuite/lib/scanoffloadrtl.exp
+++ b/gcc/testsuite/lib/scanoffloadrtl.exp
@@ -18,6 +18,7 @@
# libgomp.exp.
load_lib scandump.exp
+load_lib scanoffload.exp
# Utility for scanning compiler result, invoked via dg-final.
# Call pass if pattern is present, otherwise fail.
@@ -36,12 +37,12 @@ proc scan-offload-rtl-dump { args } {
return
}
if { [llength $args] >= 3 } {
- scan-dump "offload-rtl" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ".o" \
- [lindex $args 2]
+ scoff end-1 scan-dump "offload-rtl" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" "" \
+ [lindex $args 2]
} else {
- scan-dump "offload-rtl" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ".o"
+ scoff end scan-dump "offload-rtl" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ""
}
}
@@ -61,12 +62,12 @@ proc scan-offload-rtl-dump-times { args } {
return
}
if { [llength $args] >= 4 } {
- scan-dump-times "offload-rtl" [lindex $args 0] [lindex $args 1] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 2]" ".o" \
+ scoff end-1 scan-dump-times "offload-rtl" [lindex $args 0] \
+ [lindex $args 1] "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 2]" "" \
[lindex $args 3]
} else {
- scan-dump-times "offload-rtl" [lindex $args 0] [lindex $args 1] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 2]" ".o"
+ scoff end scan-dump-times "offload-rtl" [lindex $args 0] \
+ [lindex $args 1] "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 2]" ""
}
}
@@ -86,12 +87,12 @@ proc scan-offload-rtl-dump-not { args } {
return
}
if { [llength $args] >= 3 } {
- scan-dump-not "offload-rtl" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ".o" \
- [lindex $args 2]
+ scoff end-1 scan-dump-not "offload-rtl" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" "" \
+ [lindex $args 2]
} else {
- scan-dump-not "offload-rtl" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ".o"
+ scoff end scan-dump-not "offload-rtl" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ""
}
}
@@ -112,12 +113,12 @@ proc scan-offload-rtl-dump-dem { args } {
return
}
if { [llength $args] >= 3 } {
- scan-dump-dem "offload-rtl" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ".o" \
- [lindex $args 2]
+ scoff end-1 scan-dump-dem "offload-rtl" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" "" \
+ [lindex $args 2]
} else {
- scan-dump-dem "offload-rtl" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ".o"
+ scoff end scan-dump-dem "offload-rtl" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ""
}
}
@@ -137,11 +138,11 @@ proc scan-offload-rtl-dump-dem-not { args } {
return
}
if { [llength $args] >= 3 } {
- scan-dump-dem-not "offload-rtl" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ".o" \
- [lindex $args 2]
+ scoff end-1 scan-dump-dem-not "offload-rtl" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" "" \
+ [lindex $args 2]
} else {
- scan-dump-dem-not "offload-rtl" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ".o"
+ scoff end scan-dump-dem-not "offload-rtl" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]r.[lindex $args 1]" ""
}
}
diff --git a/gcc/testsuite/lib/scanoffloadtree.exp b/gcc/testsuite/lib/scanoffloadtree.exp
index 76a28d0..e51085c 100644
--- a/gcc/testsuite/lib/scanoffloadtree.exp
+++ b/gcc/testsuite/lib/scanoffloadtree.exp
@@ -18,6 +18,7 @@
# libgomp.exp.
load_lib scandump.exp
+load_lib scanoffload.exp
# Utility for scanning compiler result, invoked via dg-final.
# Call pass if pattern is present, otherwise fail.
@@ -36,12 +37,12 @@ proc scan-offload-tree-dump { args } {
return
}
if { [llength $args] >= 3 } {
- scan-dump "offload-tree" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ".o" \
- [lindex $args 2]
+ scoff end-1 scan-dump "offload-tree" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" "" \
+ [lindex $args 2]
} else {
- scan-dump "offload-tree" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ".o"
+ scoff end scan-dump "offload-tree" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ""
}
}
@@ -61,12 +62,12 @@ proc scan-offload-tree-dump-times { args } {
return
}
if { [llength $args] >= 4 } {
- scan-dump-times "offload-tree" [lindex $args 0] [lindex $args 1] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 2]" ".o" \
- [lindex $args 3]
+ scoff end-1 scan-dump-times "offload-tree" [lindex $args 0] \
+ [lindex $args 1] "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 2]" "" \
+ [lindex $args 3]
} else {
- scan-dump-times "offload-tree" [lindex $args 0] [lindex $args 1] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 2]" ".o"
+ scoff end scan-dump-times "offload-tree" [lindex $args 0] \
+ [lindex $args 1] "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 2]" ""
}
}
@@ -86,12 +87,12 @@ proc scan-offload-tree-dump-not { args } {
return
}
if { [llength $args] >= 3 } {
- scan-dump-not "offload-tree" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ".o" \
- [lindex $args 2]
+ scoff end-1 scan-dump-not "offload-tree" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" "" \
+ [lindex $args 2]
} else {
- scan-dump-not "offload-tree" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ".o"
+ scoff end scan-dump-not "offload-tree" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ""
}
}
@@ -112,12 +113,12 @@ proc scan-offload-tree-dump-dem { args } {
return
}
if { [llength $args] >= 3 } {
- scan-dump-dem "offload-tree" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ".o" \
- [lindex $args 2]
+ scoff end-1 scan-dump-dem "offload-tree" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" "" \
+ [lindex $args 2]
} else {
- scan-dump-dem "offload-tree" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ".o"
+ scoff end scan-dump-dem "offload-tree" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ""
}
}
@@ -137,11 +138,11 @@ proc scan-offload-tree-dump-dem-not { args } {
return
}
if { [llength $args] >= 3 } {
- scan-dump-dem-not "offload-tree" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ".o" \
- [lindex $args 2]
+ scoff end-1 scan-dump-dem-not "offload-tree" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" "" \
+ [lindex $args 2]
} else {
- scan-dump-dem-not "offload-tree" [lindex $args 0] \
- "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ".o"
+ scoff end scan-dump-dem-not "offload-tree" [lindex $args 0] \
+ "\[0-9\]\[0-9\]\[0-9]t.[lindex $args 1]" ""
}
}