| EF_AMDGPU_FEATURE_XNACK_ANY_V4)
#define SET_XNACK_OFF(VAR) VAR = ((VAR & ~EF_AMDGPU_FEATURE_XNACK_V4) \
| EF_AMDGPU_FEATURE_XNACK_OFF_V4)
+#define SET_XNACK_UNSET(VAR) VAR = ((VAR & ~EF_AMDGPU_FEATURE_XNACK_V4) \
+ | EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4)
#define TEST_XNACK_ANY(VAR) ((VAR & EF_AMDGPU_FEATURE_XNACK_V4) \
== EF_AMDGPU_FEATURE_XNACK_ANY_V4)
#define TEST_XNACK_ON(VAR) ((VAR & EF_AMDGPU_FEATURE_XNACK_V4) \
| EF_AMDGPU_FEATURE_SRAMECC_ANY_V4)
#define SET_SRAM_ECC_OFF(VAR) VAR = ((VAR & ~EF_AMDGPU_FEATURE_SRAMECC_V4) \
| EF_AMDGPU_FEATURE_SRAMECC_OFF_V4)
-#define SET_SRAM_ECC_UNSUPPORTED(VAR) \
+#define SET_SRAM_ECC_UNSET(VAR) \
VAR = ((VAR & ~EF_AMDGPU_FEATURE_SRAMECC_V4) \
| EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4)
#define TEST_SRAM_ECC_ANY(VAR) ((VAR & EF_AMDGPU_FEATURE_SRAMECC_V4) \
== EF_AMDGPU_FEATURE_SRAMECC_ANY_V4)
#define TEST_SRAM_ECC_ON(VAR) ((VAR & EF_AMDGPU_FEATURE_SRAMECC_V4) \
== EF_AMDGPU_FEATURE_SRAMECC_ON_V4)
+#define TEST_SRAM_ECC_UNSET(VAR) ((VAR & EF_AMDGPU_FEATURE_SRAMECC_V4) == 0)
#ifndef R_AMDGPU_NONE
#define R_AMDGPU_NONE 0
enum offload_abi offload_abi = OFFLOAD_ABI_UNSET;
uint32_t elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX900; // Default GPU architecture.
-uint32_t elf_flags = EF_AMDGPU_FEATURE_SRAMECC_ANY_V4;
+uint32_t elf_flags = EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4;
static int gcn_stack_size = 0; /* Zero means use default. */
/* Fiji devices use HSACOv3 regardless of the assembler. */
uint32_t elf_flags_actual = (elf_arch == EF_AMDGPU_MACH_AMDGCN_GFX803
? 0 : elf_flags);
- /* GFX900 devices don't support the sramecc attribute even if
- a buggy assembler thinks it does. This must match gcn-hsa.h */
- if (elf_arch == EF_AMDGPU_MACH_AMDGCN_GFX900)
- SET_SRAM_ECC_UNSUPPORTED (elf_flags_actual);
/* Patch the correct elf architecture flag into the file. */
ehdr.e_ident[7] = ELFOSABI_AMDGPU_HSA;
gcc_unreachable ();
}
- /* Disable XNACK mode on architectures where it doesn't work (well).
- Set default to "any" otherwise. */
+ /* This must match gcn-hsa.h's settings for NO_XNACK, NO_SRAM_ECC
+ and ASM_SPEC. */
switch (elf_arch)
{
case EF_AMDGPU_MACH_AMDGCN_GFX803:
+ case EF_AMDGPU_MACH_AMDGCN_GFX1030:
+ case EF_AMDGPU_MACH_AMDGCN_GFX1100:
+ SET_XNACK_UNSET (elf_flags);
+ SET_SRAM_ECC_UNSET (elf_flags);
+ break;
case EF_AMDGPU_MACH_AMDGCN_GFX900:
+ SET_XNACK_OFF (elf_flags);
+ SET_SRAM_ECC_UNSET (elf_flags);
+ break;
case EF_AMDGPU_MACH_AMDGCN_GFX906:
+ SET_XNACK_OFF (elf_flags);
+ SET_SRAM_ECC_ANY (elf_flags);
+ break;
case EF_AMDGPU_MACH_AMDGCN_GFX908:
- case EF_AMDGPU_MACH_AMDGCN_GFX1030:
- case EF_AMDGPU_MACH_AMDGCN_GFX1100:
SET_XNACK_OFF (elf_flags);
+ if (TEST_SRAM_ECC_UNSET (elf_flags))
+ SET_SRAM_ECC_ANY (elf_flags);
break;
case EF_AMDGPU_MACH_AMDGCN_GFX90a:
if (TEST_XNACK_UNSET (elf_flags))
SET_XNACK_ANY (elf_flags);
+ if (TEST_SRAM_ECC_UNSET (elf_flags))
+ SET_SRAM_ECC_ANY (elf_flags);
break;
default:
fatal_error (input_location, "unhandled architecture");
}
obstack_ptr_grow (&ld_argv_obstack, gcn_s2_name);
obstack_ptr_grow (&ld_argv_obstack, "-lgomp");
- obstack_ptr_grow (&ld_argv_obstack,
- (TEST_XNACK_ON (elf_flags) ? "-mxnack=on"
- : TEST_XNACK_ANY (elf_flags) ? "-mxnack=any"
- : "-mxnack=off"));
- obstack_ptr_grow (&ld_argv_obstack,
- (TEST_SRAM_ECC_ON (elf_flags) ? "-msram-ecc=on"
- : TEST_SRAM_ECC_ANY (elf_flags) ? "-msram-ecc=any"
- : "-msram-ecc=off"));
+ if (!TEST_XNACK_UNSET (elf_flags))
+ obstack_ptr_grow (&ld_argv_obstack,
+ (TEST_XNACK_ON (elf_flags) ? "-mxnack=on"
+ : TEST_XNACK_ANY (elf_flags) ? "-mxnack=any"
+ : "-mxnack=off"));
+ if (!TEST_SRAM_ECC_UNSET (elf_flags))
+ obstack_ptr_grow (&ld_argv_obstack,
+ (TEST_SRAM_ECC_ON (elf_flags) ? "-msram-ecc=on"
+ : TEST_SRAM_ECC_ANY (elf_flags) ? "-msram-ecc=any"
+ : "-msram-ecc=off"));
if (verbose)
obstack_ptr_grow (&ld_argv_obstack, "-v");