Hi all,

Andrew Stubbs wrote:
On 26/01/2024 07:29, Richard Biener wrote:
If you link against prebuilt objects with COV 5 it seems there's no way to
override the COV version GCC uses?  That is, do we want to add
a -mcode-object-version=... option to allow the user to override this
(and ABI_VERSION_SPEC honoring that, if specified and of course
mkoffload following suit)?

For completeness, I added such a feature, see attachment. (Actually, '=0' could be permitted for mkoffload without "-g" debugging enabled.)

However, the real problem is that one usually also has libraries build with the default such as libc, libm, libgomp, ... Thus, specifying anything else but GCC's default is likely to break.

Hence and also because of the following, I think it doesn't make sense to add:

We don't have a stable ABI, so trying to link against foreign binaries is already a problem. Most recently, the SIMD clone implementation required a change to the procedure calling ABI, the reverse-offload changes reimplemented the stack setup, and the low-latency memory patches changed the way we use local memories and needed more info passed into the device runtime. I expect more of this in future.


PS: The original patch has been committed as r14-8449-g4b5650acb31072.

Tobias
amdgcn: Add -mcode-object-version= to override the default

For fiji, GCC defaults to Code Object V3 and otherwiese to V4;
the -mcode-object-version= flag permits to override it to the
specified version, which is passed on the the assembler.
Using -mcode-object-version=0, no COV is passed to the assembler,
using its default. - Note that all files including libraries must
be build with the same ABI version and that GCN'S mkoffload must
know the version number for handle debugging symbols.

gcc/ChangeLog:

	* config/gcn/gcn-hsa.h (ABI_VERSION_SPEC): Update for
	-mcode-object-version=
	* config/gcn/gcn.opt (mcode-object-version=): Add.
	* doc/invoke.texi (gcn): Add -mcode-object-version=.
	* config/gcn/mkoffload.cc (copy_early_debug_info,
	main): Handle mcode-object-version=.

 gcc/config/gcn/gcn-hsa.h    | 11 +++++++++--
 gcc/config/gcn/gcn.opt      |  4 ++++
 gcc/config/gcn/mkoffload.cc | 18 ++++++++++++++++--
 gcc/doc/invoke.texi         |  4 ++++
 4 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/gcc/config/gcn/gcn-hsa.h b/gcc/config/gcn/gcn-hsa.h
index e5b93f7d9e5..79ee4171ce2 100644
--- a/gcc/config/gcn/gcn-hsa.h
+++ b/gcc/config/gcn/gcn-hsa.h
@@ -81,8 +81,15 @@ extern unsigned int gcn_local_sym_hash (const char *name);
    same. - LLVM <= 17 defaults to 4 while LLVM >= 18 defaults to 5.
    GCC supports LLVM >= 13.0.1 and only LLVM >= 14 supports version 5.
    Note that Fiji is only suppored with LLVM <= 17 as version 3 i no longer
-   supported in LLVM >= 18.  */
-#define ABI_VERSION_SPEC "march=fiji:--amdhsa-code-object-version=3;" \
+   supported in LLVM >= 18.
+
+   This can be overridden by -mcode-object-version; we permit = 0 to fall
+   back to the assembler default - which has issues with mkoffload, see above.
+   Otherwise, we use the provided value.  */
+
+#define ABI_VERSION_SPEC "mcode-object-version=0:;" \
+			 "mcode-object-version=*:--amdhsa-code-object-version=%*;" \
+			 "march=fiji:--amdhsa-code-object-version=3;" \
 			 "!march=*|march=*:--amdhsa-code-object-version=4"
 
 /* Note that the XNACK and SRAM-ECC settings must match those in mkoffload.cc
diff --git a/gcc/config/gcn/gcn.opt b/gcc/config/gcn/gcn.opt
index 842fd36d25c..874ff085134 100644
--- a/gcc/config/gcn/gcn.opt
+++ b/gcc/config/gcn/gcn.opt
@@ -54,6 +54,10 @@ mtune=
 Target RejectNegative Negative(mtune=) Joined ToLower Enum(gpu_type) Var(gcn_tune) Init(PROCESSOR_FIJI)
 Specify the name of the target GPU.
 
+mcode-object-version=
+Target RejectNegative Joined UInteger
+Override the used code object version
+
 m32
 Target RejectNegative InverseMask(ABI64)
 Generate code for a 32-bit ABI.
diff --git a/gcc/config/gcn/mkoffload.cc b/gcc/config/gcn/mkoffload.cc
index 0d0e7bac9b2..6cbf3dc5873 100644
--- a/gcc/config/gcn/mkoffload.cc
+++ b/gcc/config/gcn/mkoffload.cc
@@ -128,6 +128,7 @@ uint32_t elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX900;  // Default GPU architecture.
 uint32_t elf_flags = EF_AMDGPU_FEATURE_SRAMECC_ANY_V4;
 
 static int gcn_stack_size = 0;  /* Zero means use default.  */
