diff --git a/gcc/collect-utils.c b/gcc/collect-utils.c index e85843bc862..d4fa2c3d345 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 e7c955f219c..6ff7d9d96df 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 4a99d70e312..14f422e5c6d 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 803b5851338..efdf9b9980d 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 8fbca7cabc4..939a83ac73a 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 00000000000..ec0d7a605eb --- /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 +# . + +# 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 69e4e7c843c..be457f7b09f 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 76a28d036a8..e51085cb47e 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]" "" } } diff --git a/libgomp/testsuite/lib/libgomp-dg.exp b/libgomp/testsuite/lib/libgomp-dg.exp index 726b924d67f..ebf78e17e6d 100644 --- a/libgomp/testsuite/lib/libgomp-dg.exp +++ b/libgomp/testsuite/lib/libgomp-dg.exp @@ -1,12 +1,4 @@ proc libgomp-dg-test { prog do_what extra_tool_flags } { - # Force the dumpbase for test.c to test.o, such that scan-offload-*-dump - # will work. - foreach opt $extra_tool_flags { - if { [regexp ^-foffload=-fdump- $opt] } { - lappend extra_tool_flags "-save-temps" - } - } - return [gcc-dg-test-1 libgomp_target_compile $prog $do_what $extra_tool_flags] } diff --git a/libgomp/testsuite/lib/libgomp.exp b/libgomp/testsuite/lib/libgomp.exp index ee5f0e57b19..8ccb78f42c1 100644 --- a/libgomp/testsuite/lib/libgomp.exp +++ b/libgomp/testsuite/lib/libgomp.exp @@ -30,6 +30,7 @@ load_gcc_lib scanlang.exp load_gcc_lib scanrtl.exp load_gcc_lib scantree.exp load_gcc_lib scanltranstree.exp +load_gcc_lib scanoffload.exp load_gcc_lib scanoffloadtree.exp load_gcc_lib scanoffloadrtl.exp load_gcc_lib scanipa.exp