This patch, for the "gcn" branch, does three things:

1. Add specs to drive the LLVM assembler and linker. It requires them to be installed as "as" and "ld", under $target/bin, but then the compiler Just Works with these specs.

2. Switch to HSACO format version 2, and have the assembler auto-set the architecture flags from -mcpu. This means the amdphdr utility is no longer required.

3. Add -mgpu option and corresponding --with-gpu. I've deliberately used "gpu" instead of "cpu" because I want offloading compilers to be able to say "-mcpu=foo -foffload=-mgpu=bar", or even have the host compiler just understand -mgpu and DTRT.

The patch also removes the unused and unwritten "arch" and "tune" settings. They can be added back when useful, but the assembler requires a GPU name, I think, so we need that as input.

OK to commit to GCN branch?

Andrew

commit 5058457b0fa07865b366832828e74a53e5bd2964
Author: Andrew Stubbs <a...@codesourcery.com>
Date:   Fri Apr 28 14:37:25 2017 +0100

    Add -mgpu
    
    2017-04-28  Andrew Stubbs  <a...@codesourcery.com>
    
    	gcc/
    	* config.gcc (amdgcn): Remove --with-arch and --with-tune.
    	Add --with-gpu, and set default to "carrizo"
    	(add_defaults): Add "gpu".
    	* config/gcn/gcn-opts.h: New file.
    	* config/gcn/gcn.c (output_file_start): Switch to HSACO version
    	2 and auto-detection of GPU type (from -mcpu).
    	(gcn_arch, gcn_tune): Remove.
    	* config/gcn/gcn.h: Include gcn-opts.h.
    	(enum processor_type): Move to gcn-opts.h.
    	(LIBGCC_SPEC, ASM_SPEC, LINK_SPEC): Define.
    	(gcn_arch, gcn_tune): Remove.
    	(OPTION_DEFAULT_SPECS): Remove "arch" and "tune"; add "gpu".
    	* config/gcn/gcn.opt: Include gcn-opts.h.
    	(gpu_type): New Enum.
    	(mgpu): New option.

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 4a77b66..b1df533 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -3901,20 +3901,20 @@ case "${target}" in
 		;;
 
 	amdgcn-*-*)
-		supported_defaults="arch tune"
+		supported_defaults="gpu"
 
-		for which in arch tune; do
-			eval "val=\$with_$which"
-			case ${val} in
-			"" | fiji)
-				# OK
-				;;
-			*)
-				echo "Unknown cpu used in --with-$which=$val." 1>&2
-				exit 1
-				;;
-			esac
-		done
+		case "$with_gpu" in
+		"")
+			with_gpu=carrizo
+			;;
+		carrizo | fiji)
+			# OK
+			;;
+		*)
+			echo "Unknown gpu used in --with-gpu=$val." 1>&2
+			exit 1
+			;;
+		esac
 		;;
 
 	hppa*-*-*)
@@ -4646,7 +4646,7 @@ case ${target} in
 esac
 
 t=
-all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu nan fp_32 odd_spreg_32 divide llsc mips-plt synci tls lxc1-sxc1 madd4"
+all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu nan fp_32 odd_spreg_32 divide llsc mips-plt synci tls lxc1-sxc1 madd4 gpu"
 for option in $all_defaults
 do
 	eval "val=\$with_"`echo $option | sed s/-/_/g`
diff --git a/gcc/config/gcn/gcn-opts.h b/gcc/config/gcn/gcn-opts.h
new file mode 100644
index 0000000..d0586d6
--- /dev/null
+++ b/gcc/config/gcn/gcn-opts.h
@@ -0,0 +1,27 @@
+/* Copyright (C) 2016-2017 Free Software Foundation, Inc.
+
+   This file is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 3 of the License, or (at your option)
+   any later version.
+
+   This file is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+   for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef GCN_OPTS_H
+#define GCN_OPTS_H
+
+/* Which processor to generate code or schedule for.  */
+enum processor_type
+{
+  PROCESSOR_CARRIZO,
+  PROCESSOR_FIJI
+};
+
+#endif
diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
index eb6edd8..f378bf8 100644
--- a/gcc/config/gcn/gcn.c
+++ b/gcc/config/gcn/gcn.c
@@ -60,11 +60,6 @@
 /* This file should be included last.  */
 #include "target-def.h"
 
-/* Which instruction set architecture to use.  */
-int gcn_arch;
-/* Which cpu are we tuning for.  */
-int gcn_tune;
-
 static REAL_VALUE_TYPE dconst4, dconst1over2pi;
 static bool ext_gcn_constants_init = 0;
 
@@ -2006,8 +2001,8 @@ static void
 output_file_start (void)
 {
   fprintf (asm_out_file, "\t.hsatext\n");
-  fprintf (asm_out_file, "\t.hsa_code_object_version 1,0\n");
-  fprintf (asm_out_file, "\t.hsa_code_object_isa 8,0,1,\"AMD\",\"AMDGPU\"\n");
+  fprintf (asm_out_file, "\t.hsa_code_object_version 2,0\n");
+  fprintf (asm_out_file, "\t.hsa_code_object_isa\n");  // Autodetect
   fprintf (asm_out_file, "\t.section\t.AMDGPU.config\n");
   fprintf (asm_out_file, "\t.hsatext\n");
 }
diff --git a/gcc/config/gcn/gcn.h b/gcc/config/gcn/gcn.h
index 903022f..a3f9463 100644
--- a/gcc/config/gcn/gcn.h
+++ b/gcc/config/gcn/gcn.h
@@ -14,25 +14,28 @@
    along with GCC; see the file COPYING3.  If not see
    <http://www.gnu.org/licenses/>.  */
 
+#include "config/gcn/gcn-opts.h"
+
 
 /* FIXME */
 #define TARGET_CPU_CPP_BUILTINS()
 
-/* Which processor to generate code or schedule for.  */
-enum processor_type
-{
-  PROCESSOR_CARRIZO,
-};
+/* Temporarily disable libgcc until one actually exists.  */
+#undef  LIBGCC_SPEC
+#define LIBGCC_SPEC ""
+
+/* Use LLVM assembler options.  */
+#undef ASM_SPEC
+#define ASM_SPEC "-triple=amdgcn--amdhsa %{mgpu=*:-mcpu=%*} -filetype=obj"
 
-extern GTY(()) int gcn_arch;
-extern GTY(()) int gcn_tune;
+/* Default to relocatable executables as output.  */
+#undef LINK_SPEC
+#define LINK_SPEC "-shared"
 
 /* Support for a compile-time default architecture and tuning.  The rules are:
-   --with-arch is ignored if -march is specified.
-   --with-tune is ignored if -mtune is specified.  */
+   --with-gpu is ignored if -mgpu is specified.  */
 #define OPTION_DEFAULT_SPECS \
-  {"arch", "%{!march=*:-march=%(VALUE)}" }, \
-  {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }
+  {"gpu", "%{!mgpu=*:-mgpu=%(VALUE)}"}
 
 /* Default target_flags if no switches specified.  */
 #ifndef TARGET_DEFAULT
diff --git a/gcc/config/gcn/gcn.opt b/gcc/config/gcn/gcn.opt
index 8fc02b7..77f0ef0 100644
--- a/gcc/config/gcn/gcn.opt
+++ b/gcc/config/gcn/gcn.opt
@@ -17,3 +17,20 @@
 ; You should have received a copy of the GNU General Public License
 ; along with GCC; see the file COPYING3.  If not see
 ; <http://www.gnu.org/licenses/>.
+
+HeaderInclude
+config/gcn/gcn-opts.h
+
+Enum
+Name(gpu_type) Type(enum processor_type)
+GCN GPU type to use:
+
+EnumValue
+Enum(gpu_type) String(carrizo) Value(PROCESSOR_CARRIZO)
+
+EnumValue
+Enum(gpu_type) String(fiji) Value(PROCESSOR_FIJI)
+
+mgpu=
+Target RejectNegative Joined ToLower Enum(gpu_type) Var(gcn_gpu) Init(PROCESSOR_CARRIZO)
+Specify the name of the target GPU.

Reply via email to