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.