aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tburnus@baylibre.com>2024-04-03 12:37:39 +0200
committerTobias Burnus <tburnus@baylibre.com>2024-04-03 12:37:39 +0200
commitb2460d621efe740bd95ad41afef6d806ec1bd9c7 (patch)
tree9f8d532b4fb41c3985b1a6b23da277aaa78299e6
parent8455d6f6cd43b7b143ab9ee19437452fceba9cc9 (diff)
downloadgcc-b2460d621efe740bd95ad41afef6d806ec1bd9c7.zip
gcc-b2460d621efe740bd95ad41afef6d806ec1bd9c7.tar.gz
gcc-b2460d621efe740bd95ad41afef6d806ec1bd9c7.tar.bz2
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.
-rw-r--r--gcc/config/gcn/mkoffload.cc90
1 files changed, 72 insertions, 18 deletions
diff --git a/gcc/config/gcn/mkoffload.cc b/gcc/config/gcn/mkoffload.cc
index 04356b8..9a438de 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));