From 601796b14b5bab6715b0ddff23f6d998a310b507 Mon Sep 17 00:00:00 2001 From: Andrew Stubbs Date: Wed, 18 Oct 2023 16:59:42 +0100 Subject: [PATCH 1/2] amdgcn: deprecate Fiji device and multilib To: gcc-patches@gcc.gnu.org LLVM wants to remove it, which breaks our build. This patch means that most users won't notice that change, when it comes, and those that do will have chosen to enable Fiji explicitly. I'm selecting gfx900 as the new default as that's the least likely for users to want, which means most users will specify -march explicitly, which means we'll be free to change the default again, when we need to, without breaking anybody's makefiles. gcc/ChangeLog: * config.gcc (amdgcn): Switch default to --with-arch=gfx900. Implement support for --with-multilib-list. * config/gcn/t-gcn-hsa: Likewise. * doc/install.texi: Likewise. * doc/invoke.texi: Mark Fiji deprecated. --- gcc/config.gcc | 14 +++++++++++++- gcc/config/gcn/t-gcn-hsa | 8 ++++++-- gcc/doc/install.texi | 17 ++++++++++++++++- gcc/doc/invoke.texi | 4 +++- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index c3b73d05eb7..a662cfea03c 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -4475,7 +4475,19 @@ case "${target}" in ;; esac done - [ "x$with_arch" = x ] && with_arch=fiji + [ "x$with_arch" = x ] && with_arch=gfx900 + + case "x${with_multilib_list}" in + x | xno) + TM_MULTILIB_CONFIG= + ;; + xdefault | xyes) + TM_MULTILIB_CONFIG=`echo "gfx900,gfx906,gfx908,gfx90a" | sed "s/${with_arch},\?//;s/,$//"` + ;; + *) + TM_MULTILIB_CONFIG="${with_multilib_list}" + ;; + esac ;; hppa*-*-*) diff --git a/gcc/config/gcn/t-gcn-hsa b/gcc/config/gcn/t-gcn-hsa index ea27122e484..18db7075356 100644 --- a/gcc/config/gcn/t-gcn-hsa +++ b/gcc/config/gcn/t-gcn-hsa @@ -42,8 +42,12 @@ ALL_HOST_OBJS += gcn-run.o gcn-run$(exeext): gcn-run.o +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ $< -ldl -MULTILIB_OPTIONS = march=gfx900/march=gfx906/march=gfx908/march=gfx90a -MULTILIB_DIRNAMES = gfx900 gfx906 gfx908 gfx90a +empty := +space := $(empty) $(empty) +comma := , +multilib_list := $(subst $(comma),$(space),$(TM_MULTILIB_CONFIG)) +MULTILIB_OPTIONS = $(subst $(space),/,$(addprefix march=,$(multilib_list))) +MULTILIB_DIRNAMES = $(multilib_list) gcn-tree.o: $(srcdir)/config/gcn/gcn-tree.cc $(COMPILE) $< diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index b30d3691fe6..5f55da89840 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1218,7 +1218,7 @@ sysv, aix. @itemx --without-multilib-list Specify what multilibs to build. @var{list} is a comma separated list of values, possibly consisting of a single value. Currently only implemented -for aarch64*-*-*, arm*-*-*, loongarch64-*-*, riscv*-*-*, sh*-*-* and +for aarch64*-*-*, amdgcn*-*-*, arm*-*-*, loongarch64-*-*, riscv*-*-*, sh*-*-* and x86-64-*-linux*. The accepted values and meaning for each target is given below. @@ -1232,6 +1232,15 @@ default run-time library will be built. If @var{list} is default set of libraries is selected based on the value of @option{--target}. +@item amdgcn*-*-* +@var{list} is a comma separated list of ISA names (allowed values: @code{fiji}, +@code{gfx900}, @code{gfx906}, @code{gfx908}, @code{gfx90a}). It ought not +include the name of the default ISA, specified via @option{--with-arch}. If +@var{list} is empty, then there will be no multilibs and only the default +run-time library will be built. If @var{list} is @code{default} or +@option{--with-multilib-list=} is not specified, then the default set of +libraries is selected. + @item arm*-*-* @var{list} is a comma separated list of @code{aprofile} and @code{rmprofile} to build multilibs for A or R and M architecture @@ -3876,6 +3885,12 @@ To run the binaries, install the HSA Runtime from the @file{libexec/gcc/amdhsa-amdhsa/@var{version}/gcn-run} to launch them on the GPU. +To enable support for GCN3 Fiji devices (gfx803), GCC has to be configured with +@option{--with-arch=@code{fiji}} or +@option{--with-multilib-list=@code{fiji},...}. Note that support for Fiji +devices has been removed in ROCm 4.0 and support in LLVM is deprecated and will +be removed in the future. + @html
@end html diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 792ce283bb9..5fd30cf5eae 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -20773,7 +20773,9 @@ are @table @samp @item fiji -Compile for GCN3 Fiji devices (gfx803). +Compile for GCN3 Fiji devices (gfx803). Support deprecated; availablility +depends on how GCC has been configured, see @option{--with-arch} and +@option{--with-multilib-list}. @item gfx900 Compile for GCN5 Vega 10 devices (gfx900). -- 2.35.3 From 4217f929357f23a94dec1d3946c84c6194ab385f Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Mon, 22 Jan 2024 12:17:12 +0100 Subject: [PATCH 2/2] [gcn] mkoffload: Fix linking with "-g"; fix file deletion; improve diagnostic [PR111966] To: gcc-patches@gcc.gnu.org With debugging enabled, '*.mkoffload.dbg.o' files are generated. The e_flags header of all *.o files must be the same - otherwise, the linker complains. Since r14-4734-g56ed1055b2f40ac162ae8d382280ac07a33f789f the -march= default is now gfx900. If compiling without any -march= flag, the default value is used by the compiler but not passed to mkoffload. Hence, mkoffload.cc's uses its own default for march - unfortunately, it still had gfx803/fiji as default, leading to the linker error: 'incompatible mach'. Solution: Update the default to gfx900. While debugging it, I saw that /tmp/cc*.mkoffload.dbg.o kept accumulating; there were a couple of issues with the handling: * dbgobj was always added to files_to_cleanup * If copy_early_debug_info returned true, dbgobj was added again -> pointless and in theory a race if the same file was added in the faction of a second. * If copy_early_debug_info returned false, - In exactly one case, it already deleted the file it self (same potential race as above) - The pointer dbgobj was freed - such that files_to_cleanup contained a dangling pointer - probably the reason that stale files remained. Solution: Only if copy_early_debug_info returns true, dbgobj is added to files_to_cleanup. If it returns false, the file is unlinked before freeing the pointer. When compiling, GCC warned about several fatal_error messages as having no %<...%> or %qs quotes. This patch now silences several of those warnings by using those quotes. gcc/ChangeLog: PR other/111966 * config/gcn/mkoffload.cc (elf_arch): Change default to gfx900 to match the compiler default. (simple_object_copy_lto_debug_sections): Never unlink the outfile on error as the caller does so. (maybe_unlink, compile_native): Use %<...%> and %qs in fatal_error. (main): Likewise. Fix 'mkoffload.dbg.o' cleanup. Signed-off-by: Tobias Burnus --- gcc/config/gcn/mkoffload.cc | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/gcc/config/gcn/mkoffload.cc b/gcc/config/gcn/mkoffload.cc index 61bc9273077..57bda59d868 100644 --- a/gcc/config/gcn/mkoffload.cc +++ b/gcc/config/gcn/mkoffload.cc @@ -113,7 +113,7 @@ static const char *gcn_dumpbase; static struct obstack files_to_cleanup; enum offload_abi offload_abi = OFFLOAD_ABI_UNSET; -uint32_t elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX803; // Default GPU architecture. +uint32_t elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX900; // Default GPU architecture. uint32_t elf_flags = (EF_AMDGPU_FEATURE_XNACK_ANY_V4 | EF_AMDGPU_FEATURE_SRAMECC_ANY_V4); @@ -144,7 +144,7 @@ maybe_unlink (const char *file) if (!save_temps) { if (unlink_if_ordinary (file) && errno != ENOENT) - fatal_error (input_location, "deleting file %s: %m", file); + fatal_error (input_location, "deleting file %qs: %m", file); } else if (verbose) fprintf (stderr, "[Leaving %s]\n", file); @@ -310,10 +310,7 @@ copy_early_debug_info (const char *infile, const char *outfile) errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, true); if (errmsg) - { - unlink_if_ordinary (outfile); - return false; - } + return false; simple_object_release_read (inobj); close (infd); @@ -769,7 +766,7 @@ compile_native (const char *infile, const char *outfile, const char *compiler, const char *collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS"); if (!collect_gcc_options) fatal_error (input_location, - "environment variable COLLECT_GCC_OPTIONS must be set"); + "environment variable % must be set"); struct obstack argv_obstack; obstack_init (&argv_obstack); @@ -824,11 +821,11 @@ main (int argc, char **argv) obstack_init (&files_to_cleanup); if (atexit (mkoffload_cleanup) != 0) - fatal_error (input_location, "atexit failed"); + fatal_error (input_location, "% failed"); char *collect_gcc = getenv ("COLLECT_GCC"); if (collect_gcc == NULL) - fatal_error (input_location, "COLLECT_GCC must be set."); + fatal_error (input_location, "% must be set"); const char *gcc_path = dirname (ASTRDUP (collect_gcc)); const char *gcc_exec = basename (ASTRDUP (collect_gcc)); @@ -874,7 +871,7 @@ main (int argc, char **argv) if (!found) fatal_error (input_location, - "offload compiler %s not found", GCC_INSTALL_NAME); + "offload compiler %qs not found", GCC_INSTALL_NAME); /* We may be called with all the arguments stored in some file and passed with @file. Expand them into argv before processing. */ @@ -896,7 +893,7 @@ main (int argc, char **argv) offload_abi = OFFLOAD_ABI_ILP32; else fatal_error (input_location, - "unrecognizable argument of option " STR); + "unrecognizable argument of option %<" STR "%>"); } #undef STR else if (strcmp (argv[i], "-fopenmp") == 0) @@ -941,7 +938,8 @@ main (int argc, char **argv) } if (!(fopenacc ^ fopenmp)) - fatal_error (input_location, "either -fopenacc or -fopenmp must be set"); + fatal_error (input_location, + "either %<-fopenacc%> or %<-fopenmp%> must be set"); const char *abi; switch (offload_abi) @@ -993,7 +991,7 @@ main (int argc, char **argv) cfile = fopen (gcn_cfile_name, "w"); if (!cfile) - fatal_error (input_location, "cannot open '%s'", gcn_cfile_name); + fatal_error (input_location, "cannot open %qs", gcn_cfile_name); /* Currently, we only support offloading in 64-bit configurations. */ if (offload_abi == OFFLOAD_ABI_LP64) @@ -1057,7 +1055,6 @@ main (int argc, char **argv) } else dbgobj = make_temp_file (".mkoffload.dbg.o"); - obstack_ptr_grow (&files_to_cleanup, dbgobj); /* If the copy fails then just ignore it. */ if (copy_early_debug_info (argv[ix], dbgobj)) @@ -1066,7 +1063,10 @@ main (int argc, char **argv) obstack_ptr_grow (&files_to_cleanup, dbgobj); } else - free (dbgobj); + { + maybe_unlink (dbgobj); + free (dbgobj); + } } } } @@ -1140,7 +1140,7 @@ main (int argc, char **argv) out = fopen (gcn_s2_name, "w"); if (!out) - fatal_error (input_location, "cannot open '%s'", gcn_s2_name); + fatal_error (input_location, "cannot open %qs", gcn_s2_name); process_asm (in, out, cfile); -- 2.35.3