https://gcc.gnu.org/g:b2460d621efe740bd95ad41afef6d806ec1bd9c7
commit r14-9770-gb2460d621efe740bd95ad41afef6d806ec1bd9c7 Author: Tobias Burnus <tbur...@baylibre.com> Date: Wed Apr 3 12:37:39 2024 +0200 GCN: Fix --with-arch= handling in mkoffload [PR111966] The default -march= setting used in mkoffload did not reflect the modified default set by GCC's configure-time --with-arch=, causing issues when generating debug code. gcc/ChangeLog: PR other/111966 * config/gcn/mkoffload.cc (get_arch): New; moved -march= flag handling from ... (main): ... here; call it to handle --with-arch config option and -march= commandline. Diff: --- gcc/config/gcn/mkoffload.cc | 90 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 18 deletions(-) diff --git a/gcc/config/gcn/mkoffload.cc b/gcc/config/gcn/mkoffload.cc index 04356b86195..9a438de331a 100644 --- a/gcc/config/gcn/mkoffload.cc +++ b/gcc/config/gcn/mkoffload.cc @@ -35,6 +35,8 @@ #include "gomp-constants.h" #include "simple-object.h" #include "elf.h" +#include "configargs.h" /* For configure_default_options. */ +#include "multilib.h" /* For multilib_options. */ /* These probably won't (all) be in elf.h for a while. */ #undef EM_AMDGPU @@ -846,6 +848,62 @@ compile_native (const char *infile, const char *outfile, const char *compiler, obstack_free (&argv_obstack, NULL); } +static int +get_arch (const char *str, const char *with_arch_str) +{ + if (strcmp (str, "fiji") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX803; + else if (strcmp (str, "gfx900") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX900; + else if (strcmp (str, "gfx906") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX906; + else if (strcmp (str, "gfx908") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX908; + else if (strcmp (str, "gfx90a") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX90a; + else if (strcmp (str, "gfx1030") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX1030; + else if (strcmp (str, "gfx1036") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX1036; + else if (strcmp (str, "gfx1100") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX1100; + else if (strcmp (str, "gfx1103") == 0) + return EF_AMDGPU_MACH_AMDGCN_GFX1103; + + error ("unrecognized argument in option %<-march=%s%>", str); + + /* The suggestions are based on the configured multilib support; the compiler + itself might support more. */ + if (multilib_options[0] != '\0') + { + /* Example: "march=gfx900/march=gfx906" */ + char *args = (char *) alloca (strlen (multilib_options)); + const char *p = multilib_options, *q = NULL; + args[0] = '\0'; + while (true) + { + p = strchr (p, '='); + if (!p) + break; + if (q) + strcat (args, ", "); + ++p; + q = strchr (p, '/'); + if (q) + strncat (args, p, q-p); + else + strcat (args, p); + } + inform (UNKNOWN_LOCATION, "valid arguments to %<-march=%> are: %s", args); + } + else if (with_arch_str) + inform (UNKNOWN_LOCATION, "valid argument to %<-march=%> is %qs", with_arch_str); + + exit (FATAL_EXIT_CODE); + + return 0; +} + int main (int argc, char **argv) { @@ -853,9 +911,21 @@ main (int argc, char **argv) FILE *out = stdout; FILE *cfile = stdout; const char *outname = 0; + const char *with_arch_str = NULL; progname = tool_name; + gcc_init_libintl (); diagnostic_initialize (global_dc, 0); + diagnostic_color_init (global_dc); + + for (size_t i = 0; i < ARRAY_SIZE (configure_default_options); i++) + if (configure_default_options[i].name != NULL + && strcmp (configure_default_options[i].name, "arch") == 0) + { + with_arch_str = configure_default_options[0].value; + elf_arch = get_arch (configure_default_options[0].value, NULL); + break; + } obstack_init (&files_to_cleanup); if (atexit (mkoffload_cleanup) != 0) @@ -961,24 +1031,8 @@ main (int argc, char **argv) else if (strcmp (argv[i], "-dumpbase") == 0 && i + 1 < argc) dumppfx = argv[++i]; - else if (strcmp (argv[i], "-march=fiji") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX803; - else if (strcmp (argv[i], "-march=gfx900") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX900; - else if (strcmp (argv[i], "-march=gfx906") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX906; - else if (strcmp (argv[i], "-march=gfx908") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX908; - else if (strcmp (argv[i], "-march=gfx90a") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX90a; - else if (strcmp (argv[i], "-march=gfx1030") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX1030; - else if (strcmp (argv[i], "-march=gfx1036") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX1036; - else if (strcmp (argv[i], "-march=gfx1100") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX1100; - else if (strcmp (argv[i], "-march=gfx1103") == 0) - elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX1103; + else if (startswith (argv[i], "-march=")) + elf_arch = get_arch (argv[i] + strlen ("-march="), with_arch_str); #define STR "-mstack-size=" else if (startswith (argv[i], STR)) gcn_stack_size = atoi (argv[i] + strlen (STR));