; Options for the ARM 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.

mabi=
Target RejectNegative Joined Var(target_abi_name)
Specify an ABI

mabort-on-noreturn
Target Report Mask(ABORT_NORETURN)
Generate a call to abort if a noreturn function returns

mapcs
Target RejectNegative Mask(APCS_FRAME) MaskExists Undocumented

mapcs-float
Target Report Mask(APCS_FLOAT)
Pass FP arguments in FP registers

mapcs-frame
Target Report Mask(APCS_FRAME)
Generate APCS conformant stack frames

mapcs-reentrant
Target Report Mask(APCS_REENT)
Generate re-entrant, PIC code

mapcs-stack-check
Target Report Mask(APCS_STACK) Undocumented

march=
Target RejectNegative Joined
Specify the name of the target architecture

marm
Target RejectNegative InverseMask(THUMB) Undocumented

mbig-endian
Target Report RejectNegative Mask(BIG_END)
Assume target CPU is configured as big endian

mcallee-super-interworking
Target Report Mask(CALLEE_INTERWORKING)
Thumb: Assume non-static functions may be called from ARM code

mcaller-super-interworking
Target Report Mask(CALLER_INTERWORKING)
Thumb: Assume function pointers may go to non-Thumb aware code

mcirrus-fix-invalid-insns
Target Report Mask(CIRRUS_FIX_INVALID_INSNS)
Cirrus: Place NOPs to avoid invalid instruction combinations

mcpu=
Target RejectNegative Joined
Specify the name of the target CPU

mfloat-abi=
Target RejectNegative Joined Var(target_float_abi_name)
Specify if floating point hardware should be used

mfp=
Target RejectNegative Joined Undocumented Var(target_fpe_name)

;; Now ignored.
mfpe
Target RejectNegative Mask(FPE) Undocumented

mfpe=
Target RejectNegative Joined Undocumented Var(target_fpe_name)

mfpu=
Target RejectNegative Joined Var(target_fpu_name)
Specify the name of the target floating point hardware/format

mhard-float
Target RejectNegative
Alias for -mfloat-abi=hard

mlittle-endian
Target Report RejectNegative InverseMask(BIG_END)
Assume target CPU is configured as little endian

; APPLE LOCAL begin mlong-branch for arm
mlong-branch
Target Mask(LONG_CALLS)
Alias for -mlong-calls
; APPLE LOCAL end mlong-branch for arm

; APPLE LOCAL begin mlong-branch for arm
mlong-calls
Target Report Mask(LONG_CALLS) MaskExists
Generate call insns as indirect calls, if necessary
; APPLE LOCAL end mlong-branch for arm

; APPLE LOCAL begin mlong-branch for arm
mlongcall
Target Mask(LONG_CALLS) MaskExists
Alias for -mlong-calls
; APPLE LOCAL end mlong-branch for arm

mpic-register=
Target RejectNegative Joined Var(arm_pic_register_string)
Specify the register to be used for PIC addressing

mpoke-function-name
Target Report Mask(POKE_FUNCTION_NAME)
Store function names in object code

msched-prolog
Target Report Mask(SCHED_PROLOG)
Permit scheduling of a function's prologue sequence

msingle-pic-base
Target Report Mask(SINGLE_PIC_BASE)
Do not load the PIC register in function prologues

msoft-float
Target RejectNegative
Alias for -mfloat-abi=soft

mstructure-size-boundary=
Target RejectNegative Joined Var(structure_size_string)
Specify the minimum bit alignment of structures

mthumb
Target Report Mask(THUMB)
Compile for the Thumb not the ARM

; APPLE LOCAL begin ARM interworking
mthumb-interwork
Target Report Var(interwork_option) Init(-1)
Support calls between Thumb and ARM instruction sets
; APPLE LOCAL end ARM interworking

mtp=
Target RejectNegative Joined Var(target_thread_switch)
Specify how to access the thread pointer

mtpcs-frame
Target Report Mask(TPCS_FRAME)
Thumb: Generate (non-leaf) stack frames even if not needed

mtpcs-leaf-frame
Target Report Mask(TPCS_LEAF_FRAME)
Thumb: Generate (leaf) stack frames even if not needed

mtune=
Target RejectNegative Joined
Tune code for the given processor

mwords-little-endian
Target Report RejectNegative Mask(LITTLE_WORDS)
Assume big endian bytes, little endian words

; APPLE LOCAL begin 5946347 ms_struct support
mms-bitfields
Target Report Mask(MS_BITFIELD_LAYOUT)
Use Microsoft structure layout
; APPLE LOCAL end 5946347 ms_struct support