+static int code_object_version = -1;  /* Negative means default.  */
 
 /* Delete tempfiles.  */
 
@@ -351,7 +352,10 @@ copy_early_debug_info (const char *infile, const char *outfile)
 
   /* Patch the correct elf architecture flag into the file.  */
   ehdr.e_ident[7] = ELFOSABI_AMDGPU_HSA;
-  ehdr.e_ident[8] = (elf_arch == EF_AMDGPU_MACH_AMDGCN_GFX803
+  /* The ABI version; code object V1 had no version, V2 is 0, V3 is 1 etc. */
+  ehdr.e_ident[8] = (code_object_version >= 2
+		     ? code_object_version - 2
+		     : elf_arch == EF_AMDGPU_MACH_AMDGCN_GFX803
 		     ? ELFABIVERSION_AMDGPU_HSA_V3
 		     : ELFABIVERSION_AMDGPU_HSA_V4);
   ehdr.e_type = ET_REL;
@@ -972,6 +976,10 @@ main (int argc, char **argv)
 	elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX1030;
       else if (strcmp (argv[i], "-march=gfx1100") == 0)
 	elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX1100;
+#define STR "-mcode-object-version="
+      else if (startswith (argv[i], STR))
+	code_object_version = atoi (argv[i] + strlen (STR));
+#undef STR
 #define STR "-mstack-size="
       else if (startswith (argv[i], STR))
 	gcn_stack_size = atoi (argv[i] + strlen (STR));
@@ -994,6 +1002,11 @@ main (int argc, char **argv)
     fatal_error (input_location,
 		 "either %<-fopenacc%> or %<-fopenmp%> must be set");
 
+  if (code_object_version >= 0 && code_object_version < 2)
+    fatal_error (input_location,
+		 "version %d in %<-mcode-object-version=%> is not supported "
+		 "for offloading", code_object_version);
+
   const char *abi;
   switch (offload_abi)
     {
@@ -1162,7 +1175,8 @@ main (int argc, char **argv)
       for (int i = 1; i < argc; i++)
 	if (startswith (argv[i], "-l")
 	    || startswith (argv[i], "-Wl")
-	    || startswith (argv[i], "-march"))
+	    || startswith (argv[i], "-march")
+	    || startswith (argv[i], "-mcode-object-version="))
 	  obstack_ptr_grow (&ld_argv_obstack, argv[i]);
 
       obstack_ptr_grow (&cc_argv_obstack, "-dumpdir");
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 6ec56493e59..4b237de6baa 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -21768,6 +21768,10 @@ configure XNACK.  The compiled code must match the device mode.
 The default is @samp{-mxnack=any} on devices that support Unified Shared
 Memory, and @samp{-mxnack=no} otherwise.
 
+@opindex mcode-object-version
+@item -mcode-object-version=@var{n}
+Override the default for the AMDHSA Code Object Version (COV).
+
 @end table
 
 @node ARC Options

Reply via email to