; Options for the Argonaut ARC port of the compiler
;
; Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
; Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
; 02110-1301, USA.

malign-loops
Target Undocumented Report Mask(ALIGN_LOOPS)

mbig-endian
Target Undocumented Report RejectNegative Mask(BIG_ENDIAN)

mlittle-endian
Target Undocumented Report RejectNegative InverseMask(BIG_ENDIAN)

mmangle-cpu
Target Report Mask(MANGLE_CPU)
Prepend the name of the cpu to all public symbol names

; mmangle-cpu-libgcc
; Target Undocumented Mask(MANGLE_CPU_LIBGC)

mno-cond-exec
Target Undocumented Report RejectNegative Mask(NO_COND_EXEC)

mcpu=
Target RejectNegative Joined Var(arc_cpu_string) Init("base")
-mcpu=CPU	Compile code for ARC variant CPU

mtext=
Target RejectNegative Joined Var(arc_text_string) Init(ARC_DEFAULT_TEXT_SECTION)
-mtext=SECTION	Put functions in SECTION

mdata=
Target RejectNegative Joined Var(arc_data_string) Init(ARC_DEFAULT_DATA_SECTION)
-mdata=SECTION	Put data in SECTION

mrodata=
Target RejectNegative Joined Var(arc_rodata_string) Init(ARC_DEFAULT_RODATA_SECTION)
-mrodata=SECTION	Put read-only data in SECTION
