; Options for the GCN port of the compiler.

; Copyright (C) 2016-2022 Free Software Foundation, Inc.
;
; This file is part of GCC.
;
; GCC 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, or (at your option) any later
; version.
;
; GCC 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/>.

HeaderInclude
config/gcn/gcn-opts.h

Enum
Name(gpu_type) Type(enum processor_type)
GCN GPU type to use:

EnumValue
Enum(gpu_type) String(fiji) Value(PROCESSOR_FIJI)

EnumValue
Enum(gpu_type) String(gfx900) Value(PROCESSOR_VEGA10)

EnumValue
Enum(gpu_type) String(gfx906) Value(PROCESSOR_VEGA20)

EnumValue
Enum(gpu_type) String(gfx908) Value(PROCESSOR_GFX908)

EnumValue
Enum(gpu_type) String(gfx90a) Value(PROCESSOR_GFX90a)

march=
Target RejectNegative Joined ToLower Enum(gpu_type) Var(gcn_arch) Init(PROCESSOR_FIJI)
Specify the name of the target GPU.

mtune=
Target RejectNegative Joined ToLower Enum(gpu_type) Var(gcn_tune) Init(PROCESSOR_FIJI)
Specify the name of the target GPU.

m32
Target RejectNegative InverseMask(ABI64)
Generate code for a 32-bit ABI.

m64
Target RejectNegative Mask(ABI64)
Generate code for a 64-bit ABI.

mgomp
Target RejectNegative
Enable OpenMP GPU offloading.

bool flag_bypass_init_error = false

mbypass-init-error
Target RejectNegative Var(flag_bypass_init_error)

int stack_size_opt = -1

mstack-size=
Target RejectNegative Joined UInteger Var(stack_size_opt) Init(-1)
-mstack-size=<number>	Set the private segment size per wave-front, in bytes.

int gang_private_size_opt = -1

mgang-private-size=
Target RejectNegative Joined UInteger Var(gang_private_size_opt) Init(-1)
Amount of local data-share (LDS) memory to reserve for gang-private variables.

Wopenacc-dims
Target Var(warn_openacc_dims) Warning
Warn about invalid OpenACC dimensions.

mxnack
Target Var(flag_xnack) Init(0)
Compile for devices requiring XNACK enabled. Default off.

Enum
Name(sram_ecc_type) Type(enum sram_ecc_type)
SRAM-ECC modes:

EnumValue
Enum(sram_ecc_type) String(off) Value(SRAM_ECC_OFF)

EnumValue
Enum(sram_ecc_type) String(on) Value(SRAM_ECC_ON)

EnumValue
Enum(sram_ecc_type) String(any) Value(SRAM_ECC_ANY)

msram-ecc=
Target RejectNegative Joined ToLower Enum(sram_ecc_type) Var(flag_sram_ecc) Init(SRAM_ECC_ANY)
Compile for devices with the SRAM ECC feature enabled, or not. Default \"any\".
