gcc - Online Manual Page Of Unix/Linux

  Command: man perldoc info search(apropos)

WebSearch:
Our Recommended Sites: Full-Featured Editor
 

File: gcc.info,  Node: Top,  Next: G++ and GCC,  Up: (DIR)

Introduction
************

This manual documents how to use the GNU compilers, as well as their
features and incompatibilities, and how to report bugs.  It corresponds
to GCC version 3.4.6.  The internals of the GNU compilers, including
how to port them to new targets and some information about how to write
front ends for new languages, are documented in a separate manual.
*Note Introduction: (gccint)Top.

* Menu:

* G++ and GCC::     You can compile C or C++ programs.
* Standards::       Language standards supported by GCC.
* Invoking GCC::    Command options supported by `gcc'.
* C Implementation:: How GCC implements the ISO C specification.
* C Extensions::    GNU extensions to the C language family.
* C++ Extensions::  GNU extensions to the C++ language.
* Objective-C::     GNU Objective-C runtime features.
* Compatibility::   Binary Compatibility
* Gcov::            `gcov'---a test coverage program.
* Trouble::         If you have trouble using GCC.
* Bugs::            How, why and where to report bugs.
* Service::         How to find suppliers of support for GCC.
* Contributing::    How to contribute to testing and developing GCC.

* Funding::         How to help assure funding for free software.
* GNU Project::     The GNU Project and GNU/Linux.

* Copying::         GNU General Public License says
                     how you can copy and share GCC.
* GNU Free Documentation License:: How you can copy and share this manual.
* Contributors::    People who have contributed to GCC.

* Option Index::    Index to command line options.
* Keyword Index::    Index of concepts and symbol names.

File: gcc.info,  Node: G++ and GCC,  Next: Standards,  Prev: Top,  Up: Top

1 Programming Languages Supported by GCC
****************************************

GCC stands for "GNU Compiler Collection".  GCC is an integrated
distribution of compilers for several major programming languages.
These languages currently include C, C++, Objective-C, Java, Fortran,
and Ada.

 The abbreviation "GCC" has multiple meanings in common use.  The
current official meaning is "GNU Compiler Collection", which refers
generically to the complete suite of tools.  The name historically stood
for "GNU C Compiler", and this usage is still common when the emphasis
is on compiling C programs.  Finally, the name is also used when
speaking of the "language-independent" component of GCC: code shared
among the compilers for all supported languages.

 The language-independent component of GCC includes the majority of the
optimizers, as well as the "back ends" that generate machine code for
various processors.

 The part of a compiler that is specific to a particular language is
called the "front end".  In addition to the front ends that are
integrated components of GCC, there are several other front ends that
are maintained separately.  These support languages such as Pascal,
Mercury, and COBOL.  To use these, they must be built together with GCC
proper.

 Most of the compilers for languages other than C have their own names.
The C++ compiler is G++, the Ada compiler is GNAT, and so on.  When we
talk about compiling one of those languages, we might refer to that
compiler by its own name, or as GCC.  Either is correct.

 Historically, compilers for many languages, including C++ and Fortran,
have been implemented as "preprocessors" which emit another high level
language such as C.  None of the compilers included in GCC are
implemented this way; they all generate machine code directly.  This
sort of preprocessor should not be confused with the "C preprocessor",
which is an integral feature of the C, C++, and Objective-C languages.

File: gcc.info,  Node: Standards,  Next: Invoking GCC,  Prev: G++ and GCC,  Up: Top

2 Language Standards Supported by GCC
*************************************

For each language compiled by GCC for which there is a standard, GCC
attempts to follow one or more versions of that standard, possibly with
some exceptions, and possibly with some extensions.

 GCC supports three versions of the C standard, although support for
the most recent version is not yet complete.

 The original ANSI C standard (X3.159-1989) was ratified in 1989 and
published in 1990.  This standard was ratified as an ISO standard
(ISO/IEC 9899:1990) later in 1990.  There were no technical differences
between these publications, although the sections of the ANSI standard
were renumbered and became clauses in the ISO standard.  This standard,
in both its forms, is commonly known as "C89", or occasionally as
"C90", from the dates of ratification.  The ANSI standard, but not the
ISO standard, also came with a Rationale document.  To select this
standard in GCC, use one of the options `-ansi', `-std=c89' or
`-std=iso9899:1990'; to obtain all the diagnostics required by the
standard, you should also specify `-pedantic' (or `-pedantic-errors' if
you want them to be errors rather than warnings).  *Note Options
Controlling C Dialect: C Dialect Options.

 Errors in the 1990 ISO C standard were corrected in two Technical
Corrigenda published in 1994 and 1996.  GCC does not support the
uncorrected version.

 An amendment to the 1990 standard was published in 1995.  This
amendment added digraphs and `__STDC_VERSION__' to the language, but
otherwise concerned the library.  This amendment is commonly known as
"AMD1"; the amended standard is sometimes known as "C94" or "C95".  To
select this standard in GCC, use the option `-std=iso9899:199409'
(with, as for other standard versions, `-pedantic' to receive all
required diagnostics).

 A new edition of the ISO C standard was published in 1999 as ISO/IEC
9899:1999, and is commonly known as "C99".  GCC has incomplete support
for this standard version; see
`http://gcc.gnu.org/gcc-3.4/c99status.html' for details.  To select this
standard, use `-std=c99' or `-std=iso9899:1999'.  (While in
development, drafts of this standard version were referred to as "C9X".)

 Errors in the 1999 ISO C standard were corrected in a Technical
Corrigendum published in 2001.  GCC does not support the uncorrected
version.

 By default, GCC provides some extensions to the C language that on
rare occasions conflict with the C standard.  *Note Extensions to the C
Language Family: C Extensions.  Use of the `-std' options listed above
will disable these extensions where they conflict with the C standard
version selected.  You may also select an extended version of the C
language explicitly with `-std=gnu89' (for C89 with GNU extensions) or
`-std=gnu99' (for C99 with GNU extensions).  The default, if no C
language dialect options are given, is `-std=gnu89'; this will change to
`-std=gnu99' in some future release when the C99 support is complete.
Some features that are part of the C99 standard are accepted as
extensions in C89 mode.

 The ISO C standard defines (in clause 4) two classes of conforming
implementation.  A "conforming hosted implementation" supports the
whole standard including all the library facilities; a "conforming
freestanding implementation" is only required to provide certain
library facilities: those in `<float.h>', `<limits.h>', `<stdarg.h>',
and `<stddef.h>'; since AMD1, also those in `<iso646.h>'; and in C99,
also those in `<stdbool.h>' and `<stdint.h>'.  In addition, complex
types, added in C99, are not required for freestanding implementations.
The standard also defines two environments for programs, a
"freestanding environment", required of all implementations and which
may not have library facilities beyond those required of freestanding
implementations, where the handling of program startup and termination
are implementation-defined, and a "hosted environment", which is not
required, in which all the library facilities are provided and startup
is through a function `int main (void)' or `int main (int, char *[])'.
An OS kernel would be a freestanding environment; a program using the
facilities of an operating system would normally be in a hosted
implementation.

 GCC aims towards being usable as a conforming freestanding
implementation, or as the compiler for a conforming hosted
implementation.  By default, it will act as the compiler for a hosted
implementation, defining `__STDC_HOSTED__' as `1' and presuming that
when the names of ISO C functions are used, they have the semantics
defined in the standard.  To make it act as a conforming freestanding
implementation for a freestanding environment, use the option
`-ffreestanding'; it will then define `__STDC_HOSTED__' to `0' and not
make assumptions about the meanings of function names from the standard
library, with exceptions noted below.  To build an OS kernel, you may
well still need to make your own arrangements for linking and startup.
*Note Options Controlling C Dialect: C Dialect Options.

 GCC does not provide the library facilities required only of hosted
implementations, nor yet all the facilities required by C99 of
freestanding implementations; to use the facilities of a hosted
environment, you will need to find them elsewhere (for example, in the
GNU C library).  *Note Standard Libraries: Standard Libraries.

 Most of the compiler support routines used by GCC are present in
`libgcc', but there are a few exceptions.  GCC requires the
freestanding environment provide `memcpy', `memmove', `memset' and
`memcmp'.  Some older ports of GCC are configured to use the BSD
`bcopy', `bzero' and `bcmp' functions instead, but this is deprecated
for new ports.  Finally, if `__builtin_trap' is used, and the target
does not implement the `trap' pattern, then GCC will emit a call to
`abort'.

 For references to Technical Corrigenda, Rationale documents and
information concerning the history of C that is available online, see
`http://gcc.gnu.org/readings.html'

 There is no formal written standard for Objective-C.  The most
authoritative manual is "Object-Oriented Programming and the
Objective-C Language", available at a number of web sites

   * `http://developer.apple.com/techpubs/macosx/Cocoa/ObjectiveC/' is
     a recent version

   * `http://www.toodarkpark.org/computers/objc/' is an older example

   * `http://www.gnustep.org' has additional useful information

 There is no standard for treelang, which is a sample language front end
for GCC. Its only purpose is as a sample for people wishing to write a
new language for GCC. The language is documented in
`gcc/treelang/treelang.texi' which can be turned into info or HTML
format.

 *Note GNAT Reference Manual: (gnat_rm)Top, for information on standard
conformance and compatibility of the Ada compiler.

 *Note The GNU Fortran Language: (g77)Language, for details of the
Fortran language supported by GCC.

 *Note Compatibility with the Java Platform: (gcj)Compatibility, for
details of compatibility between `gcj' and the Java Platform.

File: gcc.info,  Node: Invoking GCC,  Next: C Implementation,  Prev: Standards,  Up: Top

3 GCC Command Options
*********************

When you invoke GCC, it normally does preprocessing, compilation,
assembly and linking.  The "overall options" allow you to stop this
process at an intermediate stage.  For example, the `-c' option says
not to run the linker.  Then the output consists of object files output
by the assembler.

 Other options are passed on to one stage of processing.  Some options
control the preprocessor and others the compiler itself.  Yet other
options control the assembler and linker; most of these are not
documented here, since you rarely need to use any of them.

 Most of the command line options that you can use with GCC are useful
for C programs; when an option is only useful with another language
(usually C++), the explanation says so explicitly.  If the description
for a particular option does not mention a source language, you can use
that option with all supported languages.

 *Note Compiling C++ Programs: Invoking G++, for a summary of special
options for compiling C++ programs.

 The `gcc' program accepts options and file names as operands.  Many
options have multi-letter names; therefore multiple single-letter
options may _not_ be grouped: `-dr' is very different from `-d -r'.

 You can mix options and other arguments.  For the most part, the order
you use doesn't matter.  Order does matter when you use several options
of the same kind; for example, if you specify `-L' more than once, the
directories are searched in the order specified.

 Many options have long names starting with `-f' or with `-W'--for
example, `-fforce-mem', `-fstrength-reduce', `-Wformat' and so on.
Most of these have both positive and negative forms; the negative form
of `-ffoo' would be `-fno-foo'.  This manual documents only one of
these two forms, whichever one is not the default.

 *Note Option Index::, for an index to GCC's options.

* Menu:

* Option Summary::	Brief list of all options, without explanations.
* Overall Options::     Controlling the kind of output:
                        an executable, object files, assembler files,
                        or preprocessed source.
* Invoking G++::	Compiling C++ programs.
* C Dialect Options::   Controlling the variant of C language compiled.
* C++ Dialect Options:: Variations on C++.
* Objective-C Dialect Options:: Variations on Objective-C.
* Language Independent Options:: Controlling how diagnostics should be
                        formatted.
* Warning Options::     How picky should the compiler be?
* Debugging Options::   Symbol tables, measurements, and debugging dumps.
* Optimize Options::    How much optimization?
* Preprocessor Options:: Controlling header files and macro definitions.
                         Also, getting dependency information for Make.
* Assembler Options::   Passing options to the assembler.
* Link Options::        Specifying libraries and so on.
* Directory Options::   Where to find header files and libraries.
                        Where to find the compiler executable files.
* Spec Files::          How to pass switches to sub-processes.
* Target Options::      Running a cross-compiler, or an old version of GCC.
* Submodel Options::    Specifying minor hardware or convention variations,
                        such as 68010 vs 68020.
* Code Gen Options::    Specifying conventions for function calls, data layout
                        and register usage.
* Environment Variables:: Env vars that affect GCC.
* Precompiled Headers:: Compiling a header once, and using it many times.
* Running Protoize::    Automatically adding or removing function prototypes.

File: gcc.info,  Node: Option Summary,  Next: Overall Options,  Up: Invoking GCC

3.1 Option Summary
==================

Here is a summary of all the options, grouped by type.  Explanations are
in the following sections.

_Overall Options_
     *Note Options Controlling the Kind of Output: Overall Options.
          -c  -S  -E  -o FILE  -pipe  -pass-exit-codes
          -x LANGUAGE  -v  -###  --help  --target-help  --version

_C Language Options_
     *Note Options Controlling C Dialect: C Dialect Options.
          -ansi  -std=STANDARD  -aux-info FILENAME
          -fno-asm  -fno-builtin  -fno-builtin-FUNCTION
          -fhosted  -ffreestanding  -fms-extensions
          -trigraphs  -no-integrated-cpp  -traditional  -traditional-cpp
          -fallow-single-precision  -fcond-mismatch
          -fsigned-bitfields  -fsigned-char
          -funsigned-bitfields  -funsigned-char
          -fwritable-strings

_C++ Language Options_
     *Note Options Controlling C++ Dialect: C++ Dialect Options.
          -fabi-version=N  -fno-access-control  -fcheck-new
          -fconserve-space  -fno-const-strings
          -fno-elide-constructors
          -fno-enforce-eh-specs
          -ffor-scope  -fno-for-scope  -fno-gnu-keywords
          -fno-implicit-templates
          -fno-implicit-inline-templates
          -fno-implement-inlines  -fms-extensions
          -fno-nonansi-builtins  -fno-operator-names
          -fno-optional-diags  -fpermissive
          -frepo  -fno-rtti  -fstats  -ftemplate-depth-N
          -fno-threadsafe-statics  -fuse-cxa-atexit  -fno-weak  -nostdinc++
          -fno-default-inline  -fvisibility-inlines-hidden
          -Wabi  -Wctor-dtor-privacy
          -Wnon-virtual-dtor  -Wreorder
          -Weffc++  -Wno-deprecated
          -Wno-non-template-friend  -Wold-style-cast
          -Woverloaded-virtual  -Wno-pmf-conversions
          -Wsign-promo

_Objective-C Language Options_
     *Note Options Controlling Objective-C Dialect: Objective-C Dialect
     Options.
          -fconstant-string-class=CLASS-NAME
          -fgnu-runtime  -fnext-runtime
          -fno-nil-receivers
          -fobjc-exceptions
          -freplace-objc-classes
          -fzero-link
          -gen-decls
          -Wno-protocol  -Wselector -Wundeclared-selector

_Language Independent Options_
     *Note Options to Control Diagnostic Messages Formatting: Language
     Independent Options.
          -fmessage-length=N
          -fdiagnostics-show-location=[once|every-line]

_Warning Options_
     *Note Options to Request or Suppress Warnings: Warning Options.
          -fsyntax-only  -pedantic  -pedantic-errors
          -w  -Wextra  -Wall  -Waggregate-return
          -Wcast-align  -Wcast-qual  -Wchar-subscripts  -Wcomment
          -Wconversion  -Wno-deprecated-declarations
          -Wdisabled-optimization  -Wno-div-by-zero  -Wendif-labels
          -Werror  -Werror-implicit-function-declaration
          -Wfloat-equal  -Wformat  -Wformat=2
          -Wno-format-extra-args -Wformat-nonliteral
          -Wformat-security  -Wformat-y2k
          -Wimplicit  -Wimplicit-function-declaration  -Wimplicit-int
          -Wimport  -Wno-import  -Winit-self  -Winline
          -Wno-invalid-offsetof  -Winvalid-pch
          -Wlarger-than-LEN  -Wlong-long
          -Wmain  -Wmissing-braces
          -Wmissing-format-attribute  -Wmissing-noreturn
          -Wno-multichar  -Wnonnull  -Wpacked  -Wpadded
          -Wparentheses  -Wpointer-arith  -Wredundant-decls
          -Wreturn-type  -Wsequence-point  -Wshadow
          -Wsign-compare  -Wstrict-aliasing
          -Wswitch  -Wswitch-default  -Wswitch-enum
          -Wsystem-headers  -Wtrigraphs  -Wundef  -Wuninitialized
          -Wunknown-pragmas  -Wunreachable-code
          -Wunused  -Wunused-function  -Wunused-label  -Wunused-parameter
          -Wunused-value  -Wunused-variable  -Wwrite-strings

_C-only Warning Options_
          -Wbad-function-cast  -Wmissing-declarations
          -Wmissing-prototypes  -Wnested-externs  -Wold-style-definition
          -Wstrict-prototypes  -Wtraditional
          -Wdeclaration-after-statement

_Debugging Options_
     *Note Options for Debugging Your Program or GCC: Debugging Options.
          -dLETTERS  -dumpspecs  -dumpmachine  -dumpversion
          -fdump-unnumbered  -fdump-translation-unit[-N]
          -fdump-class-hierarchy[-N]
          -fdump-tree-original[-N]
          -fdump-tree-optimized[-N]
          -fdump-tree-inlined[-N]
          -feliminate-dwarf2-dups -feliminate-unused-debug-types
          -feliminate-unused-debug-symbols -fmem-report -fprofile-arcs
          -frandom-seed=STRING -fsched-verbose=N
          -ftest-coverage  -ftime-report -fvar-tracking
          -g  -gLEVEL  -gcoff -gdwarf-2
          -ggdb  -gstabs  -gstabs+  -gvms  -gxcoff  -gxcoff+
          -p  -pg  -print-file-name=LIBRARY  -print-libgcc-file-name
          -print-multi-directory  -print-multi-lib
          -print-prog-name=PROGRAM  -print-search-dirs  -Q
          -save-temps  -time

_Optimization Options_
     *Note Options that Control Optimization: Optimize Options.
          -falign-functions=N  -falign-jumps=N
          -falign-labels=N  -falign-loops=N
          -fbranch-probabilities -fprofile-values -fvpt -fbranch-target-load-optimize
          -fbranch-target-load-optimize2 -fcaller-saves  -fcprop-registers
          -fcse-follow-jumps  -fcse-skip-blocks  -fdata-sections
          -fdelayed-branch  -fdelete-null-pointer-checks
          -fexpensive-optimizations  -ffast-math  -ffloat-store
          -fforce-addr  -fforce-mem  -ffunction-sections
          -fgcse  -fgcse-lm  -fgcse-sm  -fgcse-las  -floop-optimize
          -fcrossjumping  -fif-conversion  -fif-conversion2
          -finline-functions  -finline-limit=N  -fkeep-inline-functions
          -fkeep-static-consts  -fmerge-constants  -fmerge-all-constants
          -fmove-all-movables  -fnew-ra  -fno-branch-count-reg
          -fno-default-inline  -fno-defer-pop
          -fno-function-cse  -fno-guess-branch-probability
          -fno-inline  -fno-math-errno  -fno-peephole  -fno-peephole2
          -funsafe-math-optimizations  -ffinite-math-only
          -fno-trapping-math  -fno-zero-initialized-in-bss
          -fomit-frame-pointer  -foptimize-register-move
          -foptimize-sibling-calls  -fprefetch-loop-arrays
          -fprofile-generate -fprofile-use
          -freduce-all-givs  -fregmove  -frename-registers
          -freorder-blocks  -freorder-functions
          -frerun-cse-after-loop  -frerun-loop-opt
          -frounding-math -fschedule-insns  -fschedule-insns2
          -fno-sched-interblock  -fno-sched-spec  -fsched-spec-load
          -fsched-spec-load-dangerous
          -fsched-stalled-insns=N -sched-stalled-insns-dep=N
          -fsched2-use-superblocks
          -fsched2-use-traces  -fsignaling-nans
          -fsingle-precision-constant
          -fstrength-reduce  -fstrict-aliasing  -ftracer  -fthread-jumps
          -funroll-all-loops  -funroll-loops  -fpeel-loops
          -funswitch-loops  -fold-unroll-loops  -fold-unroll-all-loops
          --param NAME=VALUE
          -O  -O0  -O1  -O2  -O3  -Os

_Preprocessor Options_
     *Note Options Controlling the Preprocessor: Preprocessor Options.
          -AQUESTION=ANSWER
          -A-QUESTION[=ANSWER]
          -C  -dD  -dI  -dM  -dN
          -DMACRO[=DEFN]  -E  -H
          -idirafter DIR
          -include FILE  -imacros FILE
          -iprefix FILE  -iwithprefix DIR
          -iwithprefixbefore DIR  -isystem DIR
          -M  -MM  -MF  -MG  -MP  -MQ  -MT  -nostdinc
          -P  -fworking-directory  -remap
          -trigraphs  -undef  -UMACRO  -Wp,OPTION
          -Xpreprocessor OPTION

_Assembler Option_
     *Note Passing Options to the Assembler: Assembler Options.
          -Wa,OPTION  -Xassembler OPTION

_Linker Options_
     *Note Options for Linking: Link Options.
          OBJECT-FILE-NAME  -lLIBRARY
          -nostartfiles  -nodefaultlibs  -nostdlib -pie
          -s  -static  -static-libgcc  -shared  -shared-libgcc  -symbolic
          -Wl,OPTION  -Xlinker OPTION
          -u SYMBOL

_Directory Options_
     *Note Options for Directory Search: Directory Options.
          -BPREFIX  -IDIR  -I-  -LDIR  -specs=FILE

_Target Options_
     *Note Target Options::.
          -V VERSION  -b MACHINE

_Machine Dependent Options_
     *Note Hardware Models and Configurations: Submodel Options.

     _M680x0 Options_
          -m68000  -m68020  -m68020-40  -m68020-60  -m68030  -m68040
          -m68060  -mcpu32  -m5200  -m68881  -mbitfield  -mc68000  -mc68020
          -mnobitfield  -mrtd  -mshort  -msoft-float  -mpcrel
          -malign-int  -mstrict-align  -msep-data  -mno-sep-data
          -mshared-library-id=n  -mid-shared-library  -mno-id-shared-library

     _M68hc1x Options_
          -m6811  -m6812  -m68hc11  -m68hc12   -m68hcs12
          -mauto-incdec  -minmax  -mlong-calls  -mshort
          -msoft-reg-count=COUNT

     _VAX Options_
          -mg  -mgnu  -munix

     _SPARC Options_
          -mcpu=CPU-TYPE
          -mtune=CPU-TYPE
          -mcmodel=CODE-MODEL
          -m32  -m64  -mapp-regs  -mno-app-regs
          -mfaster-structs  -mno-faster-structs
          -mflat  -mno-flat  -mfpu  -mno-fpu
          -mhard-float  -msoft-float
          -mhard-quad-float  -msoft-quad-float
          -mimpure-text  -mno-impure-text  -mlittle-endian
          -mstack-bias  -mno-stack-bias
          -munaligned-doubles  -mno-unaligned-doubles
          -mv8plus  -mno-v8plus  -mvis  -mno-vis
          -mcypress  -mf930  -mf934
          -msparclite  -msupersparc  -mv8
          -threads -pthreads

     _ARM Options_
          -mapcs-frame  -mno-apcs-frame
          -mapcs-26  -mapcs-32
          -mapcs-stack-check  -mno-apcs-stack-check
          -mapcs-float  -mno-apcs-float
          -mapcs-reentrant  -mno-apcs-reentrant
          -msched-prolog  -mno-sched-prolog
          -mlittle-endian  -mbig-endian  -mwords-little-endian
          -malignment-traps  -mno-alignment-traps
          -msoft-float  -mhard-float  -mfpe
          -mthumb-interwork  -mno-thumb-interwork
          -mcpu=NAME  -march=NAME  -mfpe=NAME
          -mstructure-size-boundary=N
          -mabort-on-noreturn
          -mlong-calls  -mno-long-calls
          -msingle-pic-base  -mno-single-pic-base
          -mpic-register=REG
          -mnop-fun-dllimport
          -mcirrus-fix-invalid-insns -mno-cirrus-fix-invalid-insns
          -mpoke-function-name
          -mthumb  -marm
          -mtpcs-frame  -mtpcs-leaf-frame
          -mcaller-super-interworking  -mcallee-super-interworking

     _MN10300 Options_
          -mmult-bug  -mno-mult-bug
          -mam33  -mno-am33
          -mam33-2  -mno-am33-2
          -mno-crt0  -mrelax

     _M32R/D Options_
          -m32r2 -m32rx -m32r
          -mdebug
          -malign-loops -mno-align-loops
          -missue-rate=NUMBER
          -mbranch-cost=NUMBER
          -mmodel=CODE-SIZE-MODEL-TYPE
          -msdata=SDATA-TYPE
          -mno-flush-func -mflush-func=NAME
          -mno-flush-trap -mflush-trap=NUMBER
          -G NUM

     _RS/6000 and PowerPC Options_
          -mcpu=CPU-TYPE
          -mtune=CPU-TYPE
          -mpower  -mno-power  -mpower2  -mno-power2
          -mpowerpc  -mpowerpc64  -mno-powerpc
          -maltivec  -mno-altivec
          -mpowerpc-gpopt  -mno-powerpc-gpopt
          -mpowerpc-gfxopt  -mno-powerpc-gfxopt
          -mnew-mnemonics  -mold-mnemonics
          -mfull-toc   -mminimal-toc  -mno-fp-in-toc  -mno-sum-in-toc
          -m64  -m32  -mxl-compat  -mno-xl-compat  -mpe
          -malign-power  -malign-natural
          -msoft-float  -mhard-float  -mmultiple  -mno-multiple
          -mstring  -mno-string  -mupdate  -mno-update
          -mfused-madd  -mno-fused-madd  -mbit-align  -mno-bit-align
          -mstrict-align  -mno-strict-align  -mrelocatable
          -mno-relocatable  -mrelocatable-lib  -mno-relocatable-lib
          -mtoc  -mno-toc  -mlittle  -mlittle-endian  -mbig  -mbig-endian
          -mdynamic-no-pic
          -mprioritize-restricted-insns=PRIORITY
          -msched-costly-dep=DEPENDENCE_TYPE
          -minsert-sched-nops=SCHEME
          -mcall-sysv  -mcall-netbsd
          -maix-struct-return  -msvr4-struct-return
          -mabi=altivec  -mabi=no-altivec
          -mabi=spe  -mabi=no-spe
          -misel=yes  -misel=no
          -mspe=yes  -mspe=no
          -mfloat-gprs=yes  -mfloat-gprs=no
          -mprototype  -mno-prototype
          -msim  -mmvme  -mads  -myellowknife  -memb  -msdata
          -msdata=OPT  -mvxworks  -mwindiss  -G NUM  -pthread

     _Darwin Options_
          -all_load  -allowable_client  -arch  -arch_errors_fatal
          -arch_only  -bind_at_load  -bundle  -bundle_loader
          -client_name  -compatibility_version  -current_version
          -dependency-file  -dylib_file  -dylinker_install_name
          -dynamic  -dynamiclib  -exported_symbols_list
          -filelist  -flat_namespace  -force_cpusubtype_ALL
          -force_flat_namespace  -headerpad_max_install_names
          -image_base  -init  -install_name  -keep_private_externs
          -multi_module  -multiply_defined  -multiply_defined_unused
          -noall_load  -nofixprebinding -nomultidefs  -noprebind  -noseglinkedit
          -pagezero_size  -prebind  -prebind_all_twolevel_modules
          -private_bundle  -read_only_relocs  -sectalign
          -sectobjectsymbols  -whyload  -seg1addr
          -sectcreate  -sectobjectsymbols  -sectorder
          -seg_addr_table  -seg_addr_table_filename  -seglinkedit
          -segprot  -segs_read_only_addr  -segs_read_write_addr
          -single_module  -static  -sub_library  -sub_umbrella
          -twolevel_namespace  -umbrella  -undefined
          -unexported_symbols_list  -weak_reference_mismatches
          -whatsloaded

     _MIPS Options_
          -EL  -EB  -march=ARCH  -mtune=ARCH
          -mips1  -mips2  -mips3  -mips4  -mips32  -mips32r2  -mips64
          -mips16  -mno-mips16  -mabi=ABI  -mabicalls  -mno-abicalls
          -mxgot  -mno-xgot  -membedded-pic  -mno-embedded-pic
          -mgp32  -mgp64  -mfp32  -mfp64  -mhard-float  -msoft-float
          -msingle-float  -mdouble-float  -mint64  -mlong64  -mlong32
          -GNUM  -membedded-data  -mno-embedded-data
          -muninit-const-in-rodata  -mno-uninit-const-in-rodata
          -msplit-addresses  -mno-split-addresses
          -mexplicit-relocs  -mno-explicit-relocs
          -mrnames  -mno-rnames
          -mcheck-zero-division  -mno-check-zero-division
          -mmemcpy  -mno-memcpy  -mlong-calls  -mno-long-calls
          -mmad  -mno-mad  -mfused-madd  -mno-fused-madd  -nocpp
          -mfix-sb1  -mno-fix-sb1  -mflush-func=FUNC
          -mno-flush-func  -mbranch-likely  -mno-branch-likely

     _i386 and x86-64 Options_
          -mtune=CPU-TYPE  -march=CPU-TYPE
          -mfpmath=UNIT
          -masm=DIALECT  -mno-fancy-math-387
          -mno-fp-ret-in-387  -msoft-float  -msvr3-shlib
          -mno-wide-multiply  -mrtd  -malign-double
          -mpreferred-stack-boundary=NUM
          -mmmx  -msse  -msse2 -msse3 -m3dnow
          -mthreads  -mno-align-stringops  -minline-all-stringops
          -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double
          -m96bit-long-double  -mregparm=NUM  -momit-leaf-frame-pointer
          -mno-red-zone -mno-tls-direct-seg-refs
          -mcmodel=CODE-MODEL
          -m32  -m64

     _HPPA Options_
          -march=ARCHITECTURE-TYPE
          -mbig-switch  -mdisable-fpregs  -mdisable-indexing
          -mfast-indirect-calls  -mgas  -mgnu-ld   -mhp-ld
          -mjump-in-delay -mlinker-opt -mlong-calls
          -mlong-load-store  -mno-big-switch  -mno-disable-fpregs
          -mno-disable-indexing  -mno-fast-indirect-calls  -mno-gas
          -mno-jump-in-delay  -mno-long-load-store
          -mno-portable-runtime  -mno-soft-float
          -mno-space-regs  -msoft-float  -mpa-risc-1-0
          -mpa-risc-1-1  -mpa-risc-2-0  -mportable-runtime
          -mschedule=CPU-TYPE  -mspace-regs  -msio  -mwsio
          -nolibdld  -static  -threads

     _Intel 960 Options_
          -mCPU-TYPE  -masm-compat  -mclean-linkage
          -mcode-align  -mcomplex-addr  -mleaf-procedures
          -mic-compat  -mic2.0-compat  -mic3.0-compat
          -mintel-asm  -mno-clean-linkage  -mno-code-align
          -mno-complex-addr  -mno-leaf-procedures
          -mno-old-align  -mno-strict-align  -mno-tail-call
          -mnumerics  -mold-align  -msoft-float  -mstrict-align
          -mtail-call

     _DEC Alpha Options_
          -mno-fp-regs  -msoft-float  -malpha-as  -mgas
          -mieee  -mieee-with-inexact  -mieee-conformant
          -mfp-trap-mode=MODE  -mfp-rounding-mode=MODE
          -mtrap-precision=MODE  -mbuild-constants
          -mcpu=CPU-TYPE  -mtune=CPU-TYPE
          -mbwx  -mmax  -mfix  -mcix
          -mfloat-vax  -mfloat-ieee
          -mexplicit-relocs  -msmall-data  -mlarge-data
          -msmall-text  -mlarge-text
          -mmemory-latency=TIME

     _DEC Alpha/VMS Options_
          -mvms-return-codes

     _H8/300 Options_
          -mrelax  -mh  -ms  -mn  -mint32  -malign-300

     _SH Options_
          -m1  -m2  -m2e  -m3  -m3e
          -m4-nofpu  -m4-single-only  -m4-single  -m4
          -m5-64media  -m5-64media-nofpu
          -m5-32media  -m5-32media-nofpu
          -m5-compact  -m5-compact-nofpu
          -mb  -ml  -mdalign  -mrelax
          -mbigtable  -mfmovd  -mhitachi  -mnomacsave
          -mieee  -misize  -mpadstruct  -mspace
          -mprefergot  -musermode

     _System V Options_
          -Qy  -Qn  -YP,PATHS  -Ym,DIR

     _ARC Options_
          -EB  -EL
          -mmangle-cpu  -mcpu=CPU  -mtext=TEXT-SECTION
          -mdata=DATA-SECTION  -mrodata=READONLY-DATA-SECTION

     _TMS320C3x/C4x Options_
          -mcpu=CPU  -mbig  -msmall  -mregparm  -mmemparm
          -mfast-fix  -mmpyi  -mbk  -mti  -mdp-isr-reload
          -mrpts=COUNT  -mrptb  -mdb  -mloop-unsigned
          -mparallel-insns  -mparallel-mpy  -mpreserve-float

     _V850 Options_
          -mlong-calls  -mno-long-calls  -mep  -mno-ep
          -mprolog-function  -mno-prolog-function  -mspace
          -mtda=N  -msda=N  -mzda=N
          -mapp-regs  -mno-app-regs
          -mdisable-callt  -mno-disable-callt
          -mv850e1
          -mv850e
          -mv850  -mbig-switch

     _NS32K Options_
          -m32032  -m32332  -m32532  -m32081  -m32381
          -mmult-add  -mnomult-add  -msoft-float  -mrtd  -mnortd
          -mregparam  -mnoregparam  -msb  -mnosb
          -mbitfield  -mnobitfield  -mhimem  -mnohimem

     _AVR Options_
          -mmcu=MCU  -msize  -minit-stack=N  -mno-interrupts
          -mcall-prologues  -mno-tablejump  -mtiny-stack

     _MCore Options_
          -mhardlit  -mno-hardlit  -mdiv  -mno-div  -mrelax-immediates
          -mno-relax-immediates  -mwide-bitfields  -mno-wide-bitfields
          -m4byte-functions  -mno-4byte-functions  -mcallgraph-data
          -mno-callgraph-data  -mslow-bytes  -mno-slow-bytes  -mno-lsim
          -mlittle-endian  -mbig-endian  -m210  -m340  -mstack-increment

     _MMIX Options_
          -mlibfuncs  -mno-libfuncs  -mepsilon  -mno-epsilon  -mabi=gnu
          -mabi=mmixware  -mzero-extend  -mknuthdiv  -mtoplevel-symbols
          -melf  -mbranch-predict  -mno-branch-predict  -mbase-addresses
          -mno-base-addresses  -msingle-exit  -mno-single-exit

     _IA-64 Options_
          -mbig-endian  -mlittle-endian  -mgnu-as  -mgnu-ld  -mno-pic
          -mvolatile-asm-stop  -mb-step  -mregister-names  -mno-sdata
          -mconstant-gp  -mauto-pic  -minline-float-divide-min-latency
          -minline-float-divide-max-throughput
          -minline-int-divide-min-latency
          -minline-int-divide-max-throughput
          -minline-sqrt-min-latency -minline-sqrt-max-throughput
          -mno-dwarf2-asm -mearly-stop-bits
          -mfixed-range=REGISTER-RANGE -mtls-size=TLS-SIZE
          -mtune=CPU-TYPE -mt -pthread -milp32 -mlp64

     _D30V Options_
          -mextmem  -mextmemory  -monchip  -mno-asm-optimize
          -masm-optimize  -mbranch-cost=N  -mcond-exec=N

     _S/390 and zSeries Options_
          -mtune=CPU-TYPE  -march=CPU-TYPE
          -mhard-float  -msoft-float  -mbackchain  -mno-backchain
          -mpacked-stack  -mno-packed-stack
          -msmall-exec  -mno-small-exec  -mmvcle -mno-mvcle
          -m64  -m31  -mdebug  -mno-debug  -mesa  -mzarch
          -mfused-madd  -mno-fused-madd
          -mwarn-framesize  -mwarn-dynamicstack  -mstack-size -mstack-guard

     _CRIS Options_
          -mcpu=CPU  -march=CPU  -mtune=CPU
          -mmax-stack-frame=N  -melinux-stacksize=N
          -metrax4  -metrax100  -mpdebug  -mcc-init  -mno-side-effects
          -mstack-align  -mdata-align  -mconst-align
          -m32-bit  -m16-bit  -m8-bit  -mno-prologue-epilogue  -mno-gotplt
          -melf  -maout  -melinux  -mlinux  -sim  -sim2
          -mmul-bug-workaround  -mno-mul-bug-workaround

     _PDP-11 Options_
          -mfpu  -msoft-float  -mac0  -mno-ac0  -m40  -m45  -m10
          -mbcopy  -mbcopy-builtin  -mint32  -mno-int16
          -mint16  -mno-int32  -mfloat32  -mno-float64
          -mfloat64  -mno-float32  -mabshi  -mno-abshi
          -mbranch-expensive  -mbranch-cheap
          -msplit  -mno-split  -munix-asm  -mdec-asm

     _Xstormy16 Options_
          -msim

     _Xtensa Options_
          -mconst16 -mno-const16
          -mfused-madd  -mno-fused-madd
          -mtext-section-literals  -mno-text-section-literals
          -mtarget-align  -mno-target-align
          -mlongcalls  -mno-longcalls

     _FRV Options_
          -mgpr-32  -mgpr-64  -mfpr-32  -mfpr-64
          -mhard-float  -msoft-float
          -malloc-cc  -mfixed-cc  -mdword  -mno-dword
          -mdouble  -mno-double
          -mmedia  -mno-media  -mmuladd  -mno-muladd
          -mlibrary-pic  -macc-4 -macc-8
          -mpack  -mno-pack  -mno-eflags  -mcond-move  -mno-cond-move
          -mscc  -mno-scc  -mcond-exec  -mno-cond-exec
          -mvliw-branch  -mno-vliw-branch
          -mmulti-cond-exec  -mno-multi-cond-exec  -mnested-cond-exec
          -mno-nested-cond-exec  -mtomcat-stats
          -mcpu=CPU

_Code Generation Options_
     *Note Options for Code Generation Conventions: Code Gen Options.
          -fcall-saved-REG  -fcall-used-REG
          -ffixed-REG  -fexceptions
          -fnon-call-exceptions  -funwind-tables
          -fasynchronous-unwind-tables
          -finhibit-size-directive  -finstrument-functions
          -fno-common  -fno-ident
          -fpcc-struct-return  -fpic  -fPIC -fpie -fPIE
          -freg-struct-return  -fshared-data  -fshort-enums
          -fshort-double  -fshort-wchar
          -fverbose-asm  -fpack-struct  -fstack-check
          -fstack-limit-register=REG  -fstack-limit-symbol=SYM
          -fargument-alias  -fargument-noalias
          -fargument-noalias-global  -fleading-underscore
          -ftls-model=MODEL
          -ftrapv  -fwrapv  -fbounds-check
          -fvisibility


* Menu:

* Overall Options::     Controlling the kind of output:
                        an executable, object files, assembler files,
                        or preprocessed source.
* C Dialect Options::   Controlling the variant of C language compiled.
* C++ Dialect Options:: Variations on C++.
* Objective-C Dialect Options:: Variations on Objective-C.
* Language Independent Options:: Controlling how diagnostics should be
                        formatted.
* Warning Options::     How picky should the compiler be?
* Debugging Options::   Symbol tables, measurements, and debugging dumps.
* Optimize Options::    How much optimization?
* Preprocessor Options:: Controlling header files and macro definitions.
                         Also, getting dependency information for Make.
* Assembler Options::   Passing options to the assembler.
* Link Options::        Specifying libraries and so on.
* Directory Options::   Where to find header files and libraries.
                        Where to find the compiler executable files.
* Spec Files::          How to pass switches to sub-processes.
* Target Options::      Running a cross-compiler, or an old version of GCC.

File: gcc.info,  Node: Overall Options,  Next: Invoking G++,  Prev: Option Summary,  Up: Invoking GCC

3.2 Options Controlling the Kind of Output
==========================================

Compilation can involve up to four stages: preprocessing, compilation
proper, assembly and linking, always in that order.  GCC is capable of
preprocessing and compiling several files either into several assembler
input files, or into one assembler input file; then each assembler
input file produces an object file, and linking combines all the object
files (those newly compiled, and those specified as input) into an
executable file.

 For any given input file, the file name suffix determines what kind of
compilation is done:

`FILE.c'
     C source code which must be preprocessed.

`FILE.i'
     C source code which should not be preprocessed.

`FILE.ii'
     C++ source code which should not be preprocessed.

`FILE.m'
     Objective-C source code.  Note that you must link with the library
     `libobjc.a' to make an Objective-C program work.

`FILE.mi'
     Objective-C source code which should not be preprocessed.

`FILE.h'
     C or C++ header file to be turned into a precompiled header.

`FILE.cc'
`FILE.cp'
`FILE.cxx'
`FILE.cpp'
`FILE.CPP'
`FILE.c++'
`FILE.C'
     C++ source code which must be preprocessed.  Note that in `.cxx',
     the last two letters must both be literally `x'.  Likewise, `.C'
     refers to a literal capital C.

`FILE.hh'
`FILE.H'
     C++ header file to be turned into a precompiled header.

`FILE.f'
`FILE.for'
`FILE.FOR'
     Fortran source code which should not be preprocessed.

`FILE.F'
`FILE.fpp'
`FILE.FPP'
     Fortran source code which must be preprocessed (with the
     traditional preprocessor).

`FILE.r'
     Fortran source code which must be preprocessed with a RATFOR
     preprocessor (not included with GCC).

     *Note Options Controlling the Kind of Output: (g77)Overall
     Options, for more details of the handling of Fortran input files.

`FILE.ads'
     Ada source code file which contains a library unit declaration (a
     declaration of a package, subprogram, or generic, or a generic
     instantiation), or a library unit renaming declaration (a package,
     generic, or subprogram renaming declaration).  Such files are also
     called "specs".

`FILE.adb'
     Ada source code file containing a library unit body (a subprogram
     or package body).  Such files are also called "bodies".

`FILE.s'
     Assembler code.

`FILE.S'
     Assembler code which must be preprocessed.

`OTHER'
     An object file to be fed straight into linking.  Any file name
     with no recognized suffix is treated this way.

 You can specify the input language explicitly with the `-x' option:

`-x LANGUAGE'
     Specify explicitly the LANGUAGE for the following input files
     (rather than letting the compiler choose a default based on the
     file name suffix).  This option applies to all following input
     files until the next `-x' option.  Possible values for LANGUAGE
     are:
          c  c-header  cpp-output
          c++  c++-header  c++-cpp-output
          objective-c  objective-c-header  objc-cpp-output
          assembler  assembler-with-cpp
          ada
          f77  f77-cpp-input  ratfor
          java
          treelang

`-x none'
     Turn off any specification of a language, so that subsequent files
     are handled according to their file name suffixes (as they are if
     `-x' has not been used at all).

`-pass-exit-codes'
     Normally the `gcc' program will exit with the code of 1 if any
     phase of the compiler returns a non-success return code.  If you
     specify `-pass-exit-codes', the `gcc' program will instead return
     with numerically highest error produced by any phase that returned
     an error indication.

 If you only want some of the stages of compilation, you can use `-x'
(or filename suffixes) to tell `gcc' where to start, and one of the
options `-c', `-S', or `-E' to say where `gcc' is to stop.  Note that
some combinations (for example, `-x cpp-output -E') instruct `gcc' to
do nothing at all.

`-c'
     Compile or assemble the source files, but do not link.  The linking
     stage simply is not done.  The ultimate output is in the form of an
     object file for each source file.

     By default, the object file name for a source file is made by
     replacing the suffix `.c', `.i', `.s', etc., with `.o'.

     Unrecognized input files, not requiring compilation or assembly,
     are ignored.

`-S'
     Stop after the stage of compilation proper; do not assemble.  The
     output is in the form of an assembler code file for each
     non-assembler input file specified.

     By default, the assembler file name for a source file is made by
     replacing the suffix `.c', `.i', etc., with `.s'.

     Input files that don't require compilation are ignored.

`-E'
     Stop after the preprocessing stage; do not run the compiler
     proper.  The output is in the form of preprocessed source code,
     which is sent to the standard output.

     Input files which don't require preprocessing are ignored.

`-o FILE'
     Place output in file FILE.  This applies regardless to whatever
     sort of output is being produced, whether it be an executable file,
     an object file, an assembler file or preprocessed C code.

     If you specify `-o' when compiling more than one input file, or
     you are producing an executable file as output, all the source
     files on the command line will be compiled at once.

     If `-o' is not specified, the default is to put an executable file
     in `a.out', the object file for `SOURCE.SUFFIX' in `SOURCE.o', its
     assembler file in `SOURCE.s', and all preprocessed C source on
     standard output.

`-v'
     Print (on standard error output) the commands executed to run the
     stages of compilation.  Also print the version number of the
     compiler driver program and of the preprocessor and the compiler
     proper.

`-###'
     Like `-v' except the commands are not executed and all command
     arguments are quoted.  This is useful for shell scripts to capture
     the driver-generated command lines.

`-pipe'
     Use pipes rather than temporary files for communication between the
     various stages of compilation.  This fails to work on some systems
     where the assembler is unable to read from a pipe; but the GNU
     assembler has no trouble.

`--help'
     Print (on the standard output) a description of the command line
     options understood by `gcc'.  If the `-v' option is also specified
     then `--help' will also be passed on to the various processes
     invoked by `gcc', so that they can display the command line options
     they accept.  If the `-Wextra' option is also specified then
     command line options which have no documentation associated with
     them will also be displayed.

`--target-help'
     Print (on the standard output) a description of target specific
     command line options for each tool.

`--version'
     Display the version number and copyrights of the invoked GCC.

File: gcc.info,  Node: C Dialect Options,  Next: C++ Dialect Options,  Prev: Invoking G++,  Up: Invoking GCC

3.4 Options Controlling C Dialect
=================================

The following options control the dialect of C (or languages derived
from C, such as C++ and Objective-C) that the compiler accepts:

`-ansi'
     In C mode, support all ISO C90 programs.  In C++ mode, remove GNU
     extensions that conflict with ISO C++.

     This turns off certain features of GCC that are incompatible with
     ISO C90 (when compiling C code), or of standard C++ (when
     compiling C++ code), such as the `asm' and `typeof' keywords, and
     predefined macros such as `unix' and `vax' that identify the type
     of system you are using.  It also enables the undesirable and
     rarely used ISO trigraph feature.  For the C compiler, it disables
     recognition of C++ style `//' comments as well as the `inline'
     keyword.

     The alternate keywords `__asm__', `__extension__', `__inline__'
     and `__typeof__' continue to work despite `-ansi'.  You would not
     want to use them in an ISO C program, of course, but it is useful
     to put them in header files that might be included in compilations
     done with `-ansi'.  Alternate predefined macros such as `__unix__'
     and `__vax__' are also available, with or without `-ansi'.

     The `-ansi' option does not cause non-ISO programs to be rejected
     gratuitously.  For that, `-pedantic' is required in addition to
     `-ansi'.  *Note Warning Options::.

     The macro `__STRICT_ANSI__' is predefined when the `-ansi' option
     is used.  Some header files may notice this macro and refrain from
     declaring certain functions or defining certain macros that the
     ISO standard doesn't call for; this is to avoid interfering with
     any programs that might use these names for other things.

     Functions which would normally be built in but do not have
     semantics defined by ISO C (such as `alloca' and `ffs') are not
     built-in functions with `-ansi' is used.  *Note Other built-in
     functions provided by GCC: Other Builtins, for details of the
     functions affected.

`-std='
     Determine the language standard.  This option is currently only
     supported when compiling C or C++.  A value for this option must be
     provided; possible values are

    `c89'
    `iso9899:1990'
          ISO C90 (same as `-ansi').

    `iso9899:199409'
          ISO C90 as modified in amendment 1.

    `c99'
    `c9x'
    `iso9899:1999'
    `iso9899:199x'
          ISO C99.  Note that this standard is not yet fully supported;
          see `http://gcc.gnu.org/gcc-3.4/c99status.html' for more
          information.  The names `c9x' and `iso9899:199x' are
          deprecated.

    `gnu89'
          Default, ISO C90 plus GNU extensions (including some C99
          features).

    `gnu99'
    `gnu9x'
          ISO C99 plus GNU extensions.  When ISO C99 is fully
          implemented in GCC, this will become the default.  The name
          `gnu9x' is deprecated.

    `c++98'
          The 1998 ISO C++ standard plus amendments.

    `gnu++98'
          The same as `-std=c++98' plus GNU extensions.  This is the
          default for C++ code.

     Even when this option is not specified, you can still use some of
     the features of newer standards in so far as they do not conflict
     with previous C standards.  For example, you may use
     `__restrict__' even when `-std=c99' is not specified.

     The `-std' options specifying some version of ISO C have the same
     effects as `-ansi', except that features that were not in ISO C90
     but are in the specified version (for example, `//' comments and
     the `inline' keyword in ISO C99) are not disabled.

     *Note Language Standards Supported by GCC: Standards, for details
     of these standard versions.

`-aux-info FILENAME'
     Output to the given filename prototyped declarations for all
     functions declared and/or defined in a translation unit, including
     those in header files.  This option is silently ignored in any
     language other than C.

     Besides declarations, the file indicates, in comments, the origin
     of each declaration (source file and line), whether the
     declaration was implicit, prototyped or unprototyped (`I', `N' for
     new or `O' for old, respectively, in the first character after the
     line number and the colon), and whether it came from a declaration
     or a definition (`C' or `F', respectively, in the following
     character).  In the case of function definitions, a K&R-style list
     of arguments followed by their declarations is also provided,
     inside comments, after the declaration.

`-fno-asm'
     Do not recognize `asm', `inline' or `typeof' as a keyword, so that
     code can use these words as identifiers.  You can use the keywords
     `__asm__', `__inline__' and `__typeof__' instead.  `-ansi' implies
     `-fno-asm'.

     In C++, this switch only affects the `typeof' keyword, since `asm'
     and `inline' are standard keywords.  You may want to use the
     `-fno-gnu-keywords' flag instead, which has the same effect.  In
     C99 mode (`-std=c99' or `-std=gnu99'), this switch only affects
     the `asm' and `typeof' keywords, since `inline' is a standard
     keyword in ISO C99.

`-fno-builtin'
`-fno-builtin-FUNCTION'
     Don't recognize built-in functions that do not begin with
     `__builtin_' as prefix.  *Note Other built-in functions provided
     by GCC: Other Builtins, for details of the functions affected,
     including those which are not built-in functions when `-ansi' or
     `-std' options for strict ISO C conformance are used because they
     do not have an ISO standard meaning.

     GCC normally generates special code to handle certain built-in
     functions more efficiently; for instance, calls to `alloca' may
     become single instructions that adjust the stack directly, and
     calls to `memcpy' may become inline copy loops.  The resulting
     code is often both smaller and faster, but since the function
     calls no longer appear as such, you cannot set a breakpoint on
     those calls, nor can you change the behavior of the functions by
     linking with a different library.

     With the `-fno-builtin-FUNCTION' option only the built-in function
     FUNCTION is disabled.  FUNCTION must not begin with `__builtin_'.
     If a function is named this is not built-in in this version of
     GCC, this option is ignored.  There is no corresponding
     `-fbuiltin-FUNCTION' option; if you wish to enable built-in
     functions selectively when using `-fno-builtin' or
     `-ffreestanding', you may define macros such as:

          #define abs(n)          __builtin_abs ((n))
          #define strcpy(d, s)    __builtin_strcpy ((d), (s))

`-fhosted'
     Assert that compilation takes place in a hosted environment.  This
     implies `-fbuiltin'.  A hosted environment is one in which the
     entire standard library is available, and in which `main' has a
     return type of `int'.  Examples are nearly everything except a
     kernel.  This is equivalent to `-fno-freestanding'.

`-ffreestanding'
     Assert that compilation takes place in a freestanding environment.
     This implies `-fno-builtin'.  A freestanding environment is one
     in which the standard library may not exist, and program startup
     may not necessarily be at `main'.  The most obvious example is an
     OS kernel.  This is equivalent to `-fno-hosted'.

     *Note Language Standards Supported by GCC: Standards, for details
     of freestanding and hosted environments.

`-fms-extensions'
     Accept some non-standard constructs used in Microsoft header files.

`-trigraphs'
     Support ISO C trigraphs.  The `-ansi' option (and `-std' options
     for strict ISO C conformance) implies `-trigraphs'.

`-no-integrated-cpp'
     Performs a compilation in two passes: preprocessing and compiling.
     This option allows a user supplied "cc1", "cc1plus", or "cc1obj"
     via the `-B' option. The user supplied compilation step can then
     add in an additional preprocessing step after normal preprocessing
     but before compiling. The default is to use the integrated cpp
     (internal cpp)

     The semantics of this option will change if "cc1", "cc1plus", and
     "cc1obj" are merged.

`-traditional'
`-traditional-cpp'
     Formerly, these options caused GCC to attempt to emulate a
     pre-standard C compiler.  They are now only supported with the
     `-E' switch.  The preprocessor continues to support a pre-standard
     mode.  See the GNU CPP manual for details.

`-fcond-mismatch'
     Allow conditional expressions with mismatched types in the second
     and third arguments.  The value of such an expression is void.
     This option is not supported for C++.

`-funsigned-char'
     Let the type `char' be unsigned, like `unsigned char'.

     Each kind of machine has a default for what `char' should be.  It
     is either like `unsigned char' by default or like `signed char' by
     default.

     Ideally, a portable program should always use `signed char' or
     `unsigned char' when it depends on the signedness of an object.
     But many programs have been written to use plain `char' and expect
     it to be signed, or expect it to be unsigned, depending on the
     machines they were written for.  This option, and its inverse, let
     you make such a program work with the opposite default.

     The type `char' is always a distinct type from each of `signed
     char' or `unsigned char', even though its behavior is always just
     like one of those two.

`-fsigned-char'
     Let the type `char' be signed, like `signed char'.

     Note that this is equivalent to `-fno-unsigned-char', which is the
     negative form of `-funsigned-char'.  Likewise, the option
     `-fno-signed-char' is equivalent to `-funsigned-char'.

`-fsigned-bitfields'
`-funsigned-bitfields'
`-fno-signed-bitfields'
`-fno-unsigned-bitfields'
     These options control whether a bit-field is signed or unsigned,
     when the declaration does not use either `signed' or `unsigned'.
     By default, such a bit-field is signed, because this is
     consistent: the basic integer types such as `int' are signed types.

`-fwritable-strings'
     Store string constants in the writable data segment and don't
     uniquize them.  This is for compatibility with old programs which
     assume they can write into string constants.

     Writing into string constants is a very bad idea; "constants"
     should be constant.

     This option is deprecated.

File: gcc.info,  Node: C++ Dialect Options,  Next: Objective-C Dialect Options,  Prev: C Dialect Options,  Up: Invoking GCC

3.5 Options Controlling C++ Dialect
===================================

This section describes the command-line options that are only meaningful
for C++ programs; but you can also use most of the GNU compiler options
regardless of what language your program is in.  For example, you might
compile a file `firstClass.C' like this:

     g++ -g -frepo -O -c firstClass.C

In this example, only `-frepo' is an option meant only for C++
programs; you can use the other options with any language supported by
GCC.

 Here is a list of options that are _only_ for compiling C++ programs:

`-fabi-version=N'
     Use version N of the C++ ABI.  Version 2 is the version of the C++
     ABI that first appeared in G++ 3.4.  Version 1 is the version of
     the C++ ABI that first appeared in G++ 3.2.  Version 0 will always
     be the version that conforms most closely to the C++ ABI
     specification.  Therefore, the ABI obtained using version 0 will
     change as ABI bugs are fixed.

     The default is version 2.

`-fno-access-control'
     Turn off all access checking.  This switch is mainly useful for
     working around bugs in the access control code.

`-fcheck-new'
     Check that the pointer returned by `operator new' is non-null
     before attempting to modify the storage allocated.  This check is
     normally unnecessary because the C++ standard specifies that
     `operator new' will only return `0' if it is declared `throw()',
     in which case the compiler will always check the return value even
     without this option.  In all other cases, when `operator new' has
     a non-empty exception specification, memory exhaustion is
     signalled by throwing `std::bad_alloc'.  See also `new (nothrow)'.

`-fconserve-space'
     Put uninitialized or runtime-initialized global variables into the
     common segment, as C does.  This saves space in the executable at
     the cost of not diagnosing duplicate definitions.  If you compile
     with this flag and your program mysteriously crashes after
     `main()' has completed, you may have an object that is being
     destroyed twice because two definitions were merged.

     This option is no longer useful on most targets, now that support
     has been added for putting variables into BSS without making them
     common.

`-fno-const-strings'
     Give string constants type `char *' instead of type `const char
     *'.  By default, G++ uses type `const char *' as required by the
     standard.  Even if you use `-fno-const-strings', you cannot
     actually modify the value of a string constant, unless you also use
     `-fwritable-strings'.

     This option might be removed in a future release of G++.  For
     maximum portability, you should structure your code so that it
     works with string constants that have type `const char *'.

`-fno-elide-constructors'
     The C++ standard allows an implementation to omit creating a
     temporary which is only used to initialize another object of the
     same type.  Specifying this option disables that optimization, and
     forces G++ to call the copy constructor in all cases.

`-fno-enforce-eh-specs'
     Don't check for violation of exception specifications at runtime.
     This option violates the C++ standard, but may be useful for
     reducing code size in production builds, much like defining
     `NDEBUG'.  The compiler will still optimize based on the exception
     specifications.

`-ffor-scope'
`-fno-for-scope'
     If `-ffor-scope' is specified, the scope of variables declared in
     a for-init-statement is limited to the `for' loop itself, as
     specified by the C++ standard.  If `-fno-for-scope' is specified,
     the scope of variables declared in a for-init-statement extends to
     the end of the enclosing scope, as was the case in old versions of
     G++, and other (traditional) implementations of C++.

     The default if neither flag is given to follow the standard, but
     to allow and give a warning for old-style code that would
     otherwise be invalid, or have different behavior.

`-fno-gnu-keywords'
     Do not recognize `typeof' as a keyword, so that code can use this
     word as an identifier.  You can use the keyword `__typeof__'
     instead.  `-ansi' implies `-fno-gnu-keywords'.

`-fno-implicit-templates'
     Never emit code for non-inline templates which are instantiated
     implicitly (i.e. by use); only emit code for explicit
     instantiations.  *Note Template Instantiation::, for more
     information.

`-fno-implicit-inline-templates'
     Don't emit code for implicit instantiations of inline templates,
     either.  The default is to handle inlines differently so that
     compiles with and without optimization will need the same set of
     explicit instantiations.

`-fno-implement-inlines'
     To save space, do not emit out-of-line copies of inline functions
     controlled by `#pragma implementation'.  This will cause linker
     errors if these functions are not inlined everywhere they are
     called.

`-fms-extensions'
     Disable pedantic warnings about constructs used in MFC, such as
     implicit int and getting a pointer to member function via
     non-standard syntax.

`-fno-nonansi-builtins'
     Disable built-in declarations of functions that are not mandated by
     ANSI/ISO C.  These include `ffs', `alloca', `_exit', `index',
     `bzero', `conjf', and other related functions.

`-fno-operator-names'
     Do not treat the operator name keywords `and', `bitand', `bitor',
     `compl', `not', `or' and `xor' as synonyms as keywords.

`-fno-optional-diags'
     Disable diagnostics that the standard says a compiler does not
     need to issue.  Currently, the only such diagnostic issued by G++
     is the one for a name having multiple meanings within a class.

`-fpermissive'
     Downgrade some diagnostics about nonconformant code from errors to
     warnings.  Thus, using `-fpermissive' will allow some
     nonconforming code to compile.

`-frepo'
     Enable automatic template instantiation at link time.  This option
     also implies `-fno-implicit-templates'.  *Note Template
     Instantiation::, for more information.

`-fno-rtti'
     Disable generation of information about every class with virtual
     functions for use by the C++ runtime type identification features
     (`dynamic_cast' and `typeid').  If you don't use those parts of
     the language, you can save some space by using this flag.  Note
     that exception handling uses the same information, but it will
     generate it as needed.

`-fstats'
     Emit statistics about front-end processing at the end of the
     compilation.  This information is generally only useful to the G++
     development team.

`-ftemplate-depth-N'
     Set the maximum instantiation depth for template classes to N.  A
     limit on the template instantiation depth is needed to detect
     endless recursions during template class instantiation.  ANSI/ISO
     C++ conforming programs must not rely on a maximum depth greater
     than 17.

`-fno-threadsafe-statics'
     Do not emit the extra code to use the routines specified in the C++
     ABI for thread-safe initialization of local statics.  You can use
     this option to reduce code size slightly in code that doesn't need
     to be thread-safe.

`-fuse-cxa-atexit'
     Register destructors for objects with static storage duration with
     the `__cxa_atexit' function rather than the `atexit' function.
     This option is required for fully standards-compliant handling of
     static destructors, but will only work if your C library supports
     `__cxa_atexit'.

`-fvisibility-inlines-hidden'
     Causes all inlined methods to be marked with `__attribute__
     ((visibility ("hidden")))' so that they do not appear in the
     export table of a DSO and do not require a PLT indirection when
     used within the DSO. Enabling this option can have a dramatic
     effect on load and link times of a DSO as it massively reduces the
     size of the dynamic export table when the library makes heavy use
     of templates. While it can cause bloating through duplication of
     code within each DSO where it is used, often the wastage is less
     than the considerable space occupied by a long symbol name in the
     export table which is typical when using templates and namespaces.
     For even more savings, combine with the `-fvisibility=hidden'
     switch.

`-fno-weak'
     Do not use weak symbol support, even if it is provided by the
     linker.  By default, G++ will use weak symbols if they are
     available.  This option exists only for testing, and should not be
     used by end-users; it will result in inferior code and has no
     benefits.  This option may be removed in a future release of G++.

`-nostdinc++'
     Do not search for header files in the standard directories
     specific to C++, but do still search the other standard
     directories.  (This option is used when building the C++ library.)

 In addition, these optimization, warning, and code generation options
have meanings only for C++ programs:

`-fno-default-inline'
     Do not assume `inline' for functions defined inside a class scope.
     *Note Options That Control Optimization: Optimize Options.  Note
     that these functions will have linkage like inline functions; they
     just won't be inlined by default.

`-Wabi (C++ only)'
     Warn when G++ generates code that is probably not compatible with
     the vendor-neutral C++ ABI.  Although an effort has been made to
     warn about all such cases, there are probably some cases that are
     not warned about, even though G++ is generating incompatible code.
     There may also be cases where warnings are emitted even though
     the code that is generated will be compatible.

     You should rewrite your code to avoid these warnings if you are
     concerned about the fact that code generated by G++ may not be
     binary compatible with code generated by other compilers.

     The known incompatibilities at this point include:

        * Incorrect handling of tail-padding for bit-fields.  G++ may
          attempt to pack data into the same byte as a base class.  For
          example:

               struct A { virtual void f(); int f1 : 1; };
               struct B : public A { int f2 : 1; };

          In this case, G++ will place `B::f2' into the same byte
          as`A::f1'; other compilers will not.  You can avoid this
          problem by explicitly padding `A' so that its size is a
          multiple of the byte size on your platform; that will cause
          G++ and other compilers to layout `B' identically.

        * Incorrect handling of tail-padding for virtual bases.  G++
          does not use tail padding when laying out virtual bases.  For
          example:

               struct A { virtual void f(); char c1; };
               struct B { B(); char c2; };
               struct C : public A, public virtual B {};

          In this case, G++ will not place `B' into the tail-padding for
          `A'; other compilers will.  You can avoid this problem by
          explicitly padding `A' so that its size is a multiple of its
          alignment (ignoring virtual base classes); that will cause
          G++ and other compilers to layout `C' identically.

        * Incorrect handling of bit-fields with declared widths greater
          than that of their underlying types, when the bit-fields
          appear in a union.  For example:

               union U { int i : 4096; };

          Assuming that an `int' does not have 4096 bits, G++ will make
          the union too small by the number of bits in an `int'.

        * Empty classes can be placed at incorrect offsets.  For
          example:

               struct A {};

               struct B {
                 A a;
                 virtual void f ();
               };

               struct C : public B, public A {};

          G++ will place the `A' base class of `C' at a nonzero offset;
          it should be placed at offset zero.  G++ mistakenly believes
          that the `A' data member of `B' is already at offset zero.

        * Names of template functions whose types involve `typename' or
          template template parameters can be mangled incorrectly.

               template <typename Q>
               void f(typename Q::X) {}

               template <template <typename> class Q>
               void f(typename Q<int>::X) {}

          Instantiations of these templates may be mangled incorrectly.


`-Wctor-dtor-privacy (C++ only)'
     Warn when a class seems unusable because all the constructors or
     destructors in that class are private, and it has neither friends
     nor public static member functions.

`-Wnon-virtual-dtor (C++ only)'
     Warn when a class appears to be polymorphic, thereby requiring a
     virtual destructor, yet it declares a non-virtual one.  This
     warning is enabled by `-Wall'.

`-Wreorder (C++ only)'
     Warn when the order of member initializers given in the code does
     not match the order in which they must be executed.  For instance:

          struct A {
            int i;
            int j;
            A(): j (0), i (1) { }
          };

     The compiler will rearrange the member initializers for `i' and
     `j' to match the declaration order of the members, emitting a
     warning to that effect.  This warning is enabled by `-Wall'.

 The following `-W...' options are not affected by `-Wall'.

`-Weffc++ (C++ only)'
     Warn about violations of the following style guidelines from Scott
     Meyers' `Effective C++' book:

        * Item 11:  Define a copy constructor and an assignment
          operator for classes with dynamically allocated memory.

        * Item 12:  Prefer initialization to assignment in constructors.

        * Item 14:  Make destructors virtual in base classes.

        * Item 15:  Have `operator=' return a reference to `*this'.

        * Item 23:  Don't try to return a reference when you must
          return an object.


     Also warn about violations of the following style guidelines from
     Scott Meyers' `More Effective C++' book:

        * Item 6:  Distinguish between prefix and postfix forms of
          increment and decrement operators.

        * Item 7:  Never overload `&&', `||', or `,'.


     When selecting this option, be aware that the standard library
     headers do not obey all of these guidelines; use `grep -v' to
     filter out those warnings.

`-Wno-deprecated (C++ only)'
     Do not warn about usage of deprecated features.  *Note Deprecated
     Features::.

`-Wno-non-template-friend (C++ only)'
     Disable warnings when non-templatized friend functions are declared
     within a template.  Since the advent of explicit template
     specification support in G++, if the name of the friend is an
     unqualified-id (i.e., `friend foo(int)'), the C++ language
     specification demands that the friend declare or define an
     ordinary, nontemplate function.  (Section 14.5.3).  Before G++
     implemented explicit specification, unqualified-ids could be
     interpreted as a particular specialization of a templatized
     function.  Because this non-conforming behavior is no longer the
     default behavior for G++, `-Wnon-template-friend' allows the
     compiler to check existing code for potential trouble spots and is
     on by default.  This new compiler behavior can be turned off with
     `-Wno-non-template-friend' which keeps the conformant compiler code
     but disables the helpful warning.

`-Wold-style-cast (C++ only)'
     Warn if an old-style (C-style) cast to a non-void type is used
     within a C++ program.  The new-style casts (`static_cast',
     `reinterpret_cast', and `const_cast') are less vulnerable to
     unintended effects and much easier to search for.

`-Woverloaded-virtual (C++ only)'
     Warn when a function declaration hides virtual functions from a
     base class.  For example, in:

          struct A {
            virtual void f();
          };

          struct B: public A {
            void f(int);
          };

     the `A' class version of `f' is hidden in `B', and code like:

          B* b;
          b->f();

     will fail to compile.

`-Wno-pmf-conversions (C++ only)'
     Disable the diagnostic for converting a bound pointer to member
     function to a plain pointer.

`-Wsign-promo (C++ only)'
     Warn when overload resolution chooses a promotion from unsigned or
     enumerated type to a signed type, over a conversion to an unsigned
     type of the same size.  Previous versions of G++ would try to
     preserve unsignedness, but the standard mandates the current
     behavior.

          struct A {
            operator int ();
            A& operator = (int);
          };

          main ()
          {
            A a,b;
            a = b;
          }

     In this example, G++ will synthesize a default `A& operator =
     (const A&);', while cfront will use the user-defined `operator ='.

File: gcc.info,  Node: Objective-C Dialect Options,  Next: Language Independent Options,  Prev: C++ Dialect Options,  Up: Invoking GCC

3.6 Options Controlling Objective-C Dialect
===========================================

(NOTE: This manual does not describe the Objective-C language itself.
See `http://gcc.gnu.org/readings.html' for references.)

 This section describes the command-line options that are only
meaningful for Objective-C programs, but you can also use most of the
GNU compiler options regardless of what language your program is in.
For example, you might compile a file `some_class.m' like this:

     gcc -g -fgnu-runtime -O -c some_class.m

In this example, `-fgnu-runtime' is an option meant only for
Objective-C programs; you can use the other options with any language
supported by GCC.

 Here is a list of options that are _only_ for compiling Objective-C
programs:

`-fconstant-string-class=CLASS-NAME'
     Use CLASS-NAME as the name of the class to instantiate for each
     literal string specified with the syntax `@"..."'.  The default
     class name is `NXConstantString' if the GNU runtime is being used,
     and `NSConstantString' if the NeXT runtime is being used (see
     below).  The `-fconstant-cfstrings' option, if also present, will
     override the `-fconstant-string-class' setting and cause `@"..."'
     literals to be laid out as constant CoreFoundation strings.

`-fgnu-runtime'
     Generate object code compatible with the standard GNU Objective-C
     runtime.  This is the default for most types of systems.

`-fnext-runtime'
     Generate output compatible with the NeXT runtime.  This is the
     default for NeXT-based systems, including Darwin and Mac OS X.
     The macro `__NEXT_RUNTIME__' is predefined if (and only if) this
     option is used.

`-fno-nil-receivers'
     Assume that all Objective-C message dispatches (e.g., `[receiver
     message:arg]') in this translation unit ensure that the receiver
     is not `nil'.  This allows for more efficient entry points in the
     runtime to be used.  Currently, this option is only available in
     conjunction with the NeXT runtime on Mac OS X 10.3 and later.

`-fobjc-exceptions'
     Enable syntactic support for structured exception handling in
     Objective-C, similar to what is offered by C++ and Java.
     Currently, this option is only available in conjunction with the
     NeXT runtime on Mac OS X 10.3 and later.

            @try {
              ...
                 @throw expr;
              ...
            }
            @catch (AnObjCClass *exc) {
              ...
                @throw expr;
              ...
                @throw;
              ...
            }
            @catch (AnotherClass *exc) {
              ...
            }
            @catch (id allOthers) {
              ...
            }
            @finally {
              ...
                @throw expr;
              ...
            }

     The `@throw' statement may appear anywhere in an Objective-C or
     Objective-C++ program; when used inside of a `@catch' block, the
     `@throw' may appear without an argument (as shown above), in which
     case the object caught by the `@catch' will be rethrown.

     Note that only (pointers to) Objective-C objects may be thrown and
     caught using this scheme.  When an object is thrown, it will be
     caught by the nearest `@catch' clause capable of handling objects
     of that type, analogously to how `catch' blocks work in C++ and
     Java.  A `@catch(id ...)' clause (as shown above) may also be
     provided to catch any and all Objective-C exceptions not caught by
     previous `@catch' clauses (if any).

     The `@finally' clause, if present, will be executed upon exit from
     the immediately preceding `@try ... @catch' section.  This will
     happen regardless of whether any exceptions are thrown, caught or
     rethrown inside the `@try ... @catch' section, analogously to the
     behavior of the `finally' clause in Java.

     There are several caveats to using the new exception mechanism:

        * Although currently designed to be binary compatible with
          `NS_HANDLER'-style idioms provided by the `NSException'
          class, the new exceptions can only be used on Mac OS X 10.3
          (Panther) and later systems, due to additional functionality
          needed in the (NeXT) Objective-C runtime.

        * As mentioned above, the new exceptions do not support handling
          types other than Objective-C objects.   Furthermore, when
          used from Objective-C++, the Objective-C exception model does
          not interoperate with C++ exceptions at this time.  This
          means you cannot `@throw' an exception from Objective-C and
          `catch' it in C++, or vice versa (i.e., `throw ... @catch').

     The `-fobjc-exceptions' switch also enables the use of
     synchronization blocks for thread-safe execution:

            @synchronized (ObjCClass *guard) {
              ...
            }

     Upon entering the `@synchronized' block, a thread of execution
     shall first check whether a lock has been placed on the
     corresponding `guard' object by another thread.  If it has, the
     current thread shall wait until the other thread relinquishes its
     lock.  Once `guard' becomes available, the current thread will
     place its own lock on it, execute the code contained in the
     `@synchronized' block, and finally relinquish the lock (thereby
     making `guard' available to other threads).

     Unlike Java, Objective-C does not allow for entire methods to be
     marked `@synchronized'.  Note that throwing exceptions out of
     `@synchronized' blocks is allowed, and will cause the guarding
     object to be unlocked properly.

`-freplace-objc-classes'
     Emit a special marker instructing `ld(1)' not to statically link in
     the resulting object file, and allow `dyld(1)' to load it in at
     run time instead.  This is used in conjunction with the
     Fix-and-Continue debugging mode, where the object file in question
     may be recompiled and dynamically reloaded in the course of
     program execution, without the need to restart the program itself.
     Currently, Fix-and-Continue functionality is only available in
     conjunction with the NeXT runtime on Mac OS X 10.3 and later.

`-fzero-link'
     When compiling for the NeXT runtime, the compiler ordinarily
     replaces calls to `objc_getClass("...")' (when the name of the
     class is known at compile time) with static class references that
     get initialized at load time, which improves run-time performance.
     Specifying the `-fzero-link' flag suppresses this behavior and
     causes calls to `objc_getClass("...")' to be retained.  This is
     useful in Zero-Link debugging mode, since it allows for individual
     class implementations to be modified during program execution.

`-gen-decls'
     Dump interface declarations for all classes seen in the source
     file to a file named `SOURCENAME.decl'.

`-Wno-protocol'
     If a class is declared to implement a protocol, a warning is
     issued for every method in the protocol that is not implemented by
     the class.  The default behavior is to issue a warning for every
     method not explicitly implemented in the class, even if a method
     implementation is inherited from the superclass.  If you use the
     `-Wno-protocol' option, then methods inherited from the superclass
     are considered to be implemented, and no warning is issued for
     them.

`-Wselector'
     Warn if multiple methods of different types for the same selector
     are found during compilation.  The check is performed on the list
     of methods in the final stage of compilation.  Additionally, a
     check is performed for each selector appearing in a
     `@selector(...)'  expression, and a corresponding method for that
     selector has been found during compilation.  Because these checks
     scan the method table only at the end of compilation, these
     warnings are not produced if the final stage of compilation is not
     reached, for example because an error is found during compilation,
     or because the `-fsyntax-only' option is being used.

`-Wundeclared-selector'
     Warn if a `@selector(...)' expression referring to an undeclared
     selector is found.  A selector is considered undeclared if no
     method with that name has been declared before the
     `@selector(...)' expression, either explicitly in an `@interface'
     or `@protocol' declaration, or implicitly in an `@implementation'
     section.  This option always performs its checks as soon as a
     `@selector(...)' expression is found, while `-Wselector' only
     performs its checks in the final stage of compilation.  This also
     enforces the coding style convention that methods and selectors
     must be declared before being used.

`-print-objc-runtime-info'
     Generate C header describing the largest structure that is passed
     by value, if any.


File: gcc.info,  Node: Language Independent Options,  Next: Warning Options,  Prev: Objective-C Dialect Options,  Up: Invoking GCC

3.7 Options to Control Diagnostic Messages Formatting
=====================================================

Traditionally, diagnostic messages have been formatted irrespective of
the output device's aspect (e.g. its width, ...).  The options described
below can be used to control the diagnostic messages formatting
algorithm, e.g. how many characters per line, how often source location
information should be reported.  Right now, only the C++ front end can
honor these options.  However it is expected, in the near future, that
the remaining front ends would be able to digest them correctly.

`-fmessage-length=N'
     Try to format error messages so that they fit on lines of about N
     characters.  The default is 72 characters for `g++' and 0 for the
     rest of the front ends supported by GCC.  If N is zero, then no
     line-wrapping will be done; each error message will appear on a
     single line.

`-fdiagnostics-show-location=once'
     Only meaningful in line-wrapping mode.  Instructs the diagnostic
     messages reporter to emit _once_ source location information; that
     is, in case the message is too long to fit on a single physical
     line and has to be wrapped, the source location won't be emitted
     (as prefix) again, over and over, in subsequent continuation
     lines.  This is the default behavior.

`-fdiagnostics-show-location=every-line'
     Only meaningful in line-wrapping mode.  Instructs the diagnostic
     messages reporter to emit the same source location information (as
     prefix) for physical lines that result from the process of breaking
     a message which is too long to fit on a single line.


File: gcc.info,  Node: Warning Options,  Next: Debugging Options,  Prev: Language Independent Options,  Up: Invoking GCC

3.8 Options to Request or Suppress Warnings
===========================================

Warnings are diagnostic messages that report constructions which are
not inherently erroneous but which are risky or suggest there may have
been an error.

 You can request many specific warnings with options beginning `-W',
for example `-Wimplicit' to request warnings on implicit declarations.
Each of these specific warning options also has a negative form
beginning `-Wno-' to turn off warnings; for example, `-Wno-implicit'.
This manual lists only one of the two forms, whichever is not the
default.

 The following options control the amount and kinds of warnings produced
by GCC; for further, language-specific options also refer to *Note C++
Dialect Options:: and *Note Objective-C Dialect Options::.

`-fsyntax-only'
     Check the code for syntax errors, but don't do anything beyond
     that.

`-pedantic'
     Issue all the warnings demanded by strict ISO C and ISO C++;
     reject all programs that use forbidden extensions, and some other
     programs that do not follow ISO C and ISO C++.  For ISO C, follows
     the version of the ISO C standard specified by any `-std' option
     used.

     Valid ISO C and ISO C++ programs should compile properly with or
     without this option (though a rare few will require `-ansi' or a
     `-std' option specifying the required version of ISO C).  However,
     without this option, certain GNU extensions and traditional C and
     C++ features are supported as well.  With this option, they are
     rejected.

     `-pedantic' does not cause warning messages for use of the
     alternate keywords whose names begin and end with `__'.  Pedantic
     warnings are also disabled in the expression that follows
     `__extension__'.  However, only system header files should use
     these escape routes; application programs should avoid them.
     *Note Alternate Keywords::.

     Some users try to use `-pedantic' to check programs for strict ISO
     C conformance.  They soon find that it does not do quite what they
     want: it finds some non-ISO practices, but not all--only those for
     which ISO C _requires_ a diagnostic, and some others for which
     diagnostics have been added.

     A feature to report any failure to conform to ISO C might be
     useful in some instances, but would require considerable
     additional work and would be quite different from `-pedantic'.  We
     don't have plans to support such a feature in the near future.

     Where the standard specified with `-std' represents a GNU extended
     dialect of C, such as `gnu89' or `gnu99', there is a corresponding
     "base standard", the version of ISO C on which the GNU extended
     dialect is based.  Warnings from `-pedantic' are given where they
     are required by the base standard.  (It would not make sense for
     such warnings to be given only for features not in the specified
     GNU C dialect, since by definition the GNU dialects of C include
     all features the compiler supports with the given option, and
     there would be nothing to warn about.)

`-pedantic-errors'
     Like `-pedantic', except that errors are produced rather than
     warnings.

`-w'
     Inhibit all warning messages.

`-Wno-import'
     Inhibit warning messages about the use of `#import'.

`-Wchar-subscripts'
     Warn if an array subscript has type `char'.  This is a common cause
     of error, as programmers often forget that this type is signed on
     some machines.

`-Wcomment'
     Warn whenever a comment-start sequence `/*' appears in a `/*'
     comment, or whenever a Backslash-Newline appears in a `//' comment.

`-Wformat'
     Check calls to `printf' and `scanf', etc., to make sure that the
     arguments supplied have types appropriate to the format string
     specified, and that the conversions specified in the format string
     make sense.  This includes standard functions, and others
     specified by format attributes (*note Function Attributes::), in
     the `printf', `scanf', `strftime' and `strfmon' (an X/Open
     extension, not in the C standard) families.

     The formats are checked against the format features supported by
     GNU libc version 2.2.  These include all ISO C90 and C99 features,
     as well as features from the Single Unix Specification and some
     BSD and GNU extensions.  Other library implementations may not
     support all these features; GCC does not support warning about
     features that go beyond a particular library's limitations.
     However, if `-pedantic' is used with `-Wformat', warnings will be
     given about format features not in the selected standard version
     (but not for `strfmon' formats, since those are not in any version
     of the C standard).  *Note Options Controlling C Dialect: C
     Dialect Options.

     Since `-Wformat' also checks for null format arguments for several
     functions, `-Wformat' also implies `-Wnonnull'.

     `-Wformat' is included in `-Wall'.  For more control over some
     aspects of format checking, the options `-Wformat-y2k',
     `-Wno-format-extra-args', `-Wno-format-zero-length',
     `-Wformat-nonliteral', `-Wformat-security', and `-Wformat=2' are
     available, but are not included in `-Wall'.

`-Wformat-y2k'
     If `-Wformat' is specified, also warn about `strftime' formats
     which may yield only a two-digit year.

`-Wno-format-extra-args'
     If `-Wformat' is specified, do not warn about excess arguments to a
     `printf' or `scanf' format function.  The C standard specifies
     that such arguments are ignored.

     Where the unused arguments lie between used arguments that are
     specified with `$' operand number specifications, normally
     warnings are still given, since the implementation could not know
     what type to pass to `va_arg' to skip the unused arguments.
     However, in the case of `scanf' formats, this option will suppress
     the warning if the unused arguments are all pointers, since the
     Single Unix Specification says that such unused arguments are
     allowed.

`-Wno-format-zero-length'
     If `-Wformat' is specified, do not warn about zero-length formats.
     The C standard specifies that zero-length formats are allowed.

`-Wformat-nonliteral'
     If `-Wformat' is specified, also warn if the format string is not a
     string literal and so cannot be checked, unless the format function
     takes its format arguments as a `va_list'.

`-Wformat-security'
     If `-Wformat' is specified, also warn about uses of format
     functions that represent possible security problems.  At present,
     this warns about calls to `printf' and `scanf' functions where the
     format string is not a string literal and there are no format
     arguments, as in `printf (foo);'.  This may be a security hole if
     the format string came from untrusted input and contains `%n'.
     (This is currently a subset of what `-Wformat-nonliteral' warns
     about, but in future warnings may be added to `-Wformat-security'
     that are not included in `-Wformat-nonliteral'.)

`-Wformat=2'
     Enable `-Wformat' plus format checks not included in `-Wformat'.
     Currently equivalent to `-Wformat -Wformat-nonliteral
     -Wformat-security -Wformat-y2k'.

`-Wnonnull'
     Warn about passing a null pointer for arguments marked as
     requiring a non-null value by the `nonnull' function attribute.

     `-Wnonnull' is included in `-Wall' and `-Wformat'.  It can be
     disabled with the `-Wno-nonnull' option.

`-Winit-self (C, C++, and Objective-C only)'
     Warn about uninitialized variables which are initialized with
     themselves.  Note this option can only be used with the
     `-Wuninitialized' option, which in turn only works with `-O1' and
     above.

     For example, GCC will warn about `i' being uninitialized in the
     following snippet only when `-Winit-self' has been specified:
          int f()
          {
            int i = i;
            return i;
          }

`-Wimplicit-int'
     Warn when a declaration does not specify a type.

`-Wimplicit-function-declaration'
`-Werror-implicit-function-declaration'
     Give a warning (or error) whenever a function is used before being
     declared.

`-Wimplicit'
     Same as `-Wimplicit-int' and `-Wimplicit-function-declaration'.

`-Wmain'
     Warn if the type of `main' is suspicious.  `main' should be a
     function with external linkage, returning int, taking either zero
     arguments, two, or three arguments of appropriate types.

`-Wmissing-braces'
     Warn if an aggregate or union initializer is not fully bracketed.
     In the following example, the initializer for `a' is not fully
     bracketed, but that for `b' is fully bracketed.

          int a[2][2] = { 0, 1, 2, 3 };
          int b[2][2] = { { 0, 1 }, { 2, 3 } };

`-Wparentheses'
     Warn if parentheses are omitted in certain contexts, such as when
     there is an assignment in a context where a truth value is
     expected, or when operators are nested whose precedence people
     often get confused about.

     Also warn about constructions where there may be confusion to which
     `if' statement an `else' branch belongs.  Here is an example of
     such a case:

          {
            if (a)
              if (b)
                foo ();
            else
              bar ();
          }

     In C, every `else' branch belongs to the innermost possible `if'
     statement, which in this example is `if (b)'.  This is often not
     what the programmer expected, as illustrated in the above example
     by indentation the programmer chose.  When there is the potential
     for this confusion, GCC will issue a warning when this flag is
     specified.  To eliminate the warning, add explicit braces around
     the innermost `if' statement so there is no way the `else' could
     belong to the enclosing `if'.  The resulting code would look like
     this:

          {
            if (a)
              {
                if (b)
                  foo ();
                else
                  bar ();
              }
          }

`-Wsequence-point'
     Warn about code that may have undefined semantics because of
     violations of sequence point rules in the C standard.

     The C standard defines the order in which expressions in a C
     program are evaluated in terms of "sequence points", which
     represent a partial ordering between the execution of parts of the
     program: those executed before the sequence point, and those
     executed after it.  These occur after the evaluation of a full
     expression (one which is not part of a larger expression), after
     the evaluation of the first operand of a `&&', `||', `? :' or `,'
     (comma) operator, before a function is called (but after the
     evaluation of its arguments and the expression denoting the called
     function), and in certain other places.  Other than as expressed
     by the sequence point rules, the order of evaluation of
     subexpressions of an expression is not specified.  All these rules
     describe only a partial order rather than a total order, since,
     for example, if two functions are called within one expression
     with no sequence point between them, the order in which the
     functions are called is not specified.  However, the standards
     committee have ruled that function calls do not overlap.

     It is not specified when between sequence points modifications to
     the values of objects take effect.  Programs whose behavior
     depends on this have undefined behavior; the C standard specifies
     that "Between the previous and next sequence point an object shall
     have its stored value modified at most once by the evaluation of
     an expression.  Furthermore, the prior value shall be read only to
     determine the value to be stored.".  If a program breaks these
     rules, the results on any particular implementation are entirely
     unpredictable.

     Examples of code with undefined behavior are `a = a++;', `a[n] =
     b[n++]' and `a[i++] = i;'.  Some more complicated cases are not
     diagnosed by this option, and it may give an occasional false
     positive result, but in general it has been found fairly effective
     at detecting this sort of problem in programs.

     The present implementation of this option only works for C
     programs.  A future implementation may also work for C++ programs.

     The C standard is worded confusingly, therefore there is some
     debate over the precise meaning of the sequence point rules in
     subtle cases.  Links to discussions of the problem, including
     proposed formal definitions, may be found on the GCC readings
     page, at `http://gcc.gnu.org/readings.html'.

`-Wreturn-type'
     Warn whenever a function is defined with a return-type that
     defaults to `int'.  Also warn about any `return' statement with no
     return-value in a function whose return-type is not `void'.

     For C++, a function without return type always produces a
     diagnostic message, even when `-Wno-return-type' is specified.
     The only exceptions are `main' and functions defined in system
     headers.

`-Wswitch'
     Warn whenever a `switch' statement has an index of enumerated type
     and lacks a `case' for one or more of the named codes of that
     enumeration.  (The presence of a `default' label prevents this
     warning.)  `case' labels outside the enumeration range also
     provoke warnings when this option is used.

`-Wswitch-default'
     Warn whenever a `switch' statement does not have a `default' case.

`-Wswitch-enum'
     Warn whenever a `switch' statement has an index of enumerated type
     and lacks a `case' for one or more of the named codes of that
     enumeration.  `case' labels outside the enumeration range also
     provoke warnings when this option is used.

`-Wtrigraphs'
     Warn if any trigraphs are encountered that might change the
     meaning of the program (trigraphs within comments are not warned
     about).

`-Wunused-function'
     Warn whenever a static function is declared but not defined or a
     non\-inline static function is unused.

`-Wunused-label'
     Warn whenever a label is declared but not used.

     To suppress this warning use the `unused' attribute (*note
     Variable Attributes::).

`-Wunused-parameter'
     Warn whenever a function parameter is unused aside from its
     declaration.

     To suppress this warning use the `unused' attribute (*note
     Variable Attributes::).

`-Wunused-variable'
     Warn whenever a local variable or non-constant static variable is
     unused aside from its declaration

     To suppress this warning use the `unused' attribute (*note
     Variable Attributes::).

`-Wunused-value'
     Warn whenever a statement computes a result that is explicitly not
     used.

     To suppress this warning cast the expression to `void'.

`-Wunused'
     All the above `-Wunused' options combined.

     In order to get a warning about an unused function parameter, you
     must either specify `-Wextra -Wunused' (note that `-Wall' implies
     `-Wunused'), or separately specify `-Wunused-parameter'.

`-Wuninitialized'
     Warn if an automatic variable is used without first being
     initialized or if a variable may be clobbered by a `setjmp' call.

     These warnings are possible only in optimizing compilation,
     because they require data flow information that is computed only
     when optimizing.  If you don't specify `-O', you simply won't get
     these warnings.

     If you want to warn about code which uses the uninitialized value
     of the variable in its own initializer, use the `-Winit-self'
     option.

     These warnings occur only for variables that are candidates for
     register allocation.  Therefore, they do not occur for a variable
     that is declared `volatile', or whose address is taken, or whose
     size is other than 1, 2, 4 or 8 bytes.  Also, they do not occur for
     structures, unions or arrays, even when they are in registers.

     Note that there may be no warning about a variable that is used
     only to compute a value that itself is never used, because such
     computations may be deleted by data flow analysis before the
     warnings are printed.

     These warnings are made optional because GCC is not smart enough
     to see all the reasons why the code might be correct despite
     appearing to have an error.  Here is one example of how this can
     happen:

          {
            int x;
            switch (y)
              {
              case 1: x = 1;
                break;
              case 2: x = 4;
                break;
              case 3: x = 5;
              }
            foo (x);
          }

     If the value of `y' is always 1, 2 or 3, then `x' is always
     initialized, but GCC doesn't know this.  Here is another common
     case:

          {
            int save_y;
            if (change_y) save_y = y, y = new_y;
            ...
            if (change_y) y = save_y;
          }

     This has no bug because `save_y' is used only if it is set.

     This option also warns when a non-volatile automatic variable
     might be changed by a call to `longjmp'.  These warnings as well
     are possible only in optimizing compilation.

     The compiler sees only the calls to `setjmp'.  It cannot know
     where `longjmp' will be called; in fact, a signal handler could
     call it at any point in the code.  As a result, you may get a
     warning even when there is in fact no problem because `longjmp'
     cannot in fact be called at the place which would cause a problem.

     Some spurious warnings can be avoided if you declare all the
     functions you use that never return as `noreturn'.  *Note Function
     Attributes::.

`-Wunknown-pragmas'
     Warn when a #pragma directive is encountered which is not
     understood by GCC.  If this command line option is used, warnings
     will even be issued for unknown pragmas in system header files.
     This is not the case if the warnings were only enabled by the
     `-Wall' command line option.

`-Wstrict-aliasing'
     This option is only active when `-fstrict-aliasing' is active.  It
     warns about code which might break the strict aliasing rules that
     the compiler is using for optimization. The warning does not catch
     all cases, but does attempt to catch the more common pitfalls. It
     is included in `-Wall'.

`-Wall'
     All of the above `-W' options combined.  This enables all the
     warnings about constructions that some users consider
     questionable, and that are easy to avoid (or modify to prevent the
     warning), even in conjunction with macros.  This also enables some
     language-specific warnings described in *Note C++ Dialect
     Options:: and *Note Objective-C Dialect Options::.

 The following `-W...' options are not implied by `-Wall'.  Some of
them warn about constructions that users generally do not consider
questionable, but which occasionally you might wish to check for;
others warn about constructions that are necessary or hard to avoid in
some cases, and there is no simple way to modify the code to suppress
the warning.

`-Wextra'
     (This option used to be called `-W'.  The older name is still
     supported, but the newer name is more descriptive.)  Print extra
     warning messages for these events:

        * A function can return either with or without a value.
          (Falling off the end of the function body is considered
          returning without a value.)  For example, this function would
          evoke such a warning:

               foo (a)
               {
                 if (a > 0)
                   return a;
               }

        * An expression-statement or the left-hand side of a comma
          expression contains no side effects.  To suppress the
          warning, cast the unused expression to void.  For example, an
          expression such as `x[i,j]' will cause a warning, but
          `x[(void)i,j]' will not.

        * An unsigned value is compared against zero with `<' or `>='.

        * A comparison like `x<=y<=z' appears; this is equivalent to
          `(x<=y ? 1 : 0) <= z', which is a different interpretation
          from that of ordinary mathematical notation.

        * Storage-class specifiers like `static' are not the first
          things in a declaration.  According to the C Standard, this
          usage is obsolescent.

        * The return type of a function has a type qualifier such as
          `const'.  Such a type qualifier has no effect, since the
          value returned by a function is not an lvalue.  (But don't
          warn about the GNU extension of `volatile void' return types.
          That extension will be warned about if `-pedantic' is
          specified.)

        * If `-Wall' or `-Wunused' is also specified, warn about unused
          arguments.

        * A comparison between signed and unsigned values could produce
          an incorrect result when the signed value is converted to
          unsigned.  (But don't warn if `-Wno-sign-compare' is also
          specified.)

        * An aggregate has an initializer which does not initialize all
          members.  For example, the following code would cause such a
          warning, because `x.h' would be implicitly initialized to
          zero:

               struct s { int f, g, h; };
               struct s x = { 3, 4 };

        * A function parameter is declared without a type specifier in
          K&R-style functions:

               void foo(bar) { }

        * An empty body occurs in an `if' or `else' statement.

        * A pointer is compared against integer zero with `<', `<=',
          `>', or `>='.

        * A variable might be changed by `longjmp' or `vfork'.

        * Any of several floating-point events that often indicate
          errors, such as overflow, underflow, loss of precision, etc.

        * (C++ only) An enumerator and a non-enumerator both appear in
          a conditional expression.

        * (C++ only) A non-static reference or non-static `const'
          member appears in a class without constructors.

        * (C++ only) Ambiguous virtual bases.

        * (C++ only) Subscripting an array which has been declared
          `register'.

        * (C++ only) Taking the address of a variable which has been
          declared `register'.

        * (C++ only) A base class is not initialized in a derived
          class' copy constructor.

`-Wno-div-by-zero'
     Do not warn about compile-time integer division by zero.  Floating
     point division by zero is not warned about, as it can be a
     legitimate way of obtaining infinities and NaNs.

`-Wsystem-headers'
     Print warning messages for constructs found in system header files.
     Warnings from system headers are normally suppressed, on the
     assumption that they usually do not indicate real problems and
     would only make the compiler output harder to read.  Using this
     command line option tells GCC to emit warnings from system headers
     as if they occurred in user code.  However, note that using
     `-Wall' in conjunction with this option will _not_ warn about
     unknown pragmas in system headers--for that, `-Wunknown-pragmas'
     must also be used.

`-Wfloat-equal'
     Warn if floating point values are used in equality comparisons.

     The idea behind this is that sometimes it is convenient (for the
     programmer) to consider floating-point values as approximations to
     infinitely precise real numbers.  If you are doing this, then you
     need to compute (by analyzing the code, or in some other way) the
     maximum or likely maximum error that the computation introduces,
     and allow for it when performing comparisons (and when producing
     output, but that's a different problem).  In particular, instead
     of testing for equality, you would check to see whether the two
     values have ranges that overlap; and this is done with the
     relational operators, so equality comparisons are probably
     mistaken.

`-Wtraditional (C only)'
     Warn about certain constructs that behave differently in
     traditional and ISO C.  Also warn about ISO C constructs that have
     no traditional C equivalent, and/or problematic constructs which
     should be avoided.

        * Macro parameters that appear within string literals in the
          macro body.  In traditional C macro replacement takes place
          within string literals, but does not in ISO C.

        * In traditional C, some preprocessor directives did not exist.
          Traditional preprocessors would only consider a line to be a
          directive if the `#' appeared in column 1 on the line.
          Therefore `-Wtraditional' warns about directives that
          traditional C understands but would ignore because the `#'
          does not appear as the first character on the line.  It also
          suggests you hide directives like `#pragma' not understood by
          traditional C by indenting them.  Some traditional
          implementations would not recognize `#elif', so it suggests
          avoiding it altogether.

        * A function-like macro that appears without arguments.

        * The unary plus operator.

        * The `U' integer constant suffix, or the `F' or `L' floating
          point constant suffixes.  (Traditional C does support the `L'
          suffix on integer constants.)  Note, these suffixes appear in
          macros defined in the system headers of most modern systems,
          e.g. the `_MIN'/`_MAX' macros in `<limits.h>'.  Use of these
          macros in user code might normally lead to spurious warnings,
          however GCC's integrated preprocessor has enough context to
          avoid warning in these cases.

        * A function declared external in one block and then used after
          the end of the block.

        * A `switch' statement has an operand of type `long'.

        * A non-`static' function declaration follows a `static' one.
          This construct is not accepted by some traditional C
          compilers.

        * The ISO type of an integer constant has a different width or
          signedness from its traditional type.  This warning is only
          issued if the base of the constant is ten.  I.e. hexadecimal
          or octal values, which typically represent bit patterns, are
          not warned about.

        * Usage of ISO string concatenation is detected.

        * Initialization of automatic aggregates.

        * Identifier conflicts with labels.  Traditional C lacks a
          separate namespace for labels.

        * Initialization of unions.  If the initializer is zero, the
          warning is omitted.  This is done under the assumption that
          the zero initializer in user code appears conditioned on e.g.
          `__STDC__' to avoid missing initializer warnings and relies
          on default initialization to zero in the traditional C case.

        * Conversions by prototypes between fixed/floating point values
          and vice versa.  The absence of these prototypes when
          compiling with traditional C would cause serious problems.
          This is a subset of the possible conversion warnings, for the
          full set use `-Wconversion'.

        * Use of ISO C style function definitions.  This warning
          intentionally is _not_ issued for prototype declarations or
          variadic functions because these ISO C features will appear
          in your code when using libiberty's traditional C
          compatibility macros, `PARAMS' and `VPARAMS'.  This warning
          is also bypassed for nested functions because that feature is
          already a GCC extension and thus not relevant to traditional
          C compatibility.

`-Wdeclaration-after-statement (C only)'
     Warn when a declaration is found after a statement in a block.
     This construct, known from C++, was introduced with ISO C99 and is
     by default allowed in GCC.  It is not supported by ISO C90 and was
     not supported by GCC versions before GCC 3.0.  *Note Mixed
     Declarations::.

`-Wundef'
     Warn if an undefined identifier is evaluated in an `#if' directive.

`-Wendif-labels'
     Warn whenever an `#else' or an `#endif' are followed by text.

`-Wshadow'
     Warn whenever a local variable shadows another local variable,
     parameter or global variable or whenever a built-in function is
     shadowed.

`-Wlarger-than-LEN'
     Warn whenever an object of larger than LEN bytes is defined.

`-Wpointer-arith'
     Warn about anything that depends on the "size of" a function type
     or of `void'.  GNU C assigns these types a size of 1, for
     convenience in calculations with `void *' pointers and pointers to
     functions.

`-Wbad-function-cast (C only)'
     Warn whenever a function call is cast to a non-matching type.  For
     example, warn if `int malloc()' is cast to `anything *'.

`-Wcast-qual'
     Warn whenever a pointer is cast so as to remove a type qualifier
     from the target type.  For example, warn if a `const char *' is
     cast to an ordinary `char *'.

`-Wcast-align'
     Warn whenever a pointer is cast such that the required alignment
     of the target is increased.  For example, warn if a `char *' is
     cast to an `int *' on machines where integers can only be accessed
     at two- or four-byte boundaries.

`-Wwrite-strings'
     When compiling C, give string constants the type `const
     char[LENGTH]' so that copying the address of one into a
     non-`const' `char *' pointer will get a warning; when compiling
     C++, warn about the deprecated conversion from string constants to
     `char *'.  These warnings will help you find at compile time code
     that can try to write into a string constant, but only if you have
     been very careful about using `const' in declarations and
     prototypes.  Otherwise, it will just be a nuisance; this is why we
     did not make `-Wall' request these warnings.

`-Wconversion'
     Warn if a prototype causes a type conversion that is different
     from what would happen to the same argument in the absence of a
     prototype.  This includes conversions of fixed point to floating
     and vice versa, and conversions changing the width or signedness
     of a fixed point argument except when the same as the default
     promotion.

     Also, warn if a negative integer constant expression is implicitly
     converted to an unsigned type.  For example, warn about the
     assignment `x = -1' if `x' is unsigned.  But do not warn about
     explicit casts like `(unsigned) -1'.

`-Wsign-compare'
     Warn when a comparison between signed and unsigned values could
     produce an incorrect result when the signed value is converted to
     unsigned.  This warning is also enabled by `-Wextra'; to get the
     other warnings of `-Wextra' without this warning, use `-Wextra
     -Wno-sign-compare'.

`-Waggregate-return'
     Warn if any functions that return structures or unions are defined
     or called.  (In languages where you can return an array, this also
     elicits a warning.)

`-Wstrict-prototypes (C only)'
     Warn if a function is declared or defined without specifying the
     argument types.  (An old-style function definition is permitted
     without a warning if preceded by a declaration which specifies the
     argument types.)

`-Wold-style-definition (C only)'
     Warn if an old-style function definition is used.  A warning is
     given even if there is a previous prototype.

`-Wmissing-prototypes (C only)'
     Warn if a global function is defined without a previous prototype
     declaration.  This warning is issued even if the definition itself
     provides a prototype.  The aim is to detect global functions that
     fail to be declared in header files.

`-Wmissing-declarations (C only)'
     Warn if a global function is defined without a previous
     declaration.  Do so even if the definition itself provides a
     prototype.  Use this option to detect global functions that are
     not declared in header files.

`-Wmissing-noreturn'
     Warn about functions which might be candidates for attribute
     `noreturn'.  Note these are only possible candidates, not absolute
     ones.  Care should be taken to manually verify functions actually
     do not ever return before adding the `noreturn' attribute,
     otherwise subtle code generation bugs could be introduced.  You
     will not get a warning for `main' in hosted C environments.

`-Wmissing-format-attribute'
     If `-Wformat' is enabled, also warn about functions which might be
     candidates for `format' attributes.  Note these are only possible
     candidates, not absolute ones.  GCC will guess that `format'
     attributes might be appropriate for any function that calls a
     function like `vprintf' or `vscanf', but this might not always be
     the case, and some functions for which `format' attributes are
     appropriate may not be detected.  This option has no effect unless
     `-Wformat' is enabled (possibly by `-Wall').

`-Wno-multichar'
     Do not warn if a multicharacter constant (`'FOOF'') is used.
     Usually they indicate a typo in the user's code, as they have
     implementation-defined values, and should not be used in portable
     code.

`-Wno-deprecated-declarations'
     Do not warn about uses of functions, variables, and types marked as
     deprecated by using the `deprecated' attribute.  (*note Function
     Attributes::, *note Variable Attributes::, *note Type
     Attributes::.)

`-Wpacked'
     Warn if a structure is given the packed attribute, but the packed
     attribute has no effect on the layout or size of the structure.
     Such structures may be mis-aligned for little benefit.  For
     instance, in this code, the variable `f.x' in `struct bar' will be
     misaligned even though `struct bar' does not itself have the
     packed attribute:

          struct foo {
            int x;
            char a, b, c, d;
          } __attribute__((packed));
          struct bar {
            char z;
            struct foo f;
          };

`-Wpadded'
     Warn if padding is included in a structure, either to align an
     element of the structure or to align the whole structure.
     Sometimes when this happens it is possible to rearrange the fields
     of the structure to reduce the padding and so make the structure
     smaller.

`-Wredundant-decls'
     Warn if anything is declared more than once in the same scope,
     even in cases where multiple declaration is valid and changes
     nothing.

`-Wnested-externs (C only)'
     Warn if an `extern' declaration is encountered within a function.

`-Wunreachable-code'
     Warn if the compiler detects that code will never be executed.

     This option is intended to warn when the compiler detects that at
     least a whole line of source code will never be executed, because
     some condition is never satisfied or because it is after a
     procedure that never returns.

     It is possible for this option to produce a warning even though
     there are circumstances under which part of the affected line can
     be executed, so care should be taken when removing
     apparently-unreachable code.

     For instance, when a function is inlined, a warning may mean that
     the line is unreachable in only one inlined copy of the function.

     This option is not made part of `-Wall' because in a debugging
     version of a program there is often substantial code which checks
     correct functioning of the program and is, hopefully, unreachable
     because the program does work.  Another common use of unreachable
     code is to provide behavior which is selectable at compile-time.

`-Winline'
     Warn if a function can not be inlined and it was declared as
     inline.  Even with this option, the compiler will not warn about
     failures to inline functions declared in system headers.

     The compiler uses a variety of heuristics to determine whether or
     not to inline a function.  For example, the compiler takes into
     account the size of the function being inlined and the the amount
     of inlining that has already been done in the current function.
     Therefore, seemingly insignificant changes in the source program
     can cause the warnings produced by `-Winline' to appear or
     disappear.

`-Wno-invalid-offsetof (C++ only)'
     Suppress warnings from applying the `offsetof' macro to a non-POD
     type.  According to the 1998 ISO C++ standard, applying `offsetof'
     to a non-POD type is undefined.  In existing C++ implementations,
     however, `offsetof' typically gives meaningful results even when
     applied to certain kinds of non-POD types. (Such as a simple
     `struct' that fails to be a POD type only by virtue of having a
     constructor.)  This flag is for users who are aware that they are
     writing nonportable code and who have deliberately chosen to
     ignore the warning about it.

     The restrictions on `offsetof' may be relaxed in a future version
     of the C++ standard.

`-Winvalid-pch'
     Warn if a precompiled header (*note Precompiled Headers::) is
     found in the search path but can't be used.

`-Wlong-long'
     Warn if `long long' type is used.  This is default.  To inhibit
     the warning messages, use `-Wno-long-long'.  Flags `-Wlong-long'
     and `-Wno-long-long' are taken into account only when `-pedantic'
     flag is used.

`-Wdisabled-optimization'
     Warn if a requested optimization pass is disabled.  This warning
     does not generally indicate that there is anything wrong with your
     code; it merely indicates that GCC's optimizers were unable to
     handle the code effectively.  Often, the problem is that your code
     is too big or too complex; GCC will refuse to optimize programs
     when the optimization itself is likely to take inordinate amounts
     of time.

`-Werror'
     Make all warnings into errors.

File: gcc.info,  Node: Debugging Options,  Next: Optimize Options,  Prev: Warning Options,  Up: Invoking GCC

3.9 Options for Debugging Your Program or GCC
=============================================

GCC has various special options that are used for debugging either your
program or GCC:

`-g'
     Produce debugging information in the operating system's native
     format (stabs, COFF, XCOFF, or DWARF).  GDB can work with this
     debugging information.

     On most systems that use stabs format, `-g' enables use of extra
     debugging information that only GDB can use; this extra information
     makes debugging work better in GDB but will probably make other
     debuggers crash or refuse to read the program.  If you want to
     control for certain whether to generate the extra information, use
     `-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', or `-gvms' (see
     below).

     Unlike most other C compilers, GCC allows you to use `-g' with
     `-O'.  The shortcuts taken by optimized code may occasionally
     produce surprising results: some variables you declared may not
     exist at all; flow of control may briefly move where you did not
     expect it; some statements may not be executed because they
     compute constant results or their values were already at hand;
     some statements may execute in different places because they were
     moved out of loops.

     Nevertheless it proves possible to debug optimized output.  This
     makes it reasonable to use the optimizer for programs that might
     have bugs.

     The following options are useful when GCC is generated with the
     capability for more than one debugging format.

`-ggdb'
     Produce debugging information for use by GDB.  This means to use
     the most expressive format available (DWARF 2, stabs, or the
     native format if neither of those are supported), including GDB
     extensions if at all possible.

`-gstabs'
     Produce debugging information in stabs format (if that is
     supported), without GDB extensions.  This is the format used by
     DBX on most BSD systems.  On MIPS, Alpha and System V Release 4
     systems this option produces stabs debugging output which is not
     understood by DBX or SDB.  On System V Release 4 systems this
     option requires the GNU assembler.

`-feliminate-unused-debug-symbols'
     Produce debugging information in stabs format (if that is
     supported), for only symbols that are actually used.

`-gstabs+'
     Produce debugging information in stabs format (if that is
     supported), using GNU extensions understood only by the GNU
     debugger (GDB).  The use of these extensions is likely to make
     other debuggers crash or refuse to read the program.

`-gcoff'
     Produce debugging information in COFF format (if that is
     supported).  This is the format used by SDB on most System V
     systems prior to System V Release 4.

`-gxcoff'
     Produce debugging information in XCOFF format (if that is
     supported).  This is the format used by the DBX debugger on IBM
     RS/6000 systems.

`-gxcoff+'
     Produce debugging information in XCOFF format (if that is
     supported), using GNU extensions understood only by the GNU
     debugger (GDB).  The use of these extensions is likely to make
     other debuggers crash or refuse to read the program, and may cause
     assemblers other than the GNU assembler (GAS) to fail with an
     error.

`-gdwarf-2'
     Produce debugging information in DWARF version 2 format (if that is
     supported).  This is the format used by DBX on IRIX 6.

`-gvms'
     Produce debugging information in VMS debug format (if that is
     supported).  This is the format used by DEBUG on VMS systems.

`-gLEVEL'
`-ggdbLEVEL'
`-gstabsLEVEL'
`-gcoffLEVEL'
`-gxcoffLEVEL'
`-gvmsLEVEL'
     Request debugging information and also use LEVEL to specify how
     much information.  The default level is 2.

     Level 1 produces minimal information, enough for making backtraces
     in parts of the program that you don't plan to debug.  This
     includes descriptions of functions and external variables, but no
     information about local variables and no line numbers.

     Level 3 includes extra information, such as all the macro
     definitions present in the program.  Some debuggers support macro
     expansion when you use `-g3'.

     Note that in order to avoid confusion between DWARF1 debug level 2,
     and DWARF2 `-gdwarf-2' does not accept a concatenated debug level.
     Instead use an additional `-gLEVEL' option to change the debug
     level for DWARF2.

`-feliminate-dwarf2-dups'
     Compress DWARF2 debugging information by eliminating duplicated
     information about each symbol.  This option only makes sense when
     generating DWARF2 debugging information with `-gdwarf-2'.

`-p'
     Generate extra code to write profile information suitable for the
     analysis program `prof'.  You must use this option when compiling
     the source files you want data about, and you must also use it when
     linking.

`-pg'
     Generate extra code to write profile information suitable for the
     analysis program `gprof'.  You must use this option when compiling
     the source files you want data about, and you must also use it when
     linking.

`-Q'
     Makes the compiler print out each function name as it is compiled,
     and print some statistics about each pass when it finishes.

`-ftime-report'
     Makes the compiler print some statistics about the time consumed
     by each pass when it finishes.

`-fmem-report'
     Makes the compiler print some statistics about permanent memory
     allocation when it finishes.

`-fprofile-arcs'
     Add code so that program flow "arcs" are instrumented.  During
     execution the program records how many times each branch and call
     is executed and how many times it is taken or returns.  When the
     compiled program exits it saves this data to a file called
     `AUXNAME.gcda' for each source file. The data may be used for
     profile-directed optimizations (`-fbranch-probabilities'), or for
     test coverage analysis (`-ftest-coverage'). Each object file's
     AUXNAME is generated from the name of the output file, if
     explicitly specified and it is not the final executable, otherwise
     it is the basename of the source file. In both cases any suffix is
     removed (e.g.  `foo.gcda' for input file `dir/foo.c', or
     `dir/foo.gcda' for output file specified as `-o dir/foo.o').

        * Compile the source files with `-fprofile-arcs' plus
          optimization and code generation options. For test coverage
          analysis, use the additional `-ftest-coverage' option. You do
          not need to profile every source file in a program.

        * Link your object files with `-lgcov' or `-fprofile-arcs' (the
          latter implies the former).

        * Run the program on a representative workload to generate the
          arc profile information. This may be repeated any number of
          times. You can run concurrent instances of your program, and
          provided that the file system supports locking, the data
          files will be correctly updated. Also `fork' calls are
          detected and correctly handled (double counting will not
          happen).

        * For profile-directed optimizations, compile the source files
          again with the same optimization and code generation options
          plus `-fbranch-probabilities' (*note Options that Control
          Optimization: Optimize Options.).

        * For test coverage analysis, use `gcov' to produce human
          readable information from the `.gcno' and `.gcda' files.
          Refer to the `gcov' documentation for further information.


     With `-fprofile-arcs', for each function of your program GCC
     creates a program flow graph, then finds a spanning tree for the
     graph.  Only arcs that are not on the spanning tree have to be
     instrumented: the compiler adds code to count the number of times
     that these arcs are executed.  When an arc is the only exit or
     only entrance to a block, the instrumentation code can be added to
     the block; otherwise, a new basic block must be created to hold
     the instrumentation code.

`-ftest-coverage'
     Produce a notes file that the `gcov' code-coverage utility (*note
     `gcov'--a Test Coverage Program: Gcov.) can use to show program
     coverage. Each source file's note file is called `AUXNAME.gcno'.
     Refer to the `-fprofile-arcs' option above for a description of
     AUXNAME and instructions on how to generate test coverage data.
     Coverage data will match the source files more closely, if you do
     not optimize.

`-dLETTERS'
     Says to make debugging dumps during compilation at times specified
     by LETTERS.  This is used for debugging the compiler.  The file
     names for most of the dumps are made by appending a pass number
     and a word to the DUMPNAME. DUMPNAME is generated from the name of
     the output file, if explicitly specified and it is not an
     executable, otherwise it is the basename of the source file. In
     both cases any suffix is removed (e.g.  `foo.01.rtl' or
     `foo.02.sibling').  Here are the possible letters for use in
     LETTERS, and their meanings:

    `A'
          Annotate the assembler output with miscellaneous debugging
          information.

    `b'
          Dump after computing branch probabilities, to `FILE.12.bp'.

    `B'
          Dump after block reordering, to `FILE.31.bbro'.

    `c'
          Dump after instruction combination, to the file
          `FILE.20.combine'.

    `C'
          Dump after the first if conversion, to the file `FILE.14.ce1'.
          Also dump after the second if conversion, to the file
          `FILE.21.ce2'.

    `d'
          Dump after branch target load optimization, to to
          `FILE.32.btl'.  Also dump after delayed branch scheduling, to
          `FILE.36.dbr'.

    `D'
          Dump all macro definitions, at the end of preprocessing, in
          addition to normal output.

    `E'
          Dump after the third if conversion, to `FILE.30.ce3'.

    `f'
          Dump after control and data flow analysis, to `FILE.11.cfg'.
          Also dump after life analysis, to `FILE.19.life'.

    `F'
          Dump after purging `ADDRESSOF' codes, to `FILE.07.addressof'.

    `g'
          Dump after global register allocation, to `FILE.25.greg'.

    `G'
          Dump after GCSE, to `FILE.08.gcse'.  Also dump after jump
          bypassing and control flow optimizations, to `FILE.10.bypass'.

    `h'
          Dump after finalization of EH handling code, to `FILE.03.eh'.

    `i'
          Dump after sibling call optimizations, to `FILE.02.sibling'.

    `j'
          Dump after the first jump optimization, to `FILE.04.jump'.

    `k'
          Dump after conversion from registers to stack, to
          `FILE.34.stack'.

    `l'
          Dump after local register allocation, to `FILE.24.lreg'.

    `L'
          Dump after loop optimization passes, to `FILE.09.loop' and
          `FILE.16.loop2'.

    `M'
          Dump after performing the machine dependent reorganization
          pass, to `FILE.35.mach'.

    `n'
          Dump after register renumbering, to `FILE.29.rnreg'.

    `N'
          Dump after the register move pass, to `FILE.22.regmove'.

    `o'
          Dump after post-reload optimizations, to `FILE.26.postreload'.

    `r'
          Dump after RTL generation, to `FILE.01.rtl'.

    `R'
          Dump after the second scheduling pass, to `FILE.33.sched2'.

    `s'
          Dump after CSE (including the jump optimization that
          sometimes follows CSE), to `FILE.06.cse'.

    `S'
          Dump after the first scheduling pass, to `FILE.23.sched'.

    `t'
          Dump after the second CSE pass (including the jump
          optimization that sometimes follows CSE), to `FILE.18.cse2'.

    `T'
          Dump after running tracer, to `FILE.15.tracer'.

    `u'
          Dump after null pointer elimination pass to `FILE.05.null'.

    `U'
          Dump callgraph and unit-at-a-time optimization `FILE.00.unit'.

    `V'
          Dump after the value profile transformations, to
          `FILE.13.vpt'.  Also dump after variable tracking, to
          `FILE.35.vartrack'.

    `w'
          Dump after the second flow pass, to `FILE.27.flow2'.

    `z'
          Dump after the peephole pass, to `FILE.28.peephole2'.

    `Z'
          Dump after constructing the web, to `FILE.17.web'.

    `a'
          Produce all the dumps listed above.

    `H'
          Produce a core dump whenever an error occurs.

    `m'
          Print statistics on memory usage, at the end of the run, to
          standard error.

    `p'
          Annotate the assembler output with a comment indicating which
          pattern and alternative was used.  The length of each
          instruction is also printed.

    `P'
          Dump the RTL in the assembler output as a comment before each
          instruction.  Also turns on `-dp' annotation.

    `v'
          For each of the other indicated dump files (except for
          `FILE.01.rtl'), dump a representation of the control flow
          graph suitable for viewing with VCG to `FILE.PASS.vcg'.

    `x'
          Just generate RTL for a function instead of compiling it.
          Usually used with `r'.

    `y'
          Dump debugging information during parsing, to standard error.

`-fdump-unnumbered'
     When doing debugging dumps (see `-d' option above), suppress
     instruction numbers and line number note output.  This makes it
     more feasible to use diff on debugging dumps for compiler
     invocations with different options, in particular with and without
     `-g'.

`-fdump-translation-unit (C and C++ only)'
`-fdump-translation-unit-OPTIONS (C and C++ only)'
     Dump a representation of the tree structure for the entire
     translation unit to a file.  The file name is made by appending
     `.tu' to the source file name.  If the `-OPTIONS' form is used,
     OPTIONS controls the details of the dump as described for the
     `-fdump-tree' options.

`-fdump-class-hierarchy (C++ only)'
`-fdump-class-hierarchy-OPTIONS (C++ only)'
     Dump a representation of each class's hierarchy and virtual
     function table layout to a file.  The file name is made by
     appending `.class' to the source file name.  If the `-OPTIONS'
     form is used, OPTIONS controls the details of the dump as
     described for the `-fdump-tree' options.

`-fdump-tree-SWITCH (C++ only)'
`-fdump-tree-SWITCH-OPTIONS (C++ only)'
     Control the dumping at various stages of processing the
     intermediate language tree to a file.  The file name is generated
     by appending a switch specific suffix to the source file name.  If
     the `-OPTIONS' form is used, OPTIONS is a list of `-' separated
     options that control the details of the dump. Not all options are
     applicable to all dumps, those which are not meaningful will be
     ignored. The following options are available

    `address'
          Print the address of each node.  Usually this is not
          meaningful as it changes according to the environment and
          source file. Its primary use is for tying up a dump file with
          a debug environment.

    `slim'
          Inhibit dumping of members of a scope or body of a function
          merely because that scope has been reached. Only dump such
          items when they are directly reachable by some other path.

    `all'
          Turn on all options.

     The following tree dumps are possible:
    `original'
          Dump before any tree based optimization, to `FILE.original'.

    `optimized'
          Dump after all tree based optimization, to `FILE.optimized'.

    `inlined'
          Dump after function inlining, to `FILE.inlined'.

`-frandom-seed=STRING'
     This option provides a seed that GCC uses when it would otherwise
     use random numbers.  It is used to generate certain symbol names
     that have to be different in every compiled file. It is also used
     to place unique stamps in coverage data files and the object files
     that produce them. You can use the `-frandom-seed' option to
     produce reproducibly identical object files.

     The STRING should be different for every file you compile.

`-fsched-verbose=N'
     On targets that use instruction scheduling, this option controls
     the amount of debugging output the scheduler prints.  This
     information is written to standard error, unless `-dS' or `-dR' is
     specified, in which case it is output to the usual dump listing
     file, `.sched' or `.sched2' respectively.  However for N greater
     than nine, the output is always printed to standard error.

     For N greater than zero, `-fsched-verbose' outputs the same
     information as `-dRS'.  For N greater than one, it also output
     basic block probabilities, detailed ready list information and
     unit/insn info.  For N greater than two, it includes RTL at abort
     point, control-flow and regions info.  And for N over four,
     `-fsched-verbose' also includes dependence info.

`-save-temps'
     Store the usual "temporary" intermediate files permanently; place
     them in the current directory and name them based on the source
     file.  Thus, compiling `foo.c' with `-c -save-temps' would produce
     files `foo.i' and `foo.s', as well as `foo.o'.  This creates a
     preprocessed `foo.i' output file even though the compiler now
     normally uses an integrated preprocessor.

`-time'
     Report the CPU time taken by each subprocess in the compilation
     sequence.  For C source files, this is the compiler proper and
     assembler (plus the linker if linking is done).  The output looks
     like this:

          # cc1 0.12 0.01
          # as 0.00 0.01

     The first number on each line is the "user time," that is time
     spent executing the program itself.  The second number is "system
     time," time spent executing operating system routines on behalf of
     the program.  Both numbers are in seconds.

`-fvar-tracking'
     Run variable tracking pass. It computes where variables are stored
     at each position in code. Better debugging information is then
     generated (if the debugging information format supports this
     information).

     It is enabled by default when compiling with optimization (`-Os',
     `-O', `-O2', ...), debugging information (`-g') and the debug info
     format supports it.

`-print-file-name=LIBRARY'
     Print the full absolute name of the library file LIBRARY that
     would be used when linking--and don't do anything else.  With this
     option, GCC does not compile or link anything; it just prints the
     file name.

`-print-multi-directory'
     Print the directory name corresponding to the multilib selected by
     any other switches present in the command line.  This directory is
     supposed to exist in `GCC_EXEC_PREFIX'.

`-print-multi-lib'
     Print the mapping from multilib directory names to compiler
     switches that enable them.  The directory name is separated from
     the switches by `;', and each switch starts with an `@' instead of
     the `-', without spaces between multiple switches.  This is
     supposed to ease shell-processing.

`-print-prog-name=PROGRAM'
     Like `-print-file-name', but searches for a program such as `cpp'.

`-print-libgcc-file-name'
     Same as `-print-file-name=libgcc.a'.

     This is useful when you use `-nostdlib' or `-nodefaultlibs' but
     you do want to link with `libgcc.a'.  You can do

          gcc -nostdlib FILES... `gcc -print-libgcc-file-name`

`-print-search-dirs'
     Print the name of the configured installation directory and a list
     of program and library directories `gcc' will search--and don't do
     anything else.

     This is useful when `gcc' prints the error message `installation
     problem, cannot exec cpp0: No such file or directory'.  To resolve
     this you either need to put `cpp0' and the other compiler
     components where `gcc' expects to find them, or you can set the
     environment variable `GCC_EXEC_PREFIX' to the directory where you
     installed them.  Don't forget the trailing '/'.  *Note Environment
     Variables::.

`-dumpmachine'
     Print the compiler's target machine (for example,
     `i686-pc-linux-gnu')--and don't do anything else.

`-dumpversion'
     Print the compiler version (for example, `3.0')--and don't do
     anything else.

`-dumpspecs'
     Print the compiler's built-in specs--and don't do anything else.
     (This is used when GCC itself is being built.)  *Note Spec Files::.

`-feliminate-unused-debug-types'
     Normally, when producing DWARF2 output, GCC will emit debugging
     information for all types declared in a compilation unit,
     regardless of whether or not they are actually used in that
     compilation unit.  Sometimes this is useful, such as if, in the
     debugger, you want to cast a value to a type that is not actually
     used in your program (but is declared).  More often, however, this
     results in a significant amount of wasted space.  With this
     option, GCC will avoid producing debug symbol output for types
     that are nowhere used in the source file being compiled.

File: gcc.info,  Node: Optimize Options,  Next: Preprocessor Options,  Prev: Debugging Options,  Up: Invoking GCC

3.10 Options That Control Optimization
======================================

These options control various sorts of optimizations.

 Without any optimization option, the compiler's goal is to reduce the
cost of compilation and to make debugging produce the expected results.
Statements are independent: if you stop the program with a breakpoint
between statements, you can then assign a new value to any variable or
change the program counter to any other statement in the function and
get exactly the results you would expect from the source code.

 Turning on optimization flags makes the compiler attempt to improve
the performance and/or code size at the expense of compilation time and
possibly the ability to debug the program.

 The compiler performs optimization based on the knowledge it has of
the program.  Using the `-funit-at-a-time' flag will allow the compiler
to consider information gained from later functions in the file when
compiling a function.  Compiling multiple files at once to a single
output file (and using `-funit-at-a-time') will allow the compiler to
use information gained from all of the files when compiling each of
them.

 Not all optimizations are controlled directly by a flag.  Only
optimizations that have a flag are listed.

`-O'
`-O1'
     Optimize.  Optimizing compilation takes somewhat more time, and a
     lot more memory for a large function.

     With `-O', the compiler tries to reduce code size and execution
     time, without performing any optimizations that take a great deal
     of compilation time.

     `-O' turns on the following optimization flags:
          -fdefer-pop
          -fmerge-constants
          -fthread-jumps
          -floop-optimize
          -fif-conversion
          -fif-conversion2
          -fdelayed-branch
          -fguess-branch-probability
          -fcprop-registers

     `-O' also turns on `-fomit-frame-pointer' on machines where doing
     so does not interfere with debugging.

`-O2'
     Optimize even more.  GCC performs nearly all supported
     optimizations that do not involve a space-speed tradeoff.  The
     compiler does not perform loop unrolling or function inlining when
     you specify `-O2'.  As compared to `-O', this option increases
     both compilation time and the performance of the generated code.

     `-O2' turns on all optimization flags specified by `-O'.  It also
     turns on the following optimization flags:
          -fforce-mem
          -foptimize-sibling-calls
          -fstrength-reduce
          -fcse-follow-jumps  -fcse-skip-blocks
          -frerun-cse-after-loop  -frerun-loop-opt
          -fgcse  -fgcse-lm  -fgcse-sm  -fgcse-las
          -fdelete-null-pointer-checks
          -fexpensive-optimizations
          -fregmove
          -fschedule-insns  -fschedule-insns2
          -fsched-interblock  -fsched-spec
          -fcaller-saves
          -fpeephole2
          -freorder-blocks  -freorder-functions
          -fstrict-aliasing
          -funit-at-a-time
          -falign-functions  -falign-jumps
          -falign-loops  -falign-labels
          -fcrossjumping

     Please note the warning under `-fgcse' about invoking `-O2' on
     programs that use computed gotos.

`-O3'
     Optimize yet more.  `-O3' turns on all optimizations specified by
     `-O2' and also turns on the `-finline-functions', `-fweb',
     `-frename-registers' and `-funswitch-loops' options.

`-O0'
     Do not optimize.  This is the default.

`-Os'
     Optimize for size.  `-Os' enables all `-O2' optimizations that do
     not typically increase code size.  It also performs further
     optimizations designed to reduce code size.

     `-Os' disables the following optimization flags:
          -falign-functions  -falign-jumps  -falign-loops
          -falign-labels  -freorder-blocks  -fprefetch-loop-arrays

     If you use multiple `-O' options, with or without level numbers,
     the last such option is the one that is effective.

 Options of the form `-fFLAG' specify machine-independent flags.  Most
flags have both positive and negative forms; the negative form of
`-ffoo' would be `-fno-foo'.  In the table below, only one of the forms
is listed--the one you typically will use.  You can figure out the
other form by either removing `no-' or adding it.

 The following options control specific optimizations.  They are either
activated by `-O' options or are related to ones that are.  You can use
the following flags in the rare cases when "fine-tuning" of
optimizations to be performed is desired.

`-fno-default-inline'
     Do not make member functions inline by default merely because they
     are defined inside the class scope (C++ only).  Otherwise, when
     you specify `-O', member functions defined inside class scope are
     compiled inline by default; i.e., you don't need to add `inline'
     in front of the member function name.

`-fno-defer-pop'
     Always pop the arguments to each function call as soon as that
     function returns.  For machines which must pop arguments after a
     function call, the compiler normally lets arguments accumulate on
     the stack for several function calls and pops them all at once.

     Disabled at levels `-O', `-O2', `-O3', `-Os'.

`-fforce-mem'
     Force memory operands to be copied into registers before doing
     arithmetic on them.  This produces better code by making all memory
     references potential common subexpressions.  When they are not
     common subexpressions, instruction combination should eliminate
     the separate register-load.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fforce-addr'
     Force memory address constants to be copied into registers before
     doing arithmetic on them.  This may produce better code just as
     `-fforce-mem' may.

`-fomit-frame-pointer'
     Don't keep the frame pointer in a register for functions that
     don't need one.  This avoids the instructions to save, set up and
     restore frame pointers; it also makes an extra register available
     in many functions.  *It also makes debugging impossible on some
     machines.*

     On some machines, such as the VAX, this flag has no effect, because
     the standard calling sequence automatically handles the frame
     pointer and nothing is saved by pretending it doesn't exist.  The
     machine-description macro `FRAME_POINTER_REQUIRED' controls
     whether a target machine supports this flag.  *Note Register
     Usage: (gccint)Registers.

     Enabled at levels `-O', `-O2', `-O3', `-Os'.

`-foptimize-sibling-calls'
     Optimize sibling and tail recursive calls.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fno-inline'
     Don't pay attention to the `inline' keyword.  Normally this option
     is used to keep the compiler from expanding any functions inline.
     Note that if you are not optimizing, no functions can be expanded
     inline.

`-finline-functions'
     Integrate all simple functions into their callers.  The compiler
     heuristically decides which functions are simple enough to be worth
     integrating in this way.

     If all calls to a given function are integrated, and the function
     is declared `static', then the function is normally not output as
     assembler code in its own right.

     Enabled at level `-O3'.

`-finline-limit=N'
     By default, GCC limits the size of functions that can be inlined.
     This flag allows the control of this limit for functions that are
     explicitly marked as inline (i.e., marked with the inline keyword
     or defined within the class definition in c++).  N is the size of
     functions that can be inlined in number of pseudo instructions
     (not counting parameter handling).  The default value of N is 600.
     Increasing this value can result in more inlined code at the cost
     of compilation time and memory consumption.  Decreasing usually
     makes the compilation faster and less code will be inlined (which
     presumably means slower programs).  This option is particularly
     useful for programs that use inlining heavily such as those based
     on recursive templates with C++.

     Inlining is actually controlled by a number of parameters, which
     may be specified individually by using `--param NAME=VALUE'.  The
     `-finline-limit=N' option sets some of these parameters as follows:

    `max-inline-insns-single'
          is set to N/2.

    `max-inline-insns-auto'
          is set to N/2.

    `min-inline-insns'
          is set to 130 or N/4, whichever is smaller.

    `max-inline-insns-rtl'
          is set to N.

     See below for a documentation of the individual parameters
     controlling inlining.

     _Note:_ pseudo instruction represents, in this particular context,
     an abstract measurement of function's size.  In no way, it
     represents a count of assembly instructions and as such its exact
     meaning might change from one release to an another.

`-fkeep-inline-functions'
     Even if all calls to a given function are integrated, and the
     function is declared `static', nevertheless output a separate
     run-time callable version of the function.  This switch does not
     affect `extern inline' functions.

`-fkeep-static-consts'
     Emit variables declared `static const' when optimization isn't
     turned on, even if the variables aren't referenced.

     GCC enables this option by default.  If you want to force the
     compiler to check if the variable was referenced, regardless of
     whether or not optimization is turned on, use the
     `-fno-keep-static-consts' option.

`-fmerge-constants'
     Attempt to merge identical constants (string constants and
     floating point constants) across compilation units.

     This option is the default for optimized compilation if the
     assembler and linker support it.  Use `-fno-merge-constants' to
     inhibit this behavior.

     Enabled at levels `-O', `-O2', `-O3', `-Os'.

`-fmerge-all-constants'
     Attempt to merge identical constants and identical variables.

     This option implies `-fmerge-constants'.  In addition to
     `-fmerge-constants' this considers e.g. even constant initialized
     arrays or initialized constant variables with integral or floating
     point types.  Languages like C or C++ require each non-automatic
     variable to have distinct location, so using this option will
     result in non-conforming behavior.

`-fnew-ra'
     Use a graph coloring register allocator.  Currently this option is
     meant only for testing.  Users should not specify this option,
     since it is not yet ready for production use.

`-fno-branch-count-reg'
     Do not use "decrement and branch" instructions on a count register,
     but instead generate a sequence of instructions that decrement a
     register, compare it against zero, then branch based upon the
     result.  This option is only meaningful on architectures that
     support such instructions, which include x86, PowerPC, IA-64 and
     S/390.

     The default is `-fbranch-count-reg', enabled when
     `-fstrength-reduce' is enabled.

`-fno-function-cse'
     Do not put function addresses in registers; make each instruction
     that calls a constant function contain the function's address
     explicitly.

     This option results in less efficient code, but some strange hacks
     that alter the assembler output may be confused by the
     optimizations performed when this option is not used.

     The default is `-ffunction-cse'

`-fno-zero-initialized-in-bss'
     If the target supports a BSS section, GCC by default puts
     variables that are initialized to zero into BSS.  This can save
     space in the resulting code.

     This option turns off this behavior because some programs
     explicitly rely on variables going to the data section.  E.g., so
     that the resulting executable can find the beginning of that
     section and/or make assumptions based on that.

     The default is `-fzero-initialized-in-bss'.

`-fstrength-reduce'
     Perform the optimizations of loop strength reduction and
     elimination of iteration variables.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fthread-jumps'
     Perform optimizations where we check to see if a jump branches to a
     location where another comparison subsumed by the first is found.
     If so, the first branch is redirected to either the destination of
     the second branch or a point immediately following it, depending
     on whether the condition is known to be true or false.

     Enabled at levels `-O', `-O2', `-O3', `-Os'.

`-fcse-follow-jumps'
     In common subexpression elimination, scan through jump instructions
     when the target of the jump is not reached by any other path.  For
     example, when CSE encounters an `if' statement with an `else'
     clause, CSE will follow the jump when the condition tested is
     false.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fcse-skip-blocks'
     This is similar to `-fcse-follow-jumps', but causes CSE to follow
     jumps which conditionally skip over blocks.  When CSE encounters a
     simple `if' statement with no else clause, `-fcse-skip-blocks'
     causes CSE to follow the jump around the body of the `if'.

     Enabled at levels `-O2', `-O3', `-Os'.

`-frerun-cse-after-loop'
     Re-run common subexpression elimination after loop optimizations
     has been performed.

     Enabled at levels `-O2', `-O3', `-Os'.

`-frerun-loop-opt'
     Run the loop optimizer twice.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fgcse'
     Perform a global common subexpression elimination pass.  This pass
     also performs global constant and copy propagation.

     _Note:_ When compiling a program using computed gotos, a GCC
     extension, you may get better runtime performance if you disable
     the global common subexpression elimination pass by adding
     `-fno-gcse' to the command line.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fgcse-lm'
     When `-fgcse-lm' is enabled, global common subexpression
     elimination will attempt to move loads which are only killed by
     stores into themselves.  This allows a loop containing a
     load/store sequence to be changed to a load outside the loop, and
     a copy/store within the loop.

     Enabled by default when gcse is enabled.

`-fgcse-sm'
     When `-fgcse-sm' is enabled, a store motion pass is run after
     global common subexpression elimination.  This pass will attempt
     to move stores out of loops.  When used in conjunction with
     `-fgcse-lm', loops containing a load/store sequence can be changed
     to a load before the loop and a store after the loop.

     Enabled by default when gcse is enabled.

`-fgcse-las'
     When `-fgcse-las' is enabled, the global common subexpression
     elimination pass eliminates redundant loads that come after stores
     to the same memory location (both partial and full redundancies).

     Enabled by default when gcse is enabled.

`-floop-optimize'
     Perform loop optimizations: move constant expressions out of
     loops, simplify exit test conditions and optionally do
     strength-reduction and loop unrolling as well.

     Enabled at levels `-O', `-O2', `-O3', `-Os'.

`-fcrossjumping'
     Perform cross-jumping transformation. This transformation unifies
     equivalent code and save code size. The resulting code may or may
     not perform better than without cross-jumping.

     Enabled at levels `-O', `-O2', `-O3', `-Os'.

`-fif-conversion'
     Attempt to transform conditional jumps into branch-less
     equivalents.  This include use of conditional moves, min, max, set
     flags and abs instructions, and some tricks doable by standard
     arithmetics.  The use of conditional execution on chips where it
     is available is controlled by `if-conversion2'.

     Enabled at levels `-O', `-O2', `-O3', `-Os'.

`-fif-conversion2'
     Use conditional execution (where available) to transform
     conditional jumps into branch-less equivalents.

     Enabled at levels `-O', `-O2', `-O3', `-Os'.

`-fdelete-null-pointer-checks'
     Use global dataflow analysis to identify and eliminate useless
     checks for null pointers.  The compiler assumes that dereferencing
     a null pointer would have halted the program.  If a pointer is
     checked after it has already been dereferenced, it cannot be null.

     In some environments, this assumption is not true, and programs can
     safely dereference null pointers.  Use
     `-fno-delete-null-pointer-checks' to disable this optimization for
     programs which depend on that behavior.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fexpensive-optimizations'
     Perform a number of minor optimizations that are relatively
     expensive.

     Enabled at levels `-O2', `-O3', `-Os'.

`-foptimize-register-move'
`-fregmove'
     Attempt to reassign register numbers in move instructions and as
     operands of other simple instructions in order to maximize the
     amount of register tying.  This is especially helpful on machines
     with two-operand instructions.

     Note `-fregmove' and `-foptimize-register-move' are the same
     optimization.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fdelayed-branch'
     If supported for the target machine, attempt to reorder
     instructions to exploit instruction slots available after delayed
     branch instructions.

     Enabled at levels `-O', `-O2', `-O3', `-Os'.

`-fschedule-insns'
     If supported for the target machine, attempt to reorder
     instructions to eliminate execution stalls due to required data
     being unavailable.  This helps machines that have slow floating
     point or memory load instructions by allowing other instructions
     to be issued until the result of the load or floating point
     instruction is required.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fschedule-insns2'
     Similar to `-fschedule-insns', but requests an additional pass of
     instruction scheduling after register allocation has been done.
     This is especially useful on machines with a relatively small
     number of registers and where memory load instructions take more
     than one cycle.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fno-sched-interblock'
     Don't schedule instructions across basic blocks.  This is normally
     enabled by default when scheduling before register allocation, i.e.
     with `-fschedule-insns' or at `-O2' or higher.

`-fno-sched-spec'
     Don't allow speculative motion of non-load instructions.  This is
     normally enabled by default when scheduling before register
     allocation, i.e.  with `-fschedule-insns' or at `-O2' or higher.

`-fsched-spec-load'
     Allow speculative motion of some load instructions.  This only
     makes sense when scheduling before register allocation, i.e. with
     `-fschedule-insns' or at `-O2' or higher.

`-fsched-spec-load-dangerous'
     Allow speculative motion of more load instructions.  This only
     makes sense when scheduling before register allocation, i.e. with
     `-fschedule-insns' or at `-O2' or higher.

`-fsched-stalled-insns=N'
     Define how many insns (if any) can be moved prematurely from the
     queue of stalled insns into the ready list, during the second
     scheduling pass.

`-fsched-stalled-insns-dep=N'
     Define how many insn groups (cycles) will be examined for a
     dependency on a stalled insn that is candidate for premature
     removal from the queue of stalled insns.  Has an effect only
     during the second scheduling pass, and only if
     `-fsched-stalled-insns' is used and its value is not zero.

`-fsched2-use-superblocks'
     When scheduling after register allocation, do use superblock
     scheduling algorithm.  Superblock scheduling allows motion across
     basic block boundaries resulting on faster schedules.  This option
     is experimental, as not all machine descriptions used by GCC model
     the CPU closely enough to avoid unreliable results from the
     algorithm.

     This only makes sense when scheduling after register allocation,
     i.e. with `-fschedule-insns2' or at `-O2' or higher.

`-fsched2-use-traces'
     Use `-fsched2-use-superblocks' algorithm when scheduling after
     register allocation and additionally perform code duplication in
     order to increase the size of superblocks using tracer pass.  See
     `-ftracer' for details on trace formation.

     This mode should produce faster but significantly longer programs.
     Also without `-fbranch-probabilities' the traces constructed may
     not match the reality and hurt the performance.  This only makes
     sense when scheduling after register allocation, i.e. with
     `-fschedule-insns2' or at `-O2' or higher.

`-fcaller-saves'
     Enable values to be allocated in registers that will be clobbered
     by function calls, by emitting extra instructions to save and
     restore the registers around such calls.  Such allocation is done
     only when it seems to result in better code than would otherwise
     be produced.

     This option is always enabled by default on certain machines,
     usually those which have no call-preserved registers to use
     instead.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fmove-all-movables'
     Forces all invariant computations in loops to be moved outside the
     loop.

`-freduce-all-givs'
     Forces all general-induction variables in loops to be
     strength-reduced.

     _Note:_ When compiling programs written in Fortran,
     `-fmove-all-movables' and `-freduce-all-givs' are enabled by
     default when you use the optimizer.

     These options may generate better or worse code; results are highly
     dependent on the structure of loops within the source code.

     These two options are intended to be removed someday, once they
     have helped determine the efficacy of various approaches to
     improving loop optimizations.

     Please contact <gcc AT gcc.org>, and describe how use of these
     options affects the performance of your production code.  Examples
     of code that runs _slower_ when these options are _enabled_ are
     very valuable.

`-fno-peephole'
`-fno-peephole2'
     Disable any machine-specific peephole optimizations.  The
     difference between `-fno-peephole' and `-fno-peephole2' is in how
     they are implemented in the compiler; some targets use one, some
     use the other, a few use both.

     `-fpeephole' is enabled by default.  `-fpeephole2' enabled at
     levels `-O2', `-O3', `-Os'.

`-fno-guess-branch-probability'
     Do not guess branch probabilities using a randomized model.

     Sometimes GCC will opt to use a randomized model to guess branch
     probabilities, when none are available from either profiling
     feedback (`-fprofile-arcs') or `__builtin_expect'.  This means that
     different runs of the compiler on the same program may produce
     different object code.

     In a hard real-time system, people don't want different runs of the
     compiler to produce code that has different behavior; minimizing
     non-determinism is of paramount import.  This switch allows users
     to reduce non-determinism, possibly at the expense of inferior
     optimization.

     The default is `-fguess-branch-probability' at levels `-O', `-O2',
     `-O3', `-Os'.

`-freorder-blocks'
     Reorder basic blocks in the compiled function in order to reduce
     number of taken branches and improve code locality.

     Enabled at levels `-O2', `-O3'.

`-freorder-functions'
     Reorder basic blocks in the compiled function in order to reduce
     number of taken branches and improve code locality. This is
     implemented by using special subsections `.text.hot' for most
     frequently executed functions and `.text.unlikely' for unlikely
     executed functions.  Reordering is done by the linker so object
     file format must support named sections and linker must place them
     in a reasonable way.

     Also profile feedback must be available in to make this option
     effective.  See `-fprofile-arcs' for details.

     Enabled at levels `-O2', `-O3', `-Os'.

`-fstrict-aliasing'
     Allows the compiler to assume the strictest aliasing rules
     applicable to the language being compiled.  For C (and C++), this
     activates optimizations based on the type of expressions.  In
     particular, an object of one type is assumed never to reside at
     the same address as an object of a different type, unless the
     types are almost the same.  For example, an `unsigned int' can
     alias an `int', but not a `void*' or a `double'.  A character type
     may alias any other type.

     Pay special attention to code like this:
          union a_union {
            int i;
            double d;
          };

          int f() {
            a_union t;
            t.d = 3.0;
            return t.i;
          }
     The practice of reading from a different union member than the one
     most recently written to (called "type-punning") is common.  Even
     with `-fstrict-aliasing', type-punning is allowed, provided the
     memory is accessed through the union type.  So, the code above
     will work as expected.  However, this code might not:
          int f() {
            a_union t;
            int* ip;
            t.d = 3.0;
            ip = &t.i;
            return *ip;
          }

     Every language that wishes to perform language-specific alias
     analysis should define a function that computes, given an `tree'
     node, an alias set for the node.  Nodes in different alias sets
     are not allowed to alias.  For an example, see the C front-end
     function `c_get_alias_set'.

     Enabled at levels `-O2', `-O3', `-Os'.

`-falign-functions'
`-falign-functions=N'
     Align the start of functions to the next power-of-two greater than
     N, skipping up to N bytes.  For instance, `-falign-functions=32'
     aligns functions to the next 32-byte boundary, but
     `-falign-functions=24' would align to the next 32-byte boundary
     only if this can be done by skipping 23 bytes or less.

     `-fno-align-functions' and `-falign-functions=1' are equivalent
     and mean that functions will not be aligned.

     Some assemblers only support this flag when N is a power of two;
     in that case, it is rounded up.

     If N is not specified or is zero, use a machine-dependent default.

     Enabled at levels `-O2', `-O3'.

`-falign-labels'
`-falign-labels=N'
     Align all branch targets to a power-of-two boundary, skipping up to
     N bytes like `-falign-functions'.  This option can easily make
     code slower, because it must insert dummy operations for when the
     branch target is reached in the usual flow of the code.

     `-fno-align-labels' and `-falign-labels=1' are equivalent and mean
     that labels will not be aligned.

     If `-falign-loops' or `-falign-jumps' are applicable and are
     greater than this value, then their values are used instead.

     If N is not specified or is zero, use a machine-dependent default
     which is very likely to be `1', meaning no alignment.

     Enabled at levels `-O2', `-O3'.

`-falign-loops'
`-falign-loops=N'
     Align loops to a power-of-two boundary, skipping up to N bytes
     like `-falign-functions'.  The hope is that the loop will be
     executed many times, which will make up for any execution of the
     dummy operations.

     `-fno-align-loops' and `-falign-loops=1' are equivalent and mean
     that loops will not be aligned.

     If N is not specified or is zero, use a machine-dependent default.

     Enabled at levels `-O2', `-O3'.

`-falign-jumps'
`-falign-jumps=N'
     Align branch targets to a power-of-two boundary, for branch targets
     where the targets can only be reached by jumping, skipping up to N
     bytes like `-falign-functions'.  In this case, no dummy operations
     need be executed.

     `-fno-align-jumps' and `-falign-jumps=1' are equivalent and mean
     that loops will not be aligned.

     If N is not specified or is zero, use a machine-dependent default.

     Enabled at levels `-O2', `-O3'.

`-frename-registers'
     Attempt to avoid false dependencies in scheduled code by making use
     of registers left over after register allocation.  This
     optimization will most benefit processors with lots of registers.
     It can, however, make debugging impossible, since variables will
     no longer stay in a "home register".

`-fweb'
     Constructs webs as commonly used for register allocation purposes
     and assign each web individual pseudo register.  This allows the
     register allocation pass to operate on pseudos directly, but also
     strengthens several other optimization passes, such as CSE, loop
     optimizer and trivial dead code remover.  It can, however, make
     debugging impossible, since variables will no longer stay in a
     "home register".

     Enabled at levels `-O3'.

`-fno-cprop-registers'
     After register allocation and post-register allocation instruction
     splitting, we perform a copy-propagation pass to try to reduce
     scheduling dependencies and occasionally eliminate the copy.

     Disabled at levels `-O', `-O2', `-O3', `-Os'.

`-fprofile-generate'
     Enable options usually used for instrumenting application to
     produce profile useful for later recompilation with profile
     feedback based optimization.  You must use `-fprofile-generate'
     both when compiling and when linking your program.

     The following options are enabled: `-fprofile-arcs',
     `-fprofile-values', `-fvpt'.

`-fprofile-use'
     Enable profile feedback directed optimizations, and optimizations
     generally profitable only with profile feedback available.

     The following options are enabled: `-fbranch-probabilities',
     `-fvpt', `-funroll-loops', `-fpeel-loops', `-ftracer'.


 The following options control compiler behavior regarding floating
point arithmetic.  These options trade off between speed and
correctness.  All must be specifically enabled.

`-ffloat-store'
     Do not store floating point variables in registers, and inhibit
     other options that might change whether a floating point value is
     taken from a register or memory.

     This option prevents undesirable excess precision on machines such
     as the 68000 where the floating registers (of the 68881) keep more
     precision than a `double' is supposed to have.  Similarly for the
     x86 architecture.  For most programs, the excess precision does
     only good, but a few programs rely on the precise definition of
     IEEE floating point.  Use `-ffloat-store' for such programs, after
     modifying them to store all pertinent intermediate computations
     into variables.

`-ffast-math'
     Sets `-fno-math-errno', `-funsafe-math-optimizations',
     `-fno-trapping-math', `-ffinite-math-only', `-fno-rounding-math'
     and `-fno-signaling-nans'.

     This option causes the preprocessor macro `__FAST_MATH__' to be
     defined.

     This option should never be turned on by any `-O' option since it
     can result in incorrect output for programs which depend on an
     exact implementation of IEEE or ISO rules/specifications for math
     functions.

`-fno-math-errno'
     Do not set ERRNO after calling math functions that are executed
     with a single instruction, e.g., sqrt.  A program that relies on
     IEEE exceptions for math error handling may want to use this flag
     for speed while maintaining IEEE arithmetic compatibility.

     This option should never be turned on by any `-O' option since it
     can result in incorrect output for programs which depend on an
     exact implementation of IEEE or ISO rules/specifications for math
     functions.

     The default is `-fmath-errno'.

`-funsafe-math-optimizations'
     Allow optimizations for floating-point arithmetic that (a) assume
     that arguments and results are valid and (b) may violate IEEE or
     ANSI standards.  When used at link-time, it may include libraries
     or startup files that change the default FPU control word or other
     similar optimizations.

     This option should never be turned on by any `-O' option since it
     can result in incorrect output for programs which depend on an
     exact implementation of IEEE or ISO rules/specifications for math
     functions.

     The default is `-fno-unsafe-math-optimizations'.

`-ffinite-math-only'
     Allow optimizations for floating-point arithmetic that assume that
     arguments and results are not NaNs or +-Infs.

     This option should never be turned on by any `-O' option since it
     can result in incorrect output for programs which depend on an
     exact implementation of IEEE or ISO rules/specifications.

     The default is `-fno-finite-math-only'.

`-fno-trapping-math'
     Compile code assuming that floating-point operations cannot
     generate user-visible traps.  These traps include division by
     zero, overflow, underflow, inexact result and invalid operation.
     This option implies `-fno-signaling-nans'.  Setting this option
     may allow faster code if one relies on "non-stop" IEEE arithmetic,
     for example.

     This option should never be turned on by any `-O' option since it
     can result in incorrect output for programs which depend on an
     exact implementation of IEEE or ISO rules/specifications for math
     functions.

     The default is `-ftrapping-math'.

`-frounding-math'
     Disable transformations and optimizations that assume default
     floating point rounding behavior.  This is round-to-zero for all
     floating point to integer conversions, and round-to-nearest for
     all other arithmetic truncations.  This option should be specified
     for programs that change the FP rounding mode dynamically, or that
     may be executed with a non-default rounding mode.  This option
     disables constant folding of floating point expressions at
     compile-time (which may be affected by rounding mode) and
     arithmetic transformations that are unsafe in the presence of
     sign-dependent rounding modes.

     The default is `-fno-rounding-math'.

     This option is experimental and does not currently guarantee to
     disable all GCC optimizations that are affected by rounding mode.
     Future versions of GCC may provide finer control of this setting
     using C99's `FENV_ACCESS' pragma.  This command line option will
     be used to specify the default state for `FENV_ACCESS'.

`-fsignaling-nans'
     Compile code assuming that IEEE signaling NaNs may generate
     user-visible traps during floating-point operations.  Setting this
     option disables optimizations that may change the number of
     exceptions visible with signaling NaNs.  This option implies
     `-ftrapping-math'.

     This option causes the preprocessor macro `__SUPPORT_SNAN__' to be
     defined.

     The default is `-fno-signaling-nans'.

     This option is experimental and does not currently guarantee to
     disable all GCC optimizations that affect signaling NaN behavior.

`-fsingle-precision-constant'
     Treat floating point constant as single precision constant instead
     of implicitly converting it to double precision constant.


 The following options control optimizations that may improve
performance, but are not enabled by any `-O' options.  This section
includes experimental options that may produce broken code.

`-fbranch-probabilities'
     After running a program compiled with `-fprofile-arcs' (*note
     Options for Debugging Your Program or `gcc': Debugging Options.),
     you can compile it a second time using `-fbranch-probabilities',
     to improve optimizations based on the number of times each branch
     was taken.  When the program compiled with `-fprofile-arcs' exits
     it saves arc execution counts to a file called `SOURCENAME.gcda'
     for each source file  The information in this data file is very
     dependent on the structure of the generated code, so you must use
     the same source code and the same optimization options for both
     compilations.

     With `-fbranch-probabilities', GCC puts a `REG_BR_PROB' note on
     each `JUMP_INSN' and `CALL_INSN'.  These can be used to improve
     optimization.  Currently, they are only used in one place: in
     `reorg.c', instead of guessing which path a branch is mostly to
     take, the `REG_BR_PROB' values are used to exactly determine which
     path is taken more often.

`-fprofile-values'
     If combined with `-fprofile-arcs', it adds code so that some data
     about values of expressions in the program is gathered.

     With `-fbranch-probabilities', it reads back the data gathered
     from profiling values of expressions and adds `REG_VALUE_PROFILE'
     notes to instructions for their later usage in optimizations.

`-fvpt'
     If combined with `-fprofile-arcs', it instructs the compiler to add
     a code to gather information about values of expressions.

     With `-fbranch-probabilities', it reads back the data gathered and
     actually performs the optimizations based on them.  Currently the
     optimizations include specialization of division operation using
     the knowledge about the value of the denominator.

`-fnew-ra'
     Use a graph coloring register allocator.  Currently this option is
     meant for testing, so we are interested to hear about
     miscompilations with `-fnew-ra'.

`-ftracer'
     Perform tail duplication to enlarge superblock size. This
     transformation simplifies the control flow of the function
     allowing other optimizations to do better job.

`-funit-at-a-time'
     Parse the whole compilation unit before starting to produce code.
     This allows some extra optimizations to take place but consumes
     more memory.

`-funroll-loops'
     Unroll loops whose number of iterations can be determined at
     compile time or upon entry to the loop.  `-funroll-loops' implies
     `-frerun-cse-after-loop'.  It also turns on complete loop peeling
     (i.e. complete removal of loops with small constant number of
     iterations).  This option makes code larger, and may or may not
     make it run faster.

`-funroll-all-loops'
     Unroll all loops, even if their number of iterations is uncertain
     when the loop is entered.  This usually makes programs run more
     slowly.  `-funroll-all-loops' implies the same options as
     `-funroll-loops'.

`-fpeel-loops'
     Peels the loops for that there is enough information that they do
     not roll much (from profile feedback).  It also turns on complete
     loop peeling (i.e. complete removal of loops with small constant
     number of iterations).

`-funswitch-loops'
     Move branches with loop invariant conditions out of the loop, with
     duplicates of the loop on both branches (modified according to
     result of the condition).

`-fold-unroll-loops'
     Unroll loops whose number of iterations can be determined at
     compile time or upon entry to the loop, using the old loop
     unroller whose loop recognition is based on notes from frontend.
     `-fold-unroll-loops' implies both `-fstrength-reduce' and
     `-frerun-cse-after-loop'.  This option makes code larger, and may
     or may not make it run faster.

`-fold-unroll-all-loops'
     Unroll all loops, even if their number of iterations is uncertain
     when the loop is entered. This is done using the old loop unroller
     whose loop recognition is based on notes from frontend.  This
     usually makes programs run more slowly.  `-fold-unroll-all-loops'
     implies the same options as `-fold-unroll-loops'.

`-funswitch-loops'
     Move branches with loop invariant conditions out of the loop, with
     duplicates of the loop on both branches (modified according to
     result of the condition).

`-funswitch-loops'
     Move branches with loop invariant conditions out of the loop, with
     duplicates of the loop on both branches (modified according to
     result of the condition).

`-fprefetch-loop-arrays'
     If supported by the target machine, generate instructions to
     prefetch memory to improve the performance of loops that access
     large arrays.

     Disabled at level `-Os'.

`-ffunction-sections'
`-fdata-sections'
     Place each function or data item into its own section in the output
     file if the target supports arbitrary sections.  The name of the
     function or the name of the data item determines the section's name
     in the output file.

     Use these options on systems where the linker can perform
     optimizations to improve locality of reference in the instruction
     space.  Most systems using the ELF object format and SPARC
     processors running Solaris 2 have linkers with such optimizations.
     AIX may have these optimizations in the future.

     Only use these options when there are significant benefits from
     doing so.  When you specify these options, the assembler and
     linker will create larger object and executable files and will
     also be slower.  You will not be able to use `gprof' on all
     systems if you specify this option and you may have problems with
     debugging if you specify both this option and `-g'.

`-fbranch-target-load-optimize'
     Perform branch target register load optimization before prologue /
     epilogue threading.  The use of target registers can typically be
     exposed only during reload, thus hoisting loads out of loops and
     doing inter-block scheduling needs a separate optimization pass.

`-fbranch-target-load-optimize2'
     Perform branch target register load optimization after prologue /
     epilogue threading.

`--param NAME=VALUE'
     In some places, GCC uses various constants to control the amount of
     optimization that is done.  For example, GCC will not inline
     functions that contain more that a certain number of instructions.
     You can control some of these constants on the command-line using
     the `--param' option.

     The names of specific parameters, and the meaning of the values,
     are tied to the internals of the compiler, and are subject to
     change without notice in future releases.

     In each case, the VALUE is an integer.  The allowable choices for
     NAME are given in the following table:

    `max-crossjump-edges'
          The maximum number of incoming edges to consider for
          crossjumping.  The algorithm used by `-fcrossjumping' is
          O(N^2) in the number of edges incoming to each block.
          Increasing values mean more aggressive optimization, making
          the compile time increase with probably small improvement in
          executable size.

    `max-delay-slot-insn-search'
          The maximum number of instructions to consider when looking
          for an instruction to fill a delay slot.  If more than this
          arbitrary number of instructions is searched, the time
          savings from filling the delay slot will be minimal so stop
          searching.  Increasing values mean more aggressive
          optimization, making the compile time increase with probably
          small improvement in executable run time.

    `max-delay-slot-live-search'
          When trying to fill delay slots, the maximum number of
          instructions to consider when searching for a block with
          valid live register information.  Increasing this arbitrarily
          chosen value means more aggressive optimization, increasing
          the compile time.  This parameter should be removed when the
          delay slot code is rewritten to maintain the control-flow
          graph.

    `max-gcse-memory'
          The approximate maximum amount of memory that will be
          allocated in order to perform the global common subexpression
          elimination optimization.  If more memory than specified is
          required, the optimization will not be done.

    `max-gcse-passes'
          The maximum number of passes of GCSE to run.

    `max-pending-list-length'
          The maximum number of pending dependencies scheduling will
          allow before flushing the current state and starting over.
          Large functions with few branches or calls can create
          excessively large lists which needlessly consume memory and
          resources.

    `max-inline-insns-single'
          Several parameters control the tree inliner used in gcc.
          This number sets the maximum number of instructions (counted
          in GCC's internal representation) in a single function that
          the tree inliner will consider for inlining.  This only
          affects functions declared inline and methods implemented in
          a class declaration (C++).  The default value is 500.

    `max-inline-insns-auto'
          When you use `-finline-functions' (included in `-O3'), a lot
          of functions that would otherwise not be considered for
          inlining by the compiler will be investigated.  To those
          functions, a different (more restrictive) limit compared to
          functions declared inline can be applied.  The default value
          is 100.

    `large-function-insns'
          The limit specifying really large functions.  For functions
          greater than this limit inlining is constrained by `--param
          large-function-growth'.  This parameter is useful primarily
          to avoid extreme compilation time caused by non-linear
          algorithms used by the backend.  This parameter is ignored
          when `-funit-at-a-time' is not used.  The default value is
          3000.

    `large-function-growth'
          Specifies maximal growth of large function caused by inlining
          in percents.  This parameter is ignored when
          `-funit-at-a-time' is not used.  The default value is 200.

    `inline-unit-growth'
          Specifies maximal overall growth of the compilation unit
          caused by inlining.  This parameter is ignored when
          `-funit-at-a-time' is not used.  The default value is 150.

    `max-inline-insns-rtl'
          For languages that use the RTL inliner (this happens at a
          later stage than tree inlining), you can set the maximum
          allowable size (counted in RTL instructions) for the RTL
          inliner with this parameter.  The default value is 600.

    `max-unrolled-insns'
          The maximum number of instructions that a loop should have if
          that loop is unrolled, and if the loop is unrolled, it
          determines how many times the loop code is unrolled.

    `max-average-unrolled-insns'
          The maximum number of instructions biased by probabilities of
          their execution that a loop should have if that loop is
          unrolled, and if the loop is unrolled, it determines how many
          times the loop code is unrolled.

    `max-unroll-times'
          The maximum number of unrollings of a single loop.

    `max-peeled-insns'
          The maximum number of instructions that a loop should have if
          that loop is peeled, and if the loop is peeled, it determines
          how many times the loop code is peeled.

    `max-peel-times'
          The maximum number of peelings of a single loop.

    `max-completely-peeled-insns'
          The maximum number of insns of a completely peeled loop.

    `max-completely-peel-times'
          The maximum number of iterations of a loop to be suitable for
          complete peeling.

    `max-unswitch-insns'
          The maximum number of insns of an unswitched loop.

    `max-unswitch-level'
          The maximum number of branches unswitched in a single loop.

    `hot-bb-count-fraction'
          Select fraction of the maximal count of repetitions of basic
          block in program given basic block needs to have to be
          considered hot.

    `hot-bb-frequency-fraction'
          Select fraction of the maximal frequency of executions of
          basic block in function given basic block needs to have to be
          considered hot

    `tracer-dynamic-coverage'
    `tracer-dynamic-coverage-feedback'
          This value is used to limit superblock formation once the
          given percentage of executed instructions is covered.  This
          limits unnecessary code size expansion.

          The `tracer-dynamic-coverage-feedback' is used only when
          profile feedback is available.  The real profiles (as opposed
          to statically estimated ones) are much less balanced allowing
          the threshold to be larger value.

    `tracer-max-code-growth'
          Stop tail duplication once code growth has reached given
          percentage.  This is rather hokey argument, as most of the
          duplicates will be eliminated later in cross jumping, so it
          may be set to much higher values than is the desired code
          growth.

    `tracer-min-branch-ratio'
          Stop reverse growth when the reverse probability of best edge
          is less than this threshold (in percent).

    `tracer-min-branch-ratio'
    `tracer-min-branch-ratio-feedback'
          Stop forward growth if the best edge do have probability
          lower than this threshold.

          Similarly to `tracer-dynamic-coverage' two values are
          present, one for compilation for profile feedback and one for
          compilation without.  The value for compilation with profile
          feedback needs to be more conservative (higher) in order to
          make tracer effective.

    `max-cse-path-length'
          Maximum number of basic blocks on path that cse considers.

    `max-last-value-rtl'
          The maximum size measured as number of RTLs that can be
          recorded in an expression in combiner for a pseudo register
          as last known value of that register.  The default is 10000.

    `ggc-min-expand'
          GCC uses a garbage collector to manage its own memory
          allocation.  This parameter specifies the minimum percentage
          by which the garbage collector's heap should be allowed to
          expand between collections.  Tuning this may improve
          compilation speed; it has no effect on code generation.

          The default is 30% + 70% * (RAM/1GB) with an upper bound of
          100% when RAM >= 1GB.  If `getrlimit' is available, the
          notion of "RAM" is the smallest of actual RAM, RLIMIT_RSS,
          RLIMIT_DATA and RLIMIT_AS.  If GCC is not able to calculate
          RAM on a particular platform, the lower bound of 30% is used.
          Setting this parameter and `ggc-min-heapsize' to zero causes
          a full collection to occur at every opportunity.  This is
          extremely slow, but can be useful for debugging.

    `ggc-min-heapsize'
          Minimum size of the garbage collector's heap before it begins
          bothering to collect garbage.  The first collection occurs
          after the heap expands by `ggc-min-expand'% beyond
          `ggc-min-heapsize'.  Again, tuning this may improve
          compilation speed, and has no effect on code generation.

          The default is RAM/8, with a lower bound of 4096 (four
          megabytes) and an upper bound of 131072 (128 megabytes).  If
          `getrlimit' is available, the notion of "RAM" is the smallest
          of actual RAM, RLIMIT_RSS, RLIMIT_DATA and RLIMIT_AS.  If GCC
          is not able to calculate RAM on a particular platform, the
          lower bound is used.  Setting this parameter very large
          effectively disables garbage collection.  Setting this
          parameter and `ggc-min-expand' to zero causes a full
          collection to occur at every opportunity.

    `max-reload-search-insns'
          The maximum number of instruction reload should look backward
          for equivalent register.  Increasing values mean more
          aggressive optimization, making the compile time increase
          with probably slightly better performance.  The default value
          is 100.

    `max-cselib-memory-location'
          The maximum number of memory locations cselib should take
          into acount.  Increasing values mean more aggressive
          optimization, making the compile time increase with probably
          slightly better performance.  The default value is 500.

    `min-pretend-dynamic-size'
          Force any automatic object whose size in bytes is equal to or
          greater than the specified value to be allocated dynamically,
          as if their size wasn't known to compile time.  This enables
          their storage to be released at the end of the block
          containing them, reducing total stack usage if multiple
          functions with heavy stack use are inlined into a single
          function.  It won't have any effect on objects that are
          suitable for allocation to registers (i.e., that are
          sufficiently small and that don't have their address taken),
          nor on objects allocated in the outermost block of a
          function.  The default, zero, causes objects whose sizes are
          known at compile time to have storage allocated at function
          entry.

    `reorder-blocks-duplicate'
    `reorder-blocks-duplicate-feedback'
          Used by basic block reordering pass to decide whether to use
          unconditional branch or duplicate the code on its
          destination.  Code is duplicated when its estimated size is
          smaller than this value multiplied by the estimated size of
          unconditional jump in the hot spots of the program.

          The `reorder-block-duplicate-feedback' is used only when
          profile feedback is available and may be set to higher values
          than `reorder-block-duplicate' since information about the
          hot spots is more accurate.

File: gcc.info,  Node: Preprocessor Options,  Next: Assembler Options,  Prev: Optimize Options,  Up: Invoking GCC

3.11 Options Controlling the Preprocessor
=========================================

These options control the C preprocessor, which is run on each C source
file before actual compilation.

 If you use the `-E' option, nothing is done except preprocessing.
Some of these options make sense only together with `-E' because they
cause the preprocessor output to be unsuitable for actual compilation.

     You can use `-Wp,OPTION' to bypass the compiler driver and pass
     OPTION directly through to the preprocessor.  If OPTION contains
     commas, it is split into multiple options at the commas.  However,
     many options are modified, translated or interpreted by the
     compiler driver before being passed to the preprocessor, and `-Wp'
     forcibly bypasses this phase.  The preprocessor's direct interface
     is undocumented and subject to change, so whenever possible you
     should avoid using `-Wp' and let the driver handle the options
     instead.

`-Xpreprocessor OPTION'
     Pass OPTION as an option to the preprocessor.  You can use this to
     supply system-specific preprocessor options which GCC does not
     know how to recognize.

     If you want to pass an option that takes an argument, you must use
     `-Xpreprocessor' twice, once for the option and once for the
     argument.

`-D NAME'
     Predefine NAME as a macro, with definition `1'.

`-D NAME=DEFINITION'
     Predefine NAME as a macro, with definition DEFINITION.  The
     contents of DEFINITION are tokenized and processed as if they
     appeared during translation phase three in a `#define' directive.
     In particular, the definition will be truncated by embedded
     newline characters.

     If you are invoking the preprocessor from a shell or shell-like
     program you may need to use the shell's quoting syntax to protect
     characters such as spaces that have a meaning in the shell syntax.

     If you wish to define a function-like macro on the command line,
     write its argument list with surrounding parentheses before the
     equals sign (if any).  Parentheses are meaningful to most shells,
     so you will need to quote the option.  With `sh' and `csh',
     `-D'NAME(ARGS...)=DEFINITION'' works.

     `-D' and `-U' options are processed in the order they are given on
     the command line.  All `-imacros FILE' and `-include FILE' options
     are processed after all `-D' and `-U' options.

`-U NAME'
     Cancel any previous definition of NAME, either built in or
     provided with a `-D' option.

`-undef'
     Do not predefine any system-specific or GCC-specific macros.  The
     standard predefined macros remain defined.

`-I DIR'
     Add the directory DIR to the list of directories to be searched
     for header files.  Directories named by `-I' are searched before
     the standard system include directories.  If the directory DIR is
     a standard system include directory, the option is ignored to
     ensure that the default search order for system directories and
     the special treatment of system headers are not defeated .

`-o FILE'
     Write output to FILE.  This is the same as specifying FILE as the
     second non-option argument to `cpp'.  `gcc' has a different
     interpretation of a second non-option argument, so you must use
     `-o' to specify the output file.

`-Wall'
     Turns on all optional warnings which are desirable for normal code.
     At present this is `-Wcomment', `-Wtrigraphs', `-Wmultichar' and a
     warning about integer promotion causing a change of sign in `#if'
     expressions.  Note that many of the preprocessor's warnings are on
     by default and have no options to control them.

`-Wcomment'
`-Wcomments'
     Warn whenever a comment-start sequence `/*' appears in a `/*'
     comment, or whenever a backslash-newline appears in a `//' comment.
     (Both forms have the same effect.)

`-Wtrigraphs'
     Most trigraphs in comments cannot affect the meaning of the
     program.  However, a trigraph that would form an escaped newline
     (`??/' at the end of a line) can, by changing where the comment
     begins or ends.  Therefore, only trigraphs that would form escaped
     newlines produce warnings inside a comment.

     This option is implied by `-Wall'.  If `-Wall' is not given, this
     option is still enabled unless trigraphs are enabled.  To get
     trigraph conversion without warnings, but get the other `-Wall'
     warnings, use `-trigraphs -Wall -Wno-trigraphs'.

`-Wtraditional'
     Warn about certain constructs that behave differently in
     traditional and ISO C.  Also warn about ISO C constructs that have
     no traditional C equivalent, and problematic constructs which
     should be avoided.

`-Wimport'
     Warn the first time `#import' is used.

`-Wundef'
     Warn whenever an identifier which is not a macro is encountered in
     an `#if' directive, outside of `defined'.  Such identifiers are
     replaced with zero.

`-Wunused-macros'
     Warn about macros defined in the main file that are unused.  A
     macro is "used" if it is expanded or tested for existence at least
     once.  The preprocessor will also warn if the macro has not been
     used at the time it is redefined or undefined.

     Built-in macros, macros defined on the command line, and macros
     defined in include files are not warned about.

     *Note:* If a macro is actually used, but only used in skipped
     conditional blocks, then CPP will report it as unused.  To avoid
     the warning in such a case, you might improve the scope of the
     macro's definition by, for example, moving it into the first
     skipped block.  Alternatively, you could provide a dummy use with
     something like:

          #if defined the_macro_causing_the_warning
          #endif

`-Wendif-labels'
     Warn whenever an `#else' or an `#endif' are followed by text.
     This usually happens in code of the form

          #if FOO
          ...
          #else FOO
          ...
          #endif FOO

     The second and third `FOO' should be in comments, but often are not
     in older programs.  This warning is on by default.

`-Werror'
     Make all warnings into hard errors.  Source code which triggers
     warnings will be rejected.

`-Wsystem-headers'
     Issue warnings for code in system headers.  These are normally
     unhelpful in finding bugs in your own code, therefore suppressed.
     If you are responsible for the system library, you may want to see
     them.

`-w'
     Suppress all warnings, including those which GNU CPP issues by
     default.

`-pedantic'
     Issue all the mandatory diagnostics listed in the C standard.
     Some of them are left out by default, since they trigger
     frequently on harmless code.

`-pedantic-errors'
     Issue all the mandatory diagnostics, and make all mandatory
     diagnostics into errors.  This includes mandatory diagnostics that
     GCC issues without `-pedantic' but treats as warnings.

`-M'
     Instead of outputting the result of preprocessing, output a rule
     suitable for `make' describing the dependencies of the main source
     file.  The preprocessor outputs one `make' rule containing the
     object file name for that source file, a colon, and the names of
     all the included files, including those coming from `-include' or
     `-imacros' command line options.

     Unless specified explicitly (with `-MT' or `-MQ'), the object file
     name consists of the basename of the source file with any suffix
     replaced with object file suffix.  If there are many included
     files then the rule is split into several lines using `\'-newline.
     The rule has no commands.

     This option does not suppress the preprocessor's debug output,
     such as `-dM'.  To avoid mixing such debug output with the
     dependency rules you should explicitly specify the dependency
     output file with `-MF', or use an environment variable like
     `DEPENDENCIES_OUTPUT' (*note Environment Variables::).  Debug
     output will still be sent to the regular output stream as normal.

     Passing `-M' to the driver implies `-E', and suppresses warnings
     with an implicit `-w'.

`-MM'
     Like `-M' but do not mention header files that are found in system
     header directories, nor header files that are included, directly
     or indirectly, from such a header.

     This implies that the choice of angle brackets or double quotes in
     an `#include' directive does not in itself determine whether that
     header will appear in `-MM' dependency output.  This is a slight
     change in semantics from GCC versions 3.0 and earlier.

`-MF FILE'
     When used with `-M' or `-MM', specifies a file to write the
     dependencies to.  If no `-MF' switch is given the preprocessor
     sends the rules to the same place it would have sent preprocessed
     output.

     When used with the driver options `-MD' or `-MMD', `-MF' overrides
     the default dependency output file.

`-MG'
     In conjunction with an option such as `-M' requesting dependency
     generation, `-MG' assumes missing header files are generated files
     and adds them to the dependency list without raising an error.
     The dependency filename is taken directly from the `#include'
     directive without prepending any path.  `-MG' also suppresses
     preprocessed output, as a missing header file renders this useless.

     This feature is used in automatic updating of makefiles.

`-MP'
     This option instructs CPP to add a phony target for each dependency
     other than the main file, causing each to depend on nothing.  These
     dummy rules work around errors `make' gives if you remove header
     files without updating the `Makefile' to match.

     This is typical output:

          test.o: test.c test.h

          test.h:

`-MT TARGET'
     Change the target of the rule emitted by dependency generation.  By
     default CPP takes the name of the main input file, including any
     path, deletes any file suffix such as `.c', and appends the
     platform's usual object suffix.  The result is the target.

     An `-MT' option will set the target to be exactly the string you
     specify.  If you want multiple targets, you can specify them as a
     single argument to `-MT', or use multiple `-MT' options.

     For example, `-MT '$(objpfx)foo.o'' might give

          $(objpfx)foo.o: foo.c

`-MQ TARGET'
     Same as `-MT', but it quotes any characters which are special to
     Make.  `-MQ '$(objpfx)foo.o'' gives

          $$(objpfx)foo.o: foo.c

     The default target is automatically quoted, as if it were given
     with `-MQ'.

`-MD'
     `-MD' is equivalent to `-M -MF FILE', except that `-E' is not
     implied.  The driver determines FILE based on whether an `-o'
     option is given.  If it is, the driver uses its argument but with
     a suffix of `.d', otherwise it take the basename of the input file
     and applies a `.d' suffix.

     If `-MD' is used in conjunction with `-E', any `-o' switch is
     understood to specify the dependency output file (but *note -MF:
     dashMF.), but if used without `-E', each `-o' is understood to
     specify a target object file.

     Since `-E' is not implied, `-MD' can be used to generate a
     dependency output file as a side-effect of the compilation process.

`-MMD'
     Like `-MD' except mention only user header files, not system
     -header files.

`-fpch-deps'
     When using precompiled headers (*note Precompiled Headers::), this
     flag will cause the dependency-output flags to also list the files
     from the precompiled header's dependencies.  If not specified only
     the precompiled header would be listed and not the files that were
     used to create it because those files are not consulted when a
     precompiled header is used.

`-x c'
`-x c++'
`-x objective-c'
`-x assembler-with-cpp'
     Specify the source language: C, C++, Objective-C, or assembly.
     This has nothing to do with standards conformance or extensions;
     it merely selects which base syntax to expect.  If you give none
     of these options, cpp will deduce the language from the extension
     of the source file: `.c', `.cc', `.m', or `.S'.  Some other common
     extensions for C++ and assembly are also recognized.  If cpp does
     not recognize the extension, it will treat the file as C; this is
     the most generic mode.

     *Note:* Previous versions of cpp accepted a `-lang' option which
     selected both the language and the standards conformance level.
     This option has been removed, because it conflicts with the `-l'
     option.

`-std=STANDARD'
`-ansi'
     Specify the standard to which the code should conform.  Currently
     CPP knows about C and C++ standards; others may be added in the
     future.

     STANDARD may be one of:
    `iso9899:1990'
    `c89'
          The ISO C standard from 1990.  `c89' is the customary
          shorthand for this version of the standard.

          The `-ansi' option is equivalent to `-std=c89'.

    `iso9899:199409'
          The 1990 C standard, as amended in 1994.

    `iso9899:1999'
    `c99'
    `iso9899:199x'
    `c9x'
          The revised ISO C standard, published in December 1999.
          Before publication, this was known as C9X.

    `gnu89'
          The 1990 C standard plus GNU extensions.  This is the default.

    `gnu99'
    `gnu9x'
          The 1999 C standard plus GNU extensions.

    `c++98'
          The 1998 ISO C++ standard plus amendments.

    `gnu++98'
          The same as `-std=c++98' plus GNU extensions.  This is the
          default for C++ code.

`-I-'
     Split the include path.  Any directories specified with `-I'
     options before `-I-' are searched only for headers requested with
     `#include "FILE"'; they are not searched for `#include <FILE>'.
     If additional directories are specified with `-I' options after
     the `-I-', those directories are searched for all `#include'
     directives.

     In addition, `-I-' inhibits the use of the directory of the current
     file directory as the first search directory for `#include "FILE"'.

`-nostdinc'
     Do not search the standard system directories for header files.
     Only the directories you have specified with `-I' options (and the
     directory of the current file, if appropriate) are searched.

`-nostdinc++'
     Do not search for header files in the C++-specific standard
     directories, but do still search the other standard directories.
     (This option is used when building the C++ library.)

`-include FILE'
     Process FILE as if `#include "file"' appeared as the first line of
     the primary source file.  However, the first directory searched
     for FILE is the preprocessor's working directory _instead of_ the
     directory containing the main source file.  If not found there, it
     is searched for in the remainder of the `#include "..."' search
     chain as normal.

     If multiple `-include' options are given, the files are included
     in the order they appear on the command line.

`-imacros FILE'
     Exactly like `-include', except that any output produced by
     scanning FILE is thrown away.  Macros it defines remain defined.
     This allows you to acquire all the macros from a header without
     also processing its declarations.

     All files specified by `-imacros' are processed before all files
     specified by `-include'.

`-idirafter DIR'
     Search DIR for header files, but do it _after_ all directories
     specified with `-I' and the standard system directories have been
     exhausted.  DIR is treated as a system include directory.

`-iprefix PREFIX'
     Specify PREFIX as the prefix for subsequent `-iwithprefix'
     options.  If the prefix represents a directory, you should include
     the final `/'.

`-iwithprefix DIR'
`-iwithprefixbefore DIR'
     Append DIR to the prefix specified previously with `-iprefix', and
     add the resulting directory to the include search path.
     `-iwithprefixbefore' puts it in the same place `-I' would;
     `-iwithprefix' puts it where `-idirafter' would.

`-isystem DIR'
     Search DIR for header files, after all directories specified by
     `-I' but before the standard system directories.  Mark it as a
     system directory, so that it gets the same special treatment as is
     applied to the standard system directories.

`-fdollars-in-identifiers'
     Accept `$' in identifiers.

`-fpreprocessed'
     Indicate to the preprocessor that the input file has already been
     preprocessed.  This suppresses things like macro expansion,
     trigraph conversion, escaped newline splicing, and processing of
     most directives.  The preprocessor still recognizes and removes
     comments, so that you can pass a file preprocessed with `-C' to
     the compiler without problems.  In this mode the integrated
     preprocessor is little more than a tokenizer for the front ends.

     `-fpreprocessed' is implicit if the input file has one of the
     extensions `.i', `.ii' or `.mi'.  These are the extensions that
     GCC uses for preprocessed files created by `-save-temps'.

`-ftabstop=WIDTH'
     Set the distance between tab stops.  This helps the preprocessor
     report correct column numbers in warnings or errors, even if tabs
     appear on the line.  If the value is less than 1 or greater than
     100, the option is ignored.  The default is 8.

`-fexec-charset=CHARSET'
     Set the execution character set, used for string and character
     constants.  The default is UTF-8.  CHARSET can be any encoding
     supported by the system's `iconv' library routine.

`-fwide-exec-charset=CHARSET'
     Set the wide execution character set, used for wide string and
     character constants.  The default is UTF-32 or UTF-16, whichever
     corresponds to the width of `wchar_t'.  As with
     `-ftarget-charset', CHARSET can be any encoding supported by the
     system's `iconv' library routine; however, you will have problems
     with encodings that do not fit exactly in `wchar_t'.

`-finput-charset=CHARSET'
     Set the input character set, used for translation from the
     character set of the input file to the source character set used
     by GCC. If the locale does not specify, or GCC cannot get this
     information from the locale, the default is UTF-8. This can be
     overridden by either the locale or this command line option.
     Currently the command line option takes precedence if there's a
     conflict. CHARSET can be any encoding supported by the system's
     `iconv' library routine.

`-fworking-directory'
     Enable generation of linemarkers in the preprocessor output that
     will let the compiler know the current working directory at the
     time of preprocessing.  When this option is enabled, the
     preprocessor will emit, after the initial linemarker, a second
     linemarker with the current working directory followed by two
     slashes.  GCC will use this directory, when it's present in the
     preprocessed input, as the directory emitted as the current
     working directory in some debugging information formats.  This
     option is implicitly enabled if debugging information is enabled,
     but this can be inhibited with the negated form
     `-fno-working-directory'.  If the `-P' flag is present in the
     command line, this option has no effect, since no `#line'
     directives are emitted whatsoever.

`-fno-show-column'
     Do not print column numbers in diagnostics.  This may be necessary
     if diagnostics are being scanned by a program that does not
     understand the column numbers, such as `dejagnu'.

`-A PREDICATE=ANSWER'
     Make an assertion with the predicate PREDICATE and answer ANSWER.
     This form is preferred to the older form `-A PREDICATE(ANSWER)',
     which is still supported, because it does not use shell special
     characters.

`-A -PREDICATE=ANSWER'
     Cancel an assertion with the predicate PREDICATE and answer ANSWER.

`-dCHARS'
     CHARS is a sequence of one or more of the following characters,
     and must not be preceded by a space.  Other characters are
     interpreted by the compiler proper, or reserved for future
     versions of GCC, and so are silently ignored.  If you specify
     characters whose behavior conflicts, the result is undefined.

    `M'
          Instead of the normal output, generate a list of `#define'
          directives for all the macros defined during the execution of
          the preprocessor, including predefined macros.  This gives
          you a way of finding out what is predefined in your version
          of the preprocessor.  Assuming you have no file `foo.h', the
          command

               touch foo.h; cpp -dM foo.h

          will show all the predefined macros.

    `D'
          Like `M' except in two respects: it does _not_ include the
          predefined macros, and it outputs _both_ the `#define'
          directives and the result of preprocessing.  Both kinds of
          output go to the standard output file.

    `N'
          Like `D', but emit only the macro names, not their expansions.

    `I'
          Output `#include' directives in addition to the result of
          preprocessing.

`-P'
     Inhibit generation of linemarkers in the output from the
     preprocessor.  This might be useful when running the preprocessor
     on something that is not C code, and will be sent to a program
     which might be confused by the linemarkers.

`-C'
     Do not discard comments.  All comments are passed through to the
     output file, except for comments in processed directives, which
     are deleted along with the directive.

     You should be prepared for side effects when using `-C'; it causes
     the preprocessor to treat comments as tokens in their own right.
     For example, comments appearing at the start of what would be a
     directive line have the effect of turning that line into an
     ordinary source line, since the first token on the line is no
     longer a `#'.

`-CC'
     Do not discard comments, including during macro expansion.  This is
     like `-C', except that comments contained within macros are also
     passed through to the output file where the macro is expanded.

     In addition to the side-effects of the `-C' option, the `-CC'
     option causes all C++-style comments inside a macro to be
     converted to C-style comments.  This is to prevent later use of
     that macro from inadvertently commenting out the remainder of the
     source line.

     The `-CC' option is generally used to support lint comments.

`-traditional-cpp'
     Try to imitate the behavior of old-fashioned C preprocessors, as
     opposed to ISO C preprocessors.

`-trigraphs'
     Process trigraph sequences.  These are three-character sequences,
     all starting with `??', that are defined by ISO C to stand for
     single characters.  For example, `??/' stands for `\', so `'??/n''
     is a character constant for a newline.  By default, GCC ignores
     trigraphs, but in standard-conforming modes it converts them.  See
     the `-std' and `-ansi' options.

     The nine trigraphs and their replacements are

          Trigraph:       ??(  ??)  ??<  ??>  ??=  ??/  ??'  ??!  ??-
          Replacement:      [    ]    {    }    #    \    ^    |    ~

`-remap'
     Enable special code to work around file systems which only permit
     very short file names, such as MS-DOS.

`--help'
`--target-help'
     Print text describing all the command line options instead of
     preprocessing anything.

`-v'
     Verbose mode.  Print out GNU CPP's version number at the beginning
     of execution, and report the final form of the include path.

`-H'
     Print the name of each header file used, in addition to other
     normal activities.  Each name is indented to show how deep in the
     `#include' stack it is.  Precompiled header files are also
     printed, even if they are found to be invalid; an invalid
     precompiled header file is printed with `...x' and a valid one
     with `...!' .

`-version'
`--version'
     Print out GNU CPP's version number.  With one dash, proceed to
     preprocess as normal.  With two dashes, exit immediately.

File: gcc.info,  Node: Assembler Options,  Next: Link Options,  Prev: Preprocessor Options,  Up: Invoking GCC

3.12 Passing Options to the Assembler
=====================================

You can pass options to the assembler.

`-Wa,OPTION'
     Pass OPTION as an option to the assembler.  If OPTION contains
     commas, it is split into multiple options at the commas.

`-Xassembler OPTION'
     Pass OPTION as an option to the assembler.  You can use this to
     supply system-specific assembler options which GCC does not know
     how to recognize.

     If you want to pass an option that takes an argument, you must use
     `-Xassembler' twice, once for the option and once for the argument.


File: gcc.info,  Node: Link Options,  Next: Directory Options,  Prev: Assembler Options,  Up: Invoking GCC

3.13 Options for Linking
========================

These options come into play when the compiler links object files into
an executable output file.  They are meaningless if the compiler is not
doing a link step.

`OBJECT-FILE-NAME'
     A file name that does not end in a special recognized suffix is
     considered to name an object file or library.  (Object files are
     distinguished from libraries by the linker according to the file
     contents.)  If linking is done, these object files are used as
     input to the linker.

`-c'
`-S'
`-E'
     If any of these options is used, then the linker is not run, and
     object file names should not be used as arguments.  *Note Overall
     Options::.

`-lLIBRARY'
`-l LIBRARY'
     Search the library named LIBRARY when linking.  (The second
     alternative with the library as a separate argument is only for
     POSIX compliance and is not recommended.)

     It makes a difference where in the command you write this option;
     the linker searches and processes libraries and object files in
     the order they are specified.  Thus, `foo.o -lz bar.o' searches
     library `z' after file `foo.o' but before `bar.o'.  If `bar.o'
     refers to functions in `z', those functions may not be loaded.

     The linker searches a standard list of directories for the library,
     which is actually a file named `libLIBRARY.a'.  The linker then
     uses this file as if it had been specified precisely by name.

     The directories searched include several standard system
     directories plus any that you specify with `-L'.

     Normally the files found this way are library files--archive files
     whose members are object files.  The linker handles an archive
     file by scanning through it for members which define symbols that
     have so far been referenced but not defined.  But if the file that
     is found is an ordinary object file, it is linked in the usual
     fashion.  The only difference between using an `-l' option and
     specifying a file name is that `-l' surrounds LIBRARY with `lib'
     and `.a' and searches several directories.

`-lobjc'
     You need this special case of the `-l' option in order to link an
     Objective-C program.

`-nostartfiles'
     Do not use the standard system startup files when linking.  The
     standard system libraries are used normally, unless `-nostdlib' or
     `-nodefaultlibs' is used.

`-nodefaultlibs'
     Do not use the standard system libraries when linking.  Only the
     libraries you specify will be passed to the linker.  The standard
     startup files are used normally, unless `-nostartfiles' is used.
     The compiler may generate calls to memcmp, memset, and memcpy for
     System V (and ISO C) environments or to bcopy and bzero for BSD
     environments.  These entries are usually resolved by entries in
     libc.  These entry points should be supplied through some other
     mechanism when this option is specified.

`-nostdlib'
     Do not use the standard system startup files or libraries when
     linking.  No startup files and only the libraries you specify will
     be passed to the linker.  The compiler may generate calls to
     memcmp, memset, and memcpy for System V (and ISO C) environments
     or to bcopy and bzero for BSD environments.  These entries are
     usually resolved by entries in libc.  These entry points should be
     supplied through some other mechanism when this option is
     specified.

     One of the standard libraries bypassed by `-nostdlib' and
     `-nodefaultlibs' is `libgcc.a', a library of internal subroutines
     that GCC uses to overcome shortcomings of particular machines, or
     special needs for some languages.  (*Note Interfacing to GCC
     Output: (gccint)Interface, for more discussion of `libgcc.a'.)  In
     most cases, you need `libgcc.a' even when you want to avoid other
     standard libraries.  In other words, when you specify `-nostdlib'
     or `-nodefaultlibs' you should usually specify `-lgcc' as well.
     This ensures that you have no unresolved references to internal GCC
     library subroutines.  (For example, `__main', used to ensure C++
     constructors will be called; *note `collect2': (gccint)Collect2.)

`-pie'
     Produce a position independent executable on targets which support
     it.  For predictable results, you must also specify the same set
     of options that were used to generate code (`-fpie', `-fPIE', or
     model suboptions) when you specify this option.

`-s'
     Remove all symbol table and relocation information from the
     executable.

`-static'
     On systems that support dynamic linking, this prevents linking
     with the shared libraries.  On other systems, this option has no
     effect.

`-shared'
     Produce a shared object which can then be linked with other
     objects to form an executable.  Not all systems support this
     option.  For predictable results, you must also specify the same
     set of options that were used to generate code (`-fpic', `-fPIC',
     or model suboptions) when you specify this option.(1)

`-shared-libgcc'
`-static-libgcc'
     On systems that provide `libgcc' as a shared library, these options
     force the use of either the shared or static version respectively.
     If no shared version of `libgcc' was built when the compiler was
     configured, these options have no effect.

     There are several situations in which an application should use the
     shared `libgcc' instead of the static version.  The most common of
     these is when the application wishes to throw and catch exceptions
     across different shared libraries.  In that case, each of the
     libraries as well as the application itself should use the shared
     `libgcc'.

     Therefore, the G++ and GCJ drivers automatically add
     `-shared-libgcc' whenever you build a shared library or a main
     executable, because C++ and Java programs typically use
     exceptions, so this is the right thing to do.

     If, instead, you use the GCC driver to create shared libraries,
     you may find that they will not always be linked with the shared
     `libgcc'.  If GCC finds, at its configuration time, that you have
     a non-GNU linker or a GNU linker that does not support option
     `--eh-frame-hdr', it will link the shared version of `libgcc' into
     shared libraries by default.  Otherwise, it will take advantage of
     the linker and optimize away the linking with the shared version
     of `libgcc', linking with the static version of libgcc by default.
     This allows exceptions to propagate through such shared
     libraries, without incurring relocation costs at library load time.

     However, if a library or main executable is supposed to throw or
     catch exceptions, you must link it using the G++ or GCJ driver, as
     appropriate for the languages used in the program, or using the
     option `-shared-libgcc', such that it is linked with the shared
     `libgcc'.

`-symbolic'
     Bind references to global symbols when building a shared object.
     Warn about any unresolved references (unless overridden by the
     link editor option `-Xlinker -z -Xlinker defs').  Only a few
     systems support this option.

`-Xlinker OPTION'
     Pass OPTION as an option to the linker.  You can use this to
     supply system-specific linker options which GCC does not know how
     to recognize.

     If you want to pass an option that takes an argument, you must use
     `-Xlinker' twice, once for the option and once for the argument.
     For example, to pass `-assert definitions', you must write
     `-Xlinker -assert -Xlinker definitions'.  It does not work to write
     `-Xlinker "-assert definitions"', because this passes the entire
     string as a single argument, which is not what the linker expects.

`-Wl,OPTION'
     Pass OPTION as an option to the linker.  If OPTION contains
     commas, it is split into multiple options at the commas.

`-u SYMBOL'
     Pretend the symbol SYMBOL is undefined, to force linking of
     library modules to define it.  You can use `-u' multiple times with
     different symbols to force loading of additional library modules.

 ---------- Footnotes ----------

 (1) On some systems, `gcc -shared' needs to build supplementary stub
code for constructors to work.  On multi-libbed systems, `gcc -shared'
must select the correct support libraries to link against.  Failing to
supply the correct flags may lead to subtle defects.  Supplying them in
cases where they are not necessary is innocuous.

File: gcc.info,  Node: Directory Options,  Next: Spec Files,  Prev: Link Options,  Up: Invoking GCC

3.14 Options for Directory Search
=================================

These options specify directories to search for header files, for
libraries and for parts of the compiler:

`-IDIR'
     Add the directory DIR to the head of the list of directories to be
     searched for header files.  This can be used to override a system
     header file, substituting your own version, since these
     directories are searched before the system header file
     directories.  However, you should not use this option to add
     directories that contain vendor-supplied system header files (use
     `-isystem' for that).  If you use more than one `-I' option, the
     directories are scanned in left-to-right order; the standard
     system directories come after.

     If a standard system include directory, or a directory specified
     with `-isystem', is also specified with `-I', the `-I' option will
     be ignored.  The directory will still be searched but as a system
     directory at its normal position in the system include chain.
     This is to ensure that GCC's procedure to fix buggy system headers
     and the ordering for the include_next directive are not
     inadvertently changed.  If you really need to change the search
     order for system directories, use the `-nostdinc' and/or
     `-isystem' options.

`-I-'
     Any directories you specify with `-I' options before the `-I-'
     option are searched only for the case of `#include "FILE"'; they
     are not searched for `#include <FILE>'.

     If additional directories are specified with `-I' options after
     the `-I-', these directories are searched for all `#include'
     directives.  (Ordinarily _all_ `-I' directories are used this way.)

     In addition, the `-I-' option inhibits the use of the current
     directory (where the current input file came from) as the first
     search directory for `#include "FILE"'.  There is no way to
     override this effect of `-I-'.  With `-I.' you can specify
     searching the directory which was current when the compiler was
     invoked.  That is not exactly the same as what the preprocessor
     does by default, but it is often satisfactory.

     `-I-' does not inhibit the use of the standard system directories
     for header files.  Thus, `-I-' and `-nostdinc' are independent.

`-LDIR'
     Add directory DIR to the list of directories to be searched for
     `-l'.

`-BPREFIX'
     This option specifies where to find the executables, libraries,
     include files, and data files of the compiler itself.

     The compiler driver program runs one or more of the subprograms
     `cpp', `cc1', `as' and `ld'.  It tries PREFIX as a prefix for each
     program it tries to run, both with and without `MACHINE/VERSION/'
     (*note Target Options::).

     For each subprogram to be run, the compiler driver first tries the
     `-B' prefix, if any.  If that name is not found, or if `-B' was
     not specified, the driver tries two standard prefixes, which are
     `/usr/lib/gcc/' and `/usr/local/lib/gcc/'.  If neither of those
     results in a file name that is found, the unmodified program name
     is searched for using the directories specified in your `PATH'
     environment variable.

     The compiler will check to see if the path provided by the `-B'
     refers to a directory, and if necessary it will add a directory
     separator character at the end of the path.

     `-B' prefixes that effectively specify directory names also apply
     to libraries in the linker, because the compiler translates these
     options into `-L' options for the linker.  They also apply to
     includes files in the preprocessor, because the compiler
     translates these options into `-isystem' options for the
     preprocessor.  In this case, the compiler appends `include' to the
     prefix.

     The run-time support file `libgcc.a' can also be searched for using
     the `-B' prefix, if needed.  If it is not found there, the two
     standard prefixes above are tried, and that is all.  The file is
     left out of the link if it is not found by those means.

     Another way to specify a prefix much like the `-B' prefix is to use
     the environment variable `GCC_EXEC_PREFIX'.  *Note Environment
     Variables::.

     As a special kludge, if the path provided by `-B' is
     `[dir/]stageN/', where N is a number in the range 0 to 9, then it
     will be replaced by `[dir/]include'.  This is to help with
     boot-strapping the compiler.

`-specs=FILE'
     Process FILE after the compiler reads in the standard `specs'
     file, in order to override the defaults that the `gcc' driver
     program uses when determining what switches to pass to `cc1',
     `cc1plus', `as', `ld', etc.  More than one `-specs=FILE' can be
     specified on the command line, and they are processed in order,
     from left to right.

File: gcc.info,  Node: Spec Files,  Next: Target Options,  Prev: Directory Options,  Up: Invoking GCC

3.15 Specifying subprocesses and the switches to pass to them
=============================================================

`gcc' is a driver program.  It performs its job by invoking a sequence
of other programs to do the work of compiling, assembling and linking.
GCC interprets its command-line parameters and uses these to deduce
which programs it should invoke, and which command-line options it
ought to place on their command lines.  This behavior is controlled by
"spec strings".  In most cases there is one spec string for each
program that GCC can invoke, but a few programs have multiple spec
strings to control their behavior.  The spec strings built into GCC can
be overridden by using the `-specs=' command-line switch to specify a
spec file.

 "Spec files" are plaintext files that are used to construct spec
strings.  They consist of a sequence of directives separated by blank
lines.  The type of directive is determined by the first non-whitespace
character on the line and it can be one of the following:

`%COMMAND'
     Issues a COMMAND to the spec file processor.  The commands that can
     appear here are:

    `%include <FILE>'
          Search for FILE and insert its text at the current point in
          the specs file.

    `%include_noerr <FILE>'
          Just like `%include', but do not generate an error message if
          the include file cannot be found.

    `%rename OLD_NAME NEW_NAME'
          Rename the spec string OLD_NAME to NEW_NAME.


`*[SPEC_NAME]:'
     This tells the compiler to create, override or delete the named
     spec string.  All lines after this directive up to the next
     directive or blank line are considered to be the text for the spec
     string.  If this results in an empty string then the spec will be
     deleted.  (Or, if the spec did not exist, then nothing will
     happened.)  Otherwise, if the spec does not currently exist a new
     spec will be created.  If the spec does exist then its contents
     will be overridden by the text of this directive, unless the first
     character of that text is the `+' character, in which case the
     text will be appended to the spec.

`[SUFFIX]:'
     Creates a new `[SUFFIX] spec' pair.  All lines after this directive
     and up to the next directive or blank line are considered to make
     up the spec string for the indicated suffix.  When the compiler
     encounters an input file with the named suffix, it will processes
     the spec string in order to work out how to compile that file.
     For example:

          .ZZ:
          z-compile -input %i

     This says that any input file whose name ends in `.ZZ' should be
     passed to the program `z-compile', which should be invoked with the
     command-line switch `-input' and with the result of performing the
     `%i' substitution.  (See below.)

     As an alternative to providing a spec string, the text that
     follows a suffix directive can be one of the following:

    `@LANGUAGE'
          This says that the suffix is an alias for a known LANGUAGE.
          This is similar to using the `-x' command-line switch to GCC
          to specify a language explicitly.  For example:

               .ZZ:
               @c++

          Says that .ZZ files are, in fact, C++ source files.

    `#NAME'
          This causes an error messages saying:

               NAME compiler not installed on this system.

     GCC already has an extensive list of suffixes built into it.  This
     directive will add an entry to the end of the list of suffixes, but
     since the list is searched from the end backwards, it is
     effectively possible to override earlier entries using this
     technique.


 GCC has the following spec strings built into it.  Spec files can
override these strings or create their own.  Note that individual
targets can also add their own spec strings to this list.

     asm          Options to pass to the assembler
     asm_final    Options to pass to the assembler post-processor
     cpp          Options to pass to the C preprocessor
     cc1          Options to pass to the C compiler
     cc1plus      Options to pass to the C++ compiler
     endfile      Object files to include at the end of the link
     link         Options to pass to the linker
     lib          Libraries to include on the command line to the linker
     libgcc       Decides which GCC support library to pass to the linker
     linker       Sets the name of the linker
     predefines   Defines to be passed to the C preprocessor
     signed_char  Defines to pass to CPP to say whether `char' is signed
                  by default
     startfile    Object files to include at the start of the link

 Here is a small example of a spec file:

     %rename lib                 old_lib

     *lib:
     --start-group -lgcc -lc -leval1 --end-group %(old_lib)

 This example renames the spec called `lib' to `old_lib' and then
overrides the previous definition of `lib' with a new one.  The new
definition adds in some extra command-line options before including the
text of the old definition.

 "Spec strings" are a list of command-line options to be passed to their
corresponding program.  In addition, the spec strings can contain
`%'-prefixed sequences to substitute variable text or to conditionally
insert text into the command line.  Using these constructs it is
possible to generate quite complex command lines.

 Here is a table of all defined `%'-sequences for spec strings.  Note
that spaces are not generated automatically around the results of
expanding these sequences.  Therefore you can concatenate them together
or combine them with constant text in a single argument.

`%%'
     Substitute one `%' into the program name or argument.

`%i'
     Substitute the name of the input file being processed.

`%b'
     Substitute the basename of the input file being processed.  This
     is the substring up to (and not including) the last period and not
     including the directory.

`%B'
     This is the same as `%b', but include the file suffix (text after
     the last period).

`%d'
     Marks the argument containing or following the `%d' as a temporary
     file name, so that that file will be deleted if GCC exits
     successfully.  Unlike `%g', this contributes no text to the
     argument.

`%gSUFFIX'
     Substitute a file name that has suffix SUFFIX and is chosen once
     per compilation, and mark the argument in the same way as `%d'.
     To reduce exposure to denial-of-service attacks, the file name is
     now chosen in a way that is hard to predict even when previously
     chosen file names are known.  For example, `%g.s ... %g.o ... %g.s'
     might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'.  SUFFIX
     matches the regexp `[.A-Za-z]*' or the special string `%O', which
     is treated exactly as if `%O' had been preprocessed.  Previously,
     `%g' was simply substituted with a file name chosen once per
     compilation, without regard to any appended suffix (which was
     therefore treated just like ordinary text), making such attacks
     more likely to succeed.

`%uSUFFIX'
     Like `%g', but generates a new temporary file name even if
     `%uSUFFIX' was already seen.

`%USUFFIX'
     Substitutes the last file name generated with `%uSUFFIX',
     generating a new one if there is no such last file name.  In the
     absence of any `%uSUFFIX', this is just like `%gSUFFIX', except
     they don't share the same suffix _space_, so `%g.s ... %U.s ...
     %g.s ... %U.s' would involve the generation of two distinct file
     names, one for each `%g.s' and another for each `%U.s'.
     Previously, `%U' was simply substituted with a file name chosen
     for the previous `%u', without regard to any appended suffix.

`%jSUFFIX'
     Substitutes the name of the `HOST_BIT_BUCKET', if any, and if it is
     writable, and if save-temps is off; otherwise, substitute the name
     of a temporary file, just like `%u'.  This temporary file is not
     meant for communication between processes, but rather as a junk
     disposal mechanism.

`%|SUFFIX'
`%mSUFFIX'
     Like `%g', except if `-pipe' is in effect.  In that case `%|'
     substitutes a single dash and `%m' substitutes nothing at all.
     These are the two most common ways to instruct a program that it
     should read from standard input or write to standard output.  If
     you need something more elaborate you can use an `%{pipe:`X'}'
     construct: see for example `f/lang-specs.h'.

`%.SUFFIX'
     Substitutes .SUFFIX for the suffixes of a matched switch's args
     when it is subsequently output with `%*'.  SUFFIX is terminated by
     the next space or %.

`%w'
     Marks the argument containing or following the `%w' as the
     designated output file of this compilation.  This puts the argument
     into the sequence of arguments that `%o' will substitute later.

`%o'
     Substitutes the names of all the output files, with spaces
     automatically placed around them.  You should write spaces around
     the `%o' as well or the results are undefined.  `%o' is for use in
     the specs for running the linker.  Input files whose names have no
     recognized suffix are not compiled at all, but they are included
     among the output files, so they will be linked.

`%O'
     Substitutes the suffix for object files.  Note that this is
     handled specially when it immediately follows `%g, %u, or %U',
     because of the need for those to form complete file names.  The
     handling is such that `%O' is treated exactly as if it had already
     been substituted, except that `%g, %u, and %U' do not currently
     support additional SUFFIX characters following `%O' as they would
     following, for example, `.o'.

`%p'
     Substitutes the standard macro predefinitions for the current
     target machine.  Use this when running `cpp'.

`%P'
     Like `%p', but puts `__' before and after the name of each
     predefined macro, except for macros that start with `__' or with
     `_L', where L is an uppercase letter.  This is for ISO C.

`%I'
     Substitute any of `-iprefix' (made from `GCC_EXEC_PREFIX'),
     `-isysroot' (made from `TARGET_SYSTEM_ROOT'), and `-isystem' (made
     from `COMPILER_PATH' and `-B' options) as necessary.

`%s'
     Current argument is the name of a library or startup file of some
     sort.  Search for that file in a standard list of directories and
     substitute the full name found.

`%eSTR'
     Print STR as an error message.  STR is terminated by a newline.
     Use this when inconsistent options are detected.

`%(NAME)'
     Substitute the contents of spec string NAME at this point.

`%[NAME]'
     Like `%(...)' but put `__' around `-D' arguments.

`%x{OPTION}'
     Accumulate an option for `%X'.

`%X'
     Output the accumulated linker options specified by `-Wl' or a `%x'
     spec string.

`%Y'
     Output the accumulated assembler options specified by `-Wa'.

`%Z'
     Output the accumulated preprocessor options specified by `-Wp'.

`%a'
     Process the `asm' spec.  This is used to compute the switches to
     be passed to the assembler.

`%A'
     Process the `asm_final' spec.  This is a spec string for passing
     switches to an assembler post-processor, if such a program is
     needed.

`%l'
     Process the `link' spec.  This is the spec for computing the
     command line passed to the linker.  Typically it will make use of
     the `%L %G %S %D and %E' sequences.

`%D'
     Dump out a `-L' option for each directory that GCC believes might
     contain startup files.  If the target supports multilibs then the
     current multilib directory will be prepended to each of these
     paths.

`%M'
     Output the multilib directory with directory separators replaced
     with `_'.  If multilib directories are not set, or the multilib
     directory is `.' then this option emits nothing.

`%L'
     Process the `lib' spec.  This is a spec string for deciding which
     libraries should be included on the command line to the linker.

`%G'
     Process the `libgcc' spec.  This is a spec string for deciding
     which GCC support library should be included on the command line
     to the linker.

`%S'
     Process the `startfile' spec.  This is a spec for deciding which
     object files should be the first ones passed to the linker.
     Typically this might be a file named `crt0.o'.

`%E'
     Process the `endfile' spec.  This is a spec string that specifies
     the last object files that will be passed to the linker.

`%C'
     Process the `cpp' spec.  This is used to construct the arguments
     to be passed to the C preprocessor.

`%c'
     Process the `signed_char' spec.  This is intended to be used to
     tell cpp whether a char is signed.  It typically has the
     definition:
          %{funsigned-char:-D__CHAR_UNSIGNED__}

`%1'
     Process the `cc1' spec.  This is used to construct the options to
     be passed to the actual C compiler (`cc1').

`%2'
     Process the `cc1plus' spec.  This is used to construct the options
     to be passed to the actual C++ compiler (`cc1plus').

`%*'
     Substitute the variable part of a matched option.  See below.
     Note that each comma in the substituted string is replaced by a
     single space.

`%<`S''
     Remove all occurrences of `-S' from the command line.  Note--this
     command is position dependent.  `%' commands in the spec string
     before this one will see `-S', `%' commands in the spec string
     after this one will not.

`%:FUNCTION(ARGS)'
     Call the named function FUNCTION, passing it ARGS.  ARGS is first
     processed as a nested spec string, then split into an argument
     vector in the usual fashion.  The function returns a string which
     is processed as if it had appeared literally as part of the
     current spec.

     The following built-in spec functions are provided:

    ``if-exists''
          The `if-exists' spec function takes one argument, an absolute
          pathname to a file.  If the file exists, `if-exists' returns
          the pathname.  Here is a small example of its usage:

               *startfile:
               crt0%O%s %:if-exists(crti%O%s) crtbegin%O%s

    ``if-exists-else''
          The `if-exists-else' spec function is similar to the
          `if-exists' spec function, except that it takes two
          arguments.  The first argument is an absolute pathname to a
          file.  If the file exists, `if-exists-else' returns the
          pathname.  If it does not exist, it returns the second
          argument.  This way, `if-exists-else' can be used to select
          one file or another, based on the existence of the first.
          Here is a small example of its usage:

               *startfile:
               crt0%O%s %:if-exists(crti%O%s) \
               %:if-exists-else(crtbeginT%O%s crtbegin%O%s)

`%{`S'}'
     Substitutes the `-S' switch, if that switch was given to GCC.  If
     that switch was not specified, this substitutes nothing.  Note that
     the leading dash is omitted when specifying this option, and it is
     automatically inserted if the substitution is performed.  Thus the
     spec string `%{foo}' would match the command-line option `-foo'
     and would output the command line option `-foo'.

`%W{`S'}'
     Like %{`S'} but mark last argument supplied within as a file to be
     deleted on failure.

`%{`S'*}'
     Substitutes all the switches specified to GCC whose names start
     with `-S', but which also take an argument.  This is used for
     switches like `-o', `-D', `-I', etc.  GCC considers `-o foo' as
     being one switch whose names starts with `o'.  %{o*} would
     substitute this text, including the space.  Thus two arguments
     would be generated.

`%{`S'*&`T'*}'
     Like %{`S'*}, but preserve order of `S' and `T' options (the order
     of `S' and `T' in the spec is not significant).  There can be any
     number of ampersand-separated variables; for each the wild card is
     optional.  Useful for CPP as `%{D*&U*&A*}'.

`%{`S':`X'}'
     Substitutes `X', if the `-S' switch was given to GCC.

`%{!`S':`X'}'
     Substitutes `X', if the `-S' switch was _not_ given to GCC.

`%{`S'*:`X'}'
     Substitutes `X' if one or more switches whose names start with
     `-S' are specified to GCC.  Normally `X' is substituted only once,
     no matter how many such switches appeared.  However, if `%*'
     appears somewhere in `X', then `X' will be substituted once for
     each matching switch, with the `%*' replaced by the part of that
     switch that matched the `*'.

`%{.`S':`X'}'
     Substitutes `X', if processing a file with suffix `S'.

`%{!.`S':`X'}'
     Substitutes `X', if _not_ processing a file with suffix `S'.

`%{`S'|`P':`X'}'
     Substitutes `X' if either `-S' or `-P' was given to GCC.  This may
     be combined with `!', `.', and `*' sequences as well, although
     they have a stronger binding than the `|'.  If `%*' appears in
     `X', all of the alternatives must be starred, and only the first
     matching alternative is substituted.

     For example, a spec string like this:

          %{.c:-foo} %{!.c:-bar} %{.c|d:-baz} %{!.c|d:-boggle}

     will output the following command-line options from the following
     input command-line options:

          fred.c        -foo -baz
          jim.d         -bar -boggle
          -d fred.c     -foo -baz -boggle
          -d jim.d      -bar -baz -boggle

`%{S:X; T:Y; :D}'
     If `S' was given to GCC, substitutes `X'; else if `T' was given to
     GCC, substitutes `Y'; else substitutes `D'.  There can be as many
     clauses as you need.  This may be combined with `.', `!', `|', and
     `*' as needed.


 The conditional text `X' in a %{`S':`X'} or similar construct may
contain other nested `%' constructs or spaces, or even newlines.  They
are processed as usual, as described above.  Trailing white space in
`X' is ignored.  White space may also appear anywhere on the left side
of the colon in these constructs, except between `.' or `*' and the
corresponding word.

 The `-O', `-f', `-m', and `-W' switches are handled specifically in
these constructs.  If another value of `-O' or the negated form of a
`-f', `-m', or `-W' switch is found later in the command line, the
earlier switch value is ignored, except with {`S'*} where `S' is just
one letter, which passes all matching options.

 The character `|' at the beginning of the predicate text is used to
indicate that a command should be piped to the following command, but
only if `-pipe' is specified.

 It is built into GCC which switches take arguments and which do not.
(You might think it would be useful to generalize this to allow each
compiler's spec to say which switches take arguments.  But this cannot
be done in a consistent fashion.  GCC cannot even decide which input
files have been specified without knowing which switches take arguments,
and it must know which input files to compile in order to tell which
compilers to run).

 GCC also knows implicitly that arguments starting in `-l' are to be
treated as compiler output files, and passed to the linker in their
proper position among the other output files.

File: gcc.info,  Node: Target Options,  Next: Submodel Options,  Prev: Spec Files,  Up: Invoking GCC

3.16 Specifying Target Machine and Compiler Version
===================================================

The usual way to run GCC is to run the executable called `gcc', or
`<machine>-gcc' when cross-compiling, or `<machine>-gcc-<version>' to
run a version other than the one that was installed last.  Sometimes
this is inconvenient, so GCC provides options that will switch to
another cross-compiler or version.

`-b MACHINE'
     The argument MACHINE specifies the target machine for compilation.

     The value to use for MACHINE is the same as was specified as the
     machine type when configuring GCC as a cross-compiler.  For
     example, if a cross-compiler was configured with `configure
     i386v', meaning to compile for an 80386 running System V, then you
     would specify `-b i386v' to run that cross compiler.

`-V VERSION'
     The argument VERSION specifies which version of GCC to run.  This
     is useful when multiple versions are installed.  For example,
     VERSION might be `2.0', meaning to run GCC version 2.0.

 The `-V' and `-b' options work by running the
`<machine>-gcc-<version>' executable, so there's no real reason to use
them if you can just run that directly.

File: gcc.info,  Node: Invoking G++,  Next: C Dialect Options,  Prev: Overall Options,  Up: Invoking GCC

3.3 Compiling C++ Programs
==========================

C++ source files conventionally use one of the suffixes `.C', `.cc',
`.cpp', `.CPP', `.c++', `.cp', or `.cxx'; C++ header files often use
`.hh' or `.H'; and preprocessed C++ files use the suffix `.ii'.  GCC
recognizes files with these names and compiles them as C++ programs
even if you call the compiler the same way as for compiling C programs
(usually with the name `gcc').

 However, C++ programs often require class libraries as well as a
compiler that understands the C++ language--and under some
circumstances, you might want to compile programs or header files from
standard input, or otherwise without a suffix that flags them as C++
programs.  You might also like to precompile a C header file with a
`.h' extension to be used in C++ compilations.  `g++' is a program that
calls GCC with the default language set to C++, and automatically
specifies linking against the C++ library.  On many systems, `g++' is
also installed with the name `c++'.

 When you compile C++ programs, you may specify many of the same
command-line options that you use for compiling programs in any
language; or command-line options meaningful for C and related
languages; or options that are meaningful only for C++ programs.  *Note
Options Controlling C Dialect: C Dialect Options, for explanations of
options for languages related to C.  *Note Options Controlling C++
Dialect: C++ Dialect Options, for explanations of options that are
meaningful only for C++ programs.

File: gcc.info,  Node: Submodel Options,  Next: Code Gen Options,  Prev: Target Options,  Up: Invoking GCC

3.17 Hardware Models and Configurations
=======================================

Earlier we discussed the standard option `-b' which chooses among
different installed compilers for completely different target machines,
such as VAX vs. 68000 vs. 80386.

 In addition, each of these target machine types can have its own
special options, starting with `-m', to choose among various hardware
models or configurations--for example, 68010 vs 68020, floating
coprocessor or none.  A single installed version of the compiler can
compile for any model or configuration, according to the options
specified.

 Some configurations of the compiler also support additional special
options, usually for compatibility with other compilers on the same
platform.

 These options are defined by the macro `TARGET_SWITCHES' in the
machine description.  The default for the options is also defined by
that macro, which enables you to change the defaults.

* Menu:

* M680x0 Options::
* M68hc1x Options::
* VAX Options::
* SPARC Options::
* ARM Options::
* MN10300 Options::
* M32R/D Options::
* RS/6000 and PowerPC Options::
* Darwin Options::
* MIPS Options::
* i386 and x86-64 Options::
* HPPA Options::
* Intel 960 Options::
* DEC Alpha Options::
* DEC Alpha/VMS Options::
* H8/300 Options::
* SH Options::
* System V Options::
* TMS320C3x/C4x Options::
* V850 Options::
* ARC Options::
* NS32K Options::
* AVR Options::
* MCore Options::
* IA-64 Options::
* D30V Options::
* S/390 and zSeries Options::
* CRIS Options::
* MMIX Options::
* PDP-11 Options::
* Xstormy16 Options::
* Xtensa Options::
* FRV Options::

File: gcc.info,  Node: M680x0 Options,  Next: M68hc1x Options,  Up: Submodel Options

3.17.1 M680x0 Options
---------------------

These are the `-m' options defined for the 68000 series.  The default
values for these options depends on which style of 68000 was selected
when the compiler was configured; the defaults for the most common
choices are given below.

`-m68000'
`-mc68000'
     Generate output for a 68000.  This is the default when the
     compiler is configured for 68000-based systems.

     Use this option for microcontrollers with a 68000 or EC000 core,
     including the 68008, 68302, 68306, 68307, 68322, 68328 and 68356.

`-m68020'
`-mc68020'
     Generate output for a 68020.  This is the default when the
     compiler is configured for 68020-based systems.

`-m68881'
     Generate output containing 68881 instructions for floating point.
     This is the default for most 68020 systems unless `--nfp' was
     specified when the compiler was configured.

`-m68030'
     Generate output for a 68030.  This is the default when the
     compiler is configured for 68030-based systems.

`-m68040'
     Generate output for a 68040.  This is the default when the
     compiler is configured for 68040-based systems.

     This option inhibits the use of 68881/68882 instructions that have
     to be emulated by software on the 68040.  Use this option if your
     68040 does not have code to emulate those instructions.

`-m68060'
     Generate output for a 68060.  This is the default when the
     compiler is configured for 68060-based systems.

     This option inhibits the use of 68020 and 68881/68882 instructions
     that have to be emulated by software on the 68060.  Use this
     option if your 68060 does not have code to emulate those
     instructions.

`-mcpu32'
     Generate output for a CPU32.  This is the default when the
     compiler is configured for CPU32-based systems.

     Use this option for microcontrollers with a CPU32 or CPU32+ core,
     including the 68330, 68331, 68332, 68333, 68334, 68336, 68340,
     68341, 68349 and 68360.

`-m5200'
     Generate output for a 520X "coldfire" family cpu.  This is the
     default when the compiler is configured for 520X-based systems.

     Use this option for microcontroller with a 5200 core, including
     the MCF5202, MCF5203, MCF5204 and MCF5202.

`-m68020-40'
     Generate output for a 68040, without using any of the new
     instructions.  This results in code which can run relatively
     efficiently on either a 68020/68881 or a 68030 or a 68040.  The
     generated code does use the 68881 instructions that are emulated
     on the 68040.

`-m68020-60'
     Generate output for a 68060, without using any of the new
     instructions.  This results in code which can run relatively
     efficiently on either a 68020/68881 or a 68030 or a 68040.  The
     generated code does use the 68881 instructions that are emulated
     on the 68060.

`-msoft-float'
     Generate output containing library calls for floating point.
     *Warning:* the requisite libraries are not available for all m68k
     targets.  Normally the facilities of the machine's usual C
     compiler are used, but this can't be done directly in
     cross-compilation.  You must make your own arrangements to provide
     suitable library functions for cross-compilation.  The embedded
     targets `m68k-*-aout' and `m68k-*-coff' do provide software
     floating point support.

`-mshort'
     Consider type `int' to be 16 bits wide, like `short int'.

`-mnobitfield'
     Do not use the bit-field instructions.  The `-m68000', `-mcpu32'
     and `-m5200' options imply `-mnobitfield'.

`-mbitfield'
     Do use the bit-field instructions.  The `-m68020' option implies
     `-mbitfield'.  This is the default if you use a configuration
     designed for a 68020.

`-mrtd'
     Use a different function-calling convention, in which functions
     that take a fixed number of arguments return with the `rtd'
     instruction, which pops their arguments while returning.  This
     saves one instruction in the caller since there is no need to pop
     the arguments there.

     This calling convention is incompatible with the one normally used
     on Unix, so you cannot use it if you need to call libraries
     compiled with the Unix compiler.

     Also, you must provide function prototypes for all functions that
     take variable numbers of arguments (including `printf'); otherwise
     incorrect code will be generated for calls to those functions.

     In addition, seriously incorrect code will result if you call a
     function with too many arguments.  (Normally, extra arguments are
     harmlessly ignored.)

     The `rtd' instruction is supported by the 68010, 68020, 68030,
     68040, 68060 and CPU32 processors, but not by the 68000 or 5200.

`-malign-int'
`-mno-align-int'
     Control whether GCC aligns `int', `long', `long long', `float',
     `double', and `long double' variables on a 32-bit boundary
     (`-malign-int') or a 16-bit boundary (`-mno-align-int').  Aligning
     variables on 32-bit boundaries produces code that runs somewhat
     faster on processors with 32-bit busses at the expense of more
     memory.

     *Warning:* if you use the `-malign-int' switch, GCC will align
     structures containing the above types  differently than most
     published application binary interface specifications for the m68k.

`-mpcrel'
     Use the pc-relative addressing mode of the 68000 directly, instead
     of using a global offset table.  At present, this option implies
     `-fpic', allowing at most a 16-bit offset for pc-relative
     addressing.  `-fPIC' is not presently supported with `-mpcrel',
     though this could be supported for 68020 and higher processors.

`-mno-strict-align'
`-mstrict-align'
     Do not (do) assume that unaligned memory references will be
     handled by the system.

`-msep-data'
     Generate code that allows the data segment to be located in a
     different area of memory from the text segment.  This allows for
     execute in place in an environment without virtual memory
     management.  This option implies -fPIC.

`-mno-sep-data'
     Generate code that assumes that the data segment follows the text
     segment.  This is the default.

`-mid-shared-library'
     Generate code that supports shared libraries via the library ID
     method.  This allows for execute in place and shared libraries in
     an environment without virtual memory management.  This option
     implies -fPIC.

`-mno-id-shared-library'
     Generate code that doesn't assume ID based shared libraries are
     being used.  This is the default.

`-mshared-library-id=n'
     Specified the identification number of the ID based shared library
     being compiled.  Specifying a value of 0 will generate more
     compact code, specifying other values will force the allocation of
     that number to the current library but is no more space or time
     efficient than omitting this option.


File: gcc.info,  Node: M68hc1x Options,  Next: VAX Options,  Prev: M680x0 Options,  Up: Submodel Options

3.17.2 M68hc1x Options
----------------------

These are the `-m' options defined for the 68hc11 and 68hc12
microcontrollers.  The default values for these options depends on
which style of microcontroller was selected when the compiler was
configured; the defaults for the most common choices are given below.

`-m6811'
`-m68hc11'
     Generate output for a 68HC11.  This is the default when the
     compiler is configured for 68HC11-based systems.

`-m6812'
`-m68hc12'
     Generate output for a 68HC12.  This is the default when the
     compiler is configured for 68HC12-based systems.

`-m68S12'
`-m68hcs12'
     Generate output for a 68HCS12.

`-mauto-incdec'
     Enable the use of 68HC12 pre and post auto-increment and
     auto-decrement addressing modes.

`-minmax'
`-nominmax'
     Enable the use of 68HC12 min and max instructions.

`-mlong-calls'
`-mno-long-calls'
     Treat all calls as being far away (near).  If calls are assumed to
     be far away, the compiler will use the `call' instruction to call
     a function and the `rtc' instruction for returning.

`-mshort'
     Consider type `int' to be 16 bits wide, like `short int'.

`-msoft-reg-count=COUNT'
     Specify the number of pseudo-soft registers which are used for the
     code generation.  The maximum number is 32.  Using more pseudo-soft
     register may or may not result in better code depending on the
     program.  The default is 4 for 68HC11 and 2 for 68HC12.


File: gcc.info,  Node: VAX Options,  Next: SPARC Options,  Prev: M68hc1x Options,  Up: Submodel Options

3.17.3 VAX Options
------------------

These `-m' options are defined for the VAX:

`-munix'
     Do not output certain jump instructions (`aobleq' and so on) that
     the Unix assembler for the VAX cannot handle across long ranges.

`-mgnu'
     Do output those jump instructions, on the assumption that you will
     assemble with the GNU assembler.

`-mg'
     Output code for g-format floating point numbers instead of
     d-format.

File: gcc.info,  Node: SPARC Options,  Next: ARM Options,  Prev: VAX Options,  Up: Submodel Options

3.17.4 SPARC Options
--------------------

These `-m' options are supported on the SPARC:

`-mno-app-regs'
`-mapp-regs'
     Specify `-mapp-regs' to generate output using the global registers
     2 through 4, which the SPARC SVR4 ABI reserves for applications.
     This is the default, except on Solaris.

     To be fully SVR4 ABI compliant at the cost of some performance
     loss, specify `-mno-app-regs'.  You should compile libraries and
     system software with this option.

`-mfpu'
`-mhard-float'
     Generate output containing floating point instructions.  This is
     the default.

`-mno-fpu'
`-msoft-float'
     Generate output containing library calls for floating point.
     *Warning:* the requisite libraries are not available for all SPARC
     targets.  Normally the facilities of the machine's usual C
     compiler are used, but this cannot be done directly in
     cross-compilation.  You must make your own arrangements to provide
     suitable library functions for cross-compilation.  The embedded
     targets `sparc-*-aout' and `sparclite-*-*' do provide software
     floating point support.

     `-msoft-float' changes the calling convention in the output file;
     therefore, it is only useful if you compile _all_ of a program with
     this option.  In particular, you need to compile `libgcc.a', the
     library that comes with GCC, with `-msoft-float' in order for this
     to work.

`-mhard-quad-float'
     Generate output containing quad-word (long double) floating point
     instructions.

`-msoft-quad-float'
     Generate output containing library calls for quad-word (long
     double) floating point instructions.  The functions called are
     those specified in the SPARC ABI.  This is the default.

     As of this writing, there are no SPARC implementations that have
     hardware support for the quad-word floating point instructions.
     They all invoke a trap handler for one of these instructions, and
     then the trap handler emulates the effect of the instruction.
     Because of the trap handler overhead, this is much slower than
     calling the ABI library routines.  Thus the `-msoft-quad-float'
     option is the default.

`-mno-flat'
`-mflat'
     With `-mflat', the compiler does not generate save/restore
     instructions and will use a "flat" or single register window
     calling convention.  This model uses %i7 as the frame pointer and
     is compatible with the normal register window model.  Code from
     either may be intermixed.  The local registers and the input
     registers (0-5) are still treated as "call saved" registers and
     will be saved on the stack as necessary.

     With `-mno-flat' (the default), the compiler emits save/restore
     instructions (except for leaf functions) and is the normal mode of
     operation.

     These options are deprecated and will be deleted in a future GCC
     release.

`-mno-unaligned-doubles'
`-munaligned-doubles'
     Assume that doubles have 8 byte alignment.  This is the default.

     With `-munaligned-doubles', GCC assumes that doubles have 8 byte
     alignment only if they are contained in another type, or if they
     have an absolute address.  Otherwise, it assumes they have 4 byte
     alignment.  Specifying this option avoids some rare compatibility
     problems with code generated by other compilers.  It is not the
     default because it results in a performance loss, especially for
     floating point code.

`-mno-faster-structs'
`-mfaster-structs'
     With `-mfaster-structs', the compiler assumes that structures
     should have 8 byte alignment.  This enables the use of pairs of
     `ldd' and `std' instructions for copies in structure assignment,
     in place of twice as many `ld' and `st' pairs.  However, the use
     of this changed alignment directly violates the SPARC ABI.  Thus,
     it's intended only for use on targets where the developer
     acknowledges that their resulting code will not be directly in
     line with the rules of the ABI.

`-mimpure-text'
     `-mimpure-text', used in addition to `-shared', tells the compiler
     to not pass `-z text' to the linker when linking a shared object.
     Using this option, you can link position-dependent code into a
     shared object.

     `-mimpure-text' suppresses the "relocations remain against
     allocatable but non-writable sections" linker error message.
     However, the necessary relocations will trigger copy-on-write, and
     the shared object is not actually shared across processes.
     Instead of using `-mimpure-text', you should compile all source
     code with `-fpic' or `-fPIC'.

     This option is only available on SunOS and Solaris.

`-mv8'
`-msparclite'
     These two options select variations on the SPARC architecture.
     These options are deprecated and will be deleted in a future GCC
     release.  They have been replaced with `-mcpu=xxx'.

`-mcypress'
`-msupersparc'
`-mf930'
`-mf934'
     These four options select the processor for which the code is
     optimized.  These options are deprecated and will be deleted in a
     future GCC release.  They have been replaced with `-mcpu=xxx'.

`-mcpu=CPU_TYPE'
     Set the instruction set, register set, and instruction scheduling
     parameters for machine type CPU_TYPE.  Supported values for
     CPU_TYPE are `v7', `cypress', `v8', `supersparc', `sparclite',
     `f930', `f934', `hypersparc', `sparclite86x', `sparclet',
     `tsc701', `v9', `ultrasparc', and `ultrasparc3'.

     Default instruction scheduling parameters are used for values that
     select an architecture and not an implementation.  These are `v7',
     `v8', `sparclite', `sparclet', `v9'.

     Here is a list of each supported architecture and their supported
     implementations.

              v7:             cypress
              v8:             supersparc, hypersparc
              sparclite:      f930, f934, sparclite86x
              sparclet:       tsc701
              v9:             ultrasparc, ultrasparc3

     By default (unless configured otherwise), GCC generates code for
     the V7 variant of the SPARC architecture.  With `-mcpu=cypress',
     the compiler additionally optimizes it for the Cypress CY7C602
     chip, as used in the SPARCStation/SPARCServer 3xx series.  This is
     also appropriate for the older SPARCStation 1, 2, IPX etc.

     With `-mcpu=v8', GCC generates code for the V8 variant of the SPARC
     architecture.  The only difference from V7 code is that the
     compiler emits the integer multiply and integer divide
     instructions which exist in SPARC-V8 but not in SPARC-V7.  With
     `-mcpu=supersparc', the compiler additionally optimizes it for the
     SuperSPARC chip, as used in the SPARCStation 10, 1000 and 2000
     series.

     With `-mcpu=sparclite', GCC generates code for the SPARClite
     variant of the SPARC architecture.  This adds the integer
     multiply, integer divide step and scan (`ffs') instructions which
     exist in SPARClite but not in SPARC-V7.  With `-mcpu=f930', the
     compiler additionally optimizes it for the Fujitsu MB86930 chip,
     which is the original SPARClite, with no FPU.  With `-mcpu=f934',
     the compiler additionally optimizes it for the Fujitsu MB86934
     chip, which is the more recent SPARClite with FPU.

     With `-mcpu=sparclet', GCC generates code for the SPARClet variant
     of the SPARC architecture.  This adds the integer multiply,
     multiply/accumulate, integer divide step and scan (`ffs')
     instructions which exist in SPARClet but not in SPARC-V7.  With
     `-mcpu=tsc701', the compiler additionally optimizes it for the
     TEMIC SPARClet chip.

     With `-mcpu=v9', GCC generates code for the V9 variant of the SPARC
     architecture.  This adds 64-bit integer and floating-point move
     instructions, 3 additional floating-point condition code registers
     and conditional move instructions.  With `-mcpu=ultrasparc', the
     compiler additionally optimizes it for the Sun UltraSPARC I/II
     chips.  With `-mcpu=ultrasparc3', the compiler additionally
     optimizes it for the Sun UltraSPARC III chip.

`-mtune=CPU_TYPE'
     Set the instruction scheduling parameters for machine type
     CPU_TYPE, but do not set the instruction set or register set that
     the option `-mcpu=CPU_TYPE' would.

     The same values for `-mcpu=CPU_TYPE' can be used for
     `-mtune=CPU_TYPE', but the only useful values are those that
     select a particular cpu implementation.  Those are `cypress',
     `supersparc', `hypersparc', `f930', `f934', `sparclite86x',
     `tsc701', `ultrasparc', and `ultrasparc3'.

`-mv8plus'
`-mno-v8plus'
     With `-mv8plus', GCC generates code for the SPARC-V8+ ABI.  The
     difference from the V8 ABI is that the global and out registers are
     considered 64-bit wide.  This is enabled by default on Solaris in
     32-bit mode for all SPARC-V9 processors.

`-mvis'
`-mno-vis'
     With `-mvis', GCC generates code that takes advantage of the
     UltraSPARC Visual Instruction Set extensions.  The default is
     `-mno-vis'.

 These `-m' options are supported in addition to the above on SPARC-V9
processors in 64-bit environments:

`-mlittle-endian'
     Generate code for a processor running in little-endian mode. It is
     only available for a few configurations and most notably not on
     Solaris and Linux.

`-m32'
`-m64'
     Generate code for a 32-bit or 64-bit environment.  The 32-bit
     environment sets int, long and pointer to 32 bits.  The 64-bit
     environment sets int to 32 bits and long and pointer to 64 bits.

`-mcmodel=medlow'
     Generate code for the Medium/Low code model: 64-bit addresses,
     programs must be linked in the low 32 bits of memory.  Programs
     can be statically or dynamically linked.

`-mcmodel=medmid'
     Generate code for the Medium/Middle code model: 64-bit addresses,
     programs must be linked in the low 44 bits of memory, the text and
     data segments must be less than 2GB in size and the data segment
     must be located within 2GB of the text segment.

`-mcmodel=medany'
     Generate code for the Medium/Anywhere code model: 64-bit
     addresses, programs may be linked anywhere in memory, the text and
     data segments must be less than 2GB in size and the data segment
     must be located within 2GB of the text segment.

`-mcmodel=embmedany'
     Generate code for the Medium/Anywhere code model for embedded
     systems: 64-bit addresses, the text and data segments must be less
     than 2GB in size, both starting anywhere in memory (determined at
     link time).  The global register %g4 points to the base of the
     data segment.  Programs are statically linked and PIC is not
     supported.

`-mstack-bias'
`-mno-stack-bias'
     With `-mstack-bias', GCC assumes that the stack pointer, and frame
     pointer if present, are offset by -2047 which must be added back
     when making stack frame references.  This is the default in 64-bit
     mode.  Otherwise, assume no such offset is present.

 These switches are supported in addition to the above on Solaris:

`-threads'
     Add support for multithreading using the Solaris threads library.
     This option sets flags for both the preprocessor and linker.  This
     option does not affect the thread safety of object code produced
     by the compiler or that of libraries supplied with it.

`-pthreads'
     Add support for multithreading using the POSIX threads library.
     This option sets flags for both the preprocessor and linker.  This
     option does not affect the thread safety of object code produced
     by the compiler or that of libraries supplied with it.

File: gcc.info,  Node: ARM Options,  Next: MN10300 Options,  Prev: SPARC Options,  Up: Submodel Options

3.17.5 ARM Options
------------------

These `-m' options are defined for Advanced RISC Machines (ARM)
architectures:

`-mapcs-frame'
     Generate a stack frame that is compliant with the ARM Procedure
     Call Standard for all functions, even if this is not strictly
     necessary for correct execution of the code.  Specifying
     `-fomit-frame-pointer' with this option will cause the stack
     frames not to be generated for leaf functions.  The default is
     `-mno-apcs-frame'.

`-mapcs'
     This is a synonym for `-mapcs-frame'.

`-mapcs-26'
     Generate code for a processor running with a 26-bit program
     counter, and conforming to the function calling standards for the
     APCS 26-bit option.

     This option is deprecated.  Future releases of the GCC will only
     support generating code that runs in apcs-32 mode.

`-mapcs-32'
     Generate code for a processor running with a 32-bit program
     counter, and conforming to the function calling standards for the
     APCS 32-bit option.

     This flag is deprecated.  Future releases of GCC will make this
     flag unconditional.

`-mthumb-interwork'
     Generate code which supports calling between the ARM and Thumb
     instruction sets.  Without this option the two instruction sets
     cannot be reliably used inside one program.  The default is
     `-mno-thumb-interwork', since slightly larger code is generated
     when `-mthumb-interwork' is specified.

`-mno-sched-prolog'
     Prevent the reordering of instructions in the function prolog, or
     the merging of those instruction with the instructions in the
     function's body.  This means that all functions will start with a
     recognizable set of instructions (or in fact one of a choice from
     a small set of different function prologues), and this information
     can be used to locate the start if functions inside an executable
     piece of code.  The default is `-msched-prolog'.

`-mhard-float'
     Generate output containing floating point instructions.  This is
     the default.

`-msoft-float'
     Generate output containing library calls for floating point.
     *Warning:* the requisite libraries are not available for all ARM
     targets.  Normally the facilities of the machine's usual C
     compiler are used, but this cannot be done directly in
     cross-compilation.  You must make your own arrangements to provide
     suitable library functions for cross-compilation.

     `-msoft-float' changes the calling convention in the output file;
     therefore, it is only useful if you compile _all_ of a program with
     this option.  In particular, you need to compile `libgcc.a', the
     library that comes with GCC, with `-msoft-float' in order for this
     to work.

`-mlittle-endian'
     Generate code for a processor running in little-endian mode.  This
     is the default for all standard configurations.

`-mbig-endian'
     Generate code for a processor running in big-endian mode; the
     default is to compile code for a little-endian processor.

`-mwords-little-endian'
     This option only applies when generating code for big-endian
     processors.  Generate code for a little-endian word order but a
     big-endian byte order.  That is, a byte order of the form
     `32107654'.  Note: this option should only be used if you require
     compatibility with code for big-endian ARM processors generated by
     versions of the compiler prior to 2.8.

`-malignment-traps'
     Generate code that will not trap if the MMU has alignment traps
     enabled.  On ARM architectures prior to ARMv4, there were no
     instructions to access half-word objects stored in memory.
     However, when reading from memory a feature of the ARM
     architecture allows a word load to be used, even if the address is
     unaligned, and the processor core will rotate the data as it is
     being loaded.  This option tells the compiler that such misaligned
     accesses will cause a MMU trap and that it should instead
     synthesize the access as a series of byte accesses.  The compiler
     can still use word accesses to load half-word data if it knows
     that the address is aligned to a word boundary.

     This option has no effect when compiling for ARM architecture 4 or
     later, since these processors have instructions to directly access
     half-word objects in memory.

`-mno-alignment-traps'
     Generate code that assumes that the MMU will not trap unaligned
     accesses.  This produces better code when the target instruction
     set does not have half-word memory operations (i.e.
     implementations prior to ARMv4).

     Note that you cannot use this option to access unaligned word
     objects, since the processor will only fetch one 32-bit aligned
     object from memory.

     The default setting is `-malignment-traps', since this produces
     code that will also run on processors implementing ARM architecture
     version 6 or later.

     This option is deprecated and will be removed in the next release
     of GCC.

`-mcpu=NAME'
     This specifies the name of the target ARM processor.  GCC uses
     this name to determine what kind of instructions it can emit when
     generating assembly code.  Permissible names are: `arm2', `arm250',
     `arm3', `arm6', `arm60', `arm600', `arm610', `arm620', `arm7',
     `arm7m', `arm7d', `arm7dm', `arm7di', `arm7dmi', `arm70', `arm700',
     `arm700i', `arm710', `arm710c', `arm7100', `arm7500', `arm7500fe',
     `arm7tdmi', `arm8', `strongarm', `strongarm110', `strongarm1100',
     `arm8', `arm810', `arm9', `arm9e', `arm920', `arm920t',
     `arm926ejs', `arm940t', `arm9tdmi', `arm10tdmi', `arm1020t',
     `arm1026ejs', `arm1136js', `arm1136jfs' ,`xscale', `iwmmxt',
     `ep9312'.

`-mtune=NAME'
     This option is very similar to the `-mcpu=' option, except that
     instead of specifying the actual target processor type, and hence
     restricting which instructions can be used, it specifies that GCC
     should tune the performance of the code as if the target were of
     the type specified in this option, but still choosing the
     instructions that it will generate based on the cpu specified by a
     `-mcpu=' option.  For some ARM implementations better performance
     can be obtained by using this option.

`-march=NAME'
     This specifies the name of the target ARM architecture.  GCC uses
     this name to determine what kind of instructions it can emit when
     generating assembly code.  This option can be used in conjunction
     with or instead of the `-mcpu=' option.  Permissible names are:
     `armv2', `armv2a', `armv3', `armv3m', `armv4', `armv4t', `armv5',
     `armv5t', `armv5te', `armv6j', `iwmmxt', `ep9312'.

`-mfpe=NUMBER'
`-mfp=NUMBER'
     This specifies the version of the floating point emulation
     available on the target.  Permissible values are 2 and 3.  `-mfp='
     is a synonym for `-mfpe=', for compatibility with older versions
     of GCC.

`-mstructure-size-boundary=N'
     The size of all structures and unions will be rounded up to a
     multiple of the number of bits set by this option.  Permissible
     values are 8 and 32.  The default value varies for different
     toolchains.  For the COFF targeted toolchain the default value is
     8.  Specifying the larger number can produce faster, more
     efficient code, but can also increase the size of the program.
     The two values are potentially incompatible.  Code compiled with
     one value cannot necessarily expect to work with code or libraries
     compiled with the other value, if they exchange information using
     structures or unions.

`-mabort-on-noreturn'
     Generate a call to the function `abort' at the end of a `noreturn'
     function.  It will be executed if the function tries to return.

`-mlong-calls'
`-mno-long-calls'
     Tells the compiler to perform function calls by first loading the
     address of the function into a register and then performing a
     subroutine call on this register.  This switch is needed if the
     target function will lie outside of the 64 megabyte addressing
     range of the offset based version of subroutine call instruction.

     Even if this switch is enabled, not all function calls will be
     turned into long calls.  The heuristic is that static functions,
     functions which have the `short-call' attribute, functions that
     are inside the scope of a `#pragma no_long_calls' directive and
     functions whose definitions have already been compiled within the
     current compilation unit, will not be turned into long calls.  The
     exception to this rule is that weak function definitions,
     functions with the `long-call' attribute or the `section'
     attribute, and functions that are within the scope of a `#pragma
     long_calls' directive, will always be turned into long calls.

     This feature is not enabled by default.  Specifying
     `-mno-long-calls' will restore the default behavior, as will
     placing the function calls within the scope of a `#pragma
     long_calls_off' directive.  Note these switches have no effect on
     how the compiler generates code to handle function calls via
     function pointers.

`-mnop-fun-dllimport'
     Disable support for the `dllimport' attribute.

`-msingle-pic-base'
     Treat the register used for PIC addressing as read-only, rather
     than loading it in the prologue for each function.  The run-time
     system is responsible for initializing this register with an
     appropriate value before execution begins.

`-mpic-register=REG'
     Specify the register to be used for PIC addressing.  The default
     is R10 unless stack-checking is enabled, when R9 is used.

`-mcirrus-fix-invalid-insns'
     Insert NOPs into the instruction stream to in order to work around
     problems with invalid Maverick instruction combinations.  This
     option is only valid if the `-mcpu=ep9312' option has been used to
     enable generation of instructions for the Cirrus Maverick floating
     point co-processor.  This option is not enabled by default, since
     the problem is only present in older Maverick implementations.
     The default can be re-enabled by use of the
     `-mno-cirrus-fix-invalid-insns' switch.

`-mpoke-function-name'
     Write the name of each function into the text section, directly
     preceding the function prologue.  The generated code is similar to
     this:

               t0
                   .ascii "arm_poke_function_name", 0
                   .align
               t1
                   .word 0xff000000 + (t1 - t0)
               arm_poke_function_name
                   mov     ip, sp
                   stmfd   sp!, {fp, ip, lr, pc}
                   sub     fp, ip, #4

     When performing a stack backtrace, code can inspect the value of
     `pc' stored at `fp + 0'.  If the trace function then looks at
     location `pc - 12' and the top 8 bits are set, then we know that
     there is a function name embedded immediately preceding this
     location and has length `((pc[-3]) & 0xff000000)'.

`-mthumb'
     Generate code for the 16-bit Thumb instruction set.  The default
     is to use the 32-bit ARM instruction set.

`-mtpcs-frame'
     Generate a stack frame that is compliant with the Thumb Procedure
     Call Standard for all non-leaf functions.  (A leaf function is one
     that does not call any other functions.)  The default is
     `-mno-tpcs-frame'.

`-mtpcs-leaf-frame'
     Generate a stack frame that is compliant with the Thumb Procedure
     Call Standard for all leaf functions.  (A leaf function is one
     that does not call any other functions.)  The default is
     `-mno-apcs-leaf-frame'.

`-mcallee-super-interworking'
     Gives all externally visible functions in the file being compiled
     an ARM instruction set header which switches to Thumb mode before
     executing the rest of the function.  This allows these functions
     to be called from non-interworking code.

`-mcaller-super-interworking'
     Allows calls via function pointers (including virtual functions) to
     execute correctly regardless of whether the target code has been
     compiled for interworking or not.  There is a small overhead in
     the cost of executing a function pointer if this option is enabled.


File: gcc.info,  Node: MN10300 Options,  Next: M32R/D Options,  Prev: ARM Options,  Up: Submodel Options

3.17.6 MN10300 Options
----------------------

These `-m' options are defined for Matsushita MN10300 architectures:

`-mmult-bug'
     Generate code to avoid bugs in the multiply instructions for the
     MN10300 processors.  This is the default.

`-mno-mult-bug'
     Do not generate code to avoid bugs in the multiply instructions
     for the MN10300 processors.

`-mam33'
     Generate code which uses features specific to the AM33 processor.

`-mno-am33'
     Do not generate code which uses features specific to the AM33
     processor.  This is the default.

`-mno-crt0'
     Do not link in the C run-time initialization object file.

`-mrelax'
     Indicate to the linker that it should perform a relaxation
     optimization pass to shorten branches, calls and absolute memory
     addresses.  This option only has an effect when used on the
     command line for the final link step.

     This option makes symbolic debugging impossible.

File: gcc.info,  Node: M32R/D Options,  Next: RS/6000 and PowerPC Options,  Prev: MN10300 Options,  Up: Submodel Options

3.17.7 M32R/D Options
---------------------

These `-m' options are defined for Renesas M32R/D architectures:

`-m32r2'
     Generate code for the M32R/2.

`-m32rx'
     Generate code for the M32R/X.

`-m32r'
     Generate code for the M32R.  This is the default.

`-mmodel=small'
     Assume all objects live in the lower 16MB of memory (so that their
     addresses can be loaded with the `ld24' instruction), and assume
     all subroutines are reachable with the `bl' instruction.  This is
     the default.

     The addressability of a particular object can be set with the
     `model' attribute.

`-mmodel=medium'
     Assume objects may be anywhere in the 32-bit address space (the
     compiler will generate `seth/add3' instructions to load their
     addresses), and assume all subroutines are reachable with the `bl'
     instruction.

`-mmodel=large'
     Assume objects may be anywhere in the 32-bit address space (the
     compiler will generate `seth/add3' instructions to load their
     addresses), and assume subroutines may not be reachable with the
     `bl' instruction (the compiler will generate the much slower
     `seth/add3/jl' instruction sequence).

`-msdata=none'
     Disable use of the small data area.  Variables will be put into
     one of `.data', `bss', or `.rodata' (unless the `section'
     attribute has been specified).  This is the default.

     The small data area consists of sections `.sdata' and `.sbss'.
     Objects may be explicitly put in the small data area with the
     `section' attribute using one of these sections.

`-msdata=sdata'
     Put small global and static data in the small data area, but do not
     generate special code to reference them.

`-msdata=use'
     Put small global and static data in the small data area, and
     generate special instructions to reference them.

`-G NUM'
     Put global and static objects less than or equal to NUM bytes into
     the small data or bss sections instead of the normal data or bss
     sections.  The default value of NUM is 8.  The `-msdata' option
     must be set to one of `sdata' or `use' for this option to have any
     effect.

     All modules should be compiled with the same `-G NUM' value.
     Compiling with different values of NUM may or may not work; if it
     doesn't the linker will give an error message--incorrect code will
     not be generated.

`-mdebug'
     Makes the M32R specific code in the compiler display some
     statistics that might help in debugging programs.

`-malign-loops'
     Align all loops to a 32-byte boundary.

`-mno-align-loops'
     Do not enforce a 32-byte alignment for loops.  This is the default.

`-missue-rate=NUMBER'
     Issue NUMBER instructions per cycle.  NUMBER can only be 1 or 2.

`-mbranch-cost=NUMBER'
     NUMBER can only be 1 or 2.  If it is 1 then branches will be
     preferred over conditional code, if it is 2, then the opposite will
     apply.

`-mflush-trap=NUMBER'
     Specifies the trap number to use to flush the cache.  The default
     is 12.  Valid numbers are between 0 and 15 inclusive.

`-mno-flush-trap'
     Specifies that the cache cannot be flushed by using a trap.

`-mflush-func=NAME'
     Specifies the name of the operating system function to call to
     flush the cache.  The default is __flush_cache_, but a function
     call will only be used if a trap is not available.

`-mno-flush-func'
     Indicates that there is no OS function for flushing the cache.


File: gcc.info,  Node: RS/6000 and PowerPC Options,  Next: Darwin Options,  Prev: M32R/D Options,  Up: Submodel Options

3.17.8 IBM RS/6000 and PowerPC Options
--------------------------------------

These `-m' options are defined for the IBM RS/6000 and PowerPC:
`-mpower'
`-mno-power'
`-mpower2'
`-mno-power2'
`-mpowerpc'
`-mno-powerpc'
`-mpowerpc-gpopt'
`-mno-powerpc-gpopt'
`-mpowerpc-gfxopt'
`-mno-powerpc-gfxopt'
`-mpowerpc64'
`-mno-powerpc64'
     GCC supports two related instruction set architectures for the
     RS/6000 and PowerPC.  The "POWER" instruction set are those
     instructions supported by the `rios' chip set used in the original
     RS/6000 systems and the "PowerPC" instruction set is the
     architecture of the Motorola MPC5xx, MPC6xx, MPC8xx
     microprocessors, and the IBM 4xx microprocessors.

     Neither architecture is a subset of the other.  However there is a
     large common subset of instructions supported by both.  An MQ
     register is included in processors supporting the POWER
     architecture.

     You use these options to specify which instructions are available
     on the processor you are using.  The default value of these
     options is determined when configuring GCC.  Specifying the
     `-mcpu=CPU_TYPE' overrides the specification of these options.  We
     recommend you use the `-mcpu=CPU_TYPE' option rather than the
     options listed above.

     The `-mpower' option allows GCC to generate instructions that are
     found only in the POWER architecture and to use the MQ register.
     Specifying `-mpower2' implies `-power' and also allows GCC to
     generate instructions that are present in the POWER2 architecture
     but not the original POWER architecture.

     The `-mpowerpc' option allows GCC to generate instructions that
     are found only in the 32-bit subset of the PowerPC architecture.
     Specifying `-mpowerpc-gpopt' implies `-mpowerpc' and also allows
     GCC to use the optional PowerPC architecture instructions in the
     General Purpose group, including floating-point square root.
     Specifying `-mpowerpc-gfxopt' implies `-mpowerpc' and also allows
     GCC to use the optional PowerPC architecture instructions in the
     Graphics group, including floating-point select.

     The `-mpowerpc64' option allows GCC to generate the additional
     64-bit instructions that are found in the full PowerPC64
     architecture and to treat GPRs as 64-bit, doubleword quantities.
     GCC defaults to `-mno-powerpc64'.

     If you specify both `-mno-power' and `-mno-powerpc', GCC will use
     only the instructions in the common subset of both architectures
     plus some special AIX common-mode calls, and will not use the MQ
     register.  Specifying both `-mpower' and `-mpowerpc' permits GCC
     to use any instruction from either architecture and to allow use
     of the MQ register; specify this for the Motorola MPC601.

`-mnew-mnemonics'
`-mold-mnemonics'
     Select which mnemonics to use in the generated assembler code.
     With `-mnew-mnemonics', GCC uses the assembler mnemonics defined
     for the PowerPC architecture.  With `-mold-mnemonics' it uses the
     assembler mnemonics defined for the POWER architecture.
     Instructions defined in only one architecture have only one
     mnemonic; GCC uses that mnemonic irrespective of which of these
     options is specified.

     GCC defaults to the mnemonics appropriate for the architecture in
     use.  Specifying `-mcpu=CPU_TYPE' sometimes overrides the value of
     these option.  Unless you are building a cross-compiler, you
     should normally not specify either `-mnew-mnemonics' or
     `-mold-mnemonics', but should instead accept the default.

`-mcpu=CPU_TYPE'
     Set architecture type, register usage, choice of mnemonics, and
     instruction scheduling parameters for machine type CPU_TYPE.
     Supported values for CPU_TYPE are `401', `403', `405', `405fp',
     `440', `440fp', `505', `601', `602', `603', `603e', `604', `604e',
     `620', `630', `740', `7400', `7450', `750', `801', `821', `823',
     `860', `970', `8540', `common', `ec603e', `G3', `G4', `G5',
     `power', `power2', `power3', `power4', `power5', `powerpc',
     `powerpc64', `rios', `rios1', `rios2', `rsc', and `rs64a'.

     `-mcpu=common' selects a completely generic processor.  Code
     generated under this option will run on any POWER or PowerPC
     processor.  GCC will use only the instructions in the common
     subset of both architectures, and will not use the MQ register.
     GCC assumes a generic processor model for scheduling purposes.

     `-mcpu=power', `-mcpu=power2', `-mcpu=powerpc', and
     `-mcpu=powerpc64' specify generic POWER, POWER2, pure 32-bit
     PowerPC (i.e., not MPC601), and 64-bit PowerPC architecture machine
     types, with an appropriate, generic processor model assumed for
     scheduling purposes.

     The other options specify a specific processor.  Code generated
     under those options will run best on that processor, and may not
     run at all on others.

     The `-mcpu' options automatically enable or disable the following
     options: `-maltivec', `-mhard-float', `-mmfcrf', `-mmultiple',
     `-mnew-mnemonics', `-mpower', `-mpower2', `-mpowerpc64',
     `-mpowerpc-gpopt', `-mpowerpc-gfxopt', `-mstring'.  The particular
     options set for any particular CPU will vary between compiler
     versions, depending on what setting seems to produce optimal code
     for that CPU; it doesn't necessarily reflect the actual hardware's
     capabilities.  If you wish to set an individual option to a
     particular value, you may specify it after the `-mcpu' option,
     like `-mcpu=970 -mno-altivec'.

     On AIX, the `-maltivec' and `-mpowerpc64' options are not enabled
     or disabled by the `-mcpu' option at present, since AIX does not
     have full support for these options.  You may still enable or
     disable them individually if you're sure it'll work in your
     environment.

`-mtune=CPU_TYPE'
     Set the instruction scheduling parameters for machine type
     CPU_TYPE, but do not set the architecture type, register usage, or
     choice of mnemonics, as `-mcpu=CPU_TYPE' would.  The same values
     for CPU_TYPE are used for `-mtune' as for `-mcpu'.  If both are
     specified, the code generated will use the architecture,
     registers, and mnemonics set by `-mcpu', but the scheduling
     parameters set by `-mtune'.

`-maltivec'
`-mno-altivec'
     These switches enable or disable the use of built-in functions that
     allow access to the AltiVec instruction set.  You may also need to
     set `-mabi=altivec' to adjust the current ABI with AltiVec ABI
     enhancements.

`-mabi=spe'
     Extend the current ABI with SPE ABI extensions.  This does not
     change the default ABI, instead it adds the SPE ABI extensions to
     the current ABI.

`-mabi=no-spe'
     Disable Booke SPE ABI extensions for the current ABI.

`-misel=YES/NO'
`-misel'
     This switch enables or disables the generation of ISEL
     instructions.

`-mspe=YES/NO'
`-mspe'
     This switch enables or disables the generation of SPE simd
     instructions.

`-mfloat-gprs=YES/NO'
`-mfloat-gprs'
     This switch enables or disables the generation of floating point
     operations on the general purpose registers for architectures that
     support it.  This option is currently only available on the
     MPC8540.

`-mfull-toc'
`-mno-fp-in-toc'
`-mno-sum-in-toc'
`-mminimal-toc'
     Modify generation of the TOC (Table Of Contents), which is created
     for every executable file.  The `-mfull-toc' option is selected by
     default.  In that case, GCC will allocate at least one TOC entry
     for each unique non-automatic variable reference in your program.
     GCC will also place floating-point constants in the TOC.  However,
     only 16,384 entries are available in the TOC.

     If you receive a linker error message that saying you have
     overflowed the available TOC space, you can reduce the amount of
     TOC space used with the `-mno-fp-in-toc' and `-mno-sum-in-toc'
     options.  `-mno-fp-in-toc' prevents GCC from putting floating-point
     constants in the TOC and `-mno-sum-in-toc' forces GCC to generate
     code to calculate the sum of an address and a constant at run-time
     instead of putting that sum into the TOC.  You may specify one or
     both of these options.  Each causes GCC to produce very slightly
     slower and larger code at the expense of conserving TOC space.

     If you still run out of space in the TOC even when you specify
     both of these options, specify `-mminimal-toc' instead.  This
     option causes GCC to make only one TOC entry for every file.  When
     you specify this option, GCC will produce code that is slower and
     larger but which uses extremely little TOC space.  You may wish to
     use this option only on files that contain less frequently
     executed code.

`-maix64'
`-maix32'
     Enable 64-bit AIX ABI and calling convention: 64-bit pointers,
     64-bit `long' type, and the infrastructure needed to support them.
     Specifying `-maix64' implies `-mpowerpc64' and `-mpowerpc', while
     `-maix32' disables the 64-bit ABI and implies `-mno-powerpc64'.
     GCC defaults to `-maix32'.

`-mxl-compat'
`-mno-xl-compat'
     Produce code that conforms more closely to IBM XLC semantics when
     using AIX-compatible ABI.  Pass floating-point arguments to
     prototyped functions beyond the register save area (RSA) on the
     stack in addition to argument FPRs.  Do not assume that most
     significant double in 128 bit long double value is properly
     rounded when comparing values.

     The AIX calling convention was extended but not initially
     documented to handle an obscure K&R C case of calling a function
     that takes the address of its arguments with fewer arguments than
     declared.  AIX XL compilers access floating point arguments which
     do not fit in the RSA from the stack when a subroutine is compiled
     without optimization.  Because always storing floating-point
     arguments on the stack is inefficient and rarely needed, this
     option is not enabled by default and only is necessary when
     calling subroutines compiled by AIX XL compilers without
     optimization.

`-mpe'
     Support "IBM RS/6000 SP" "Parallel Environment" (PE).  Link an
     application written to use message passing with special startup
     code to enable the application to run.  The system must have PE
     installed in the standard location (`/usr/lpp/ppe.poe/'), or the
     `specs' file must be overridden with the `-specs=' option to
     specify the appropriate directory location.  The Parallel
     Environment does not support threads, so the `-mpe' option and the
     `-pthread' option are incompatible.

`-malign-natural'
`-malign-power'
     On AIX, Darwin, and 64-bit PowerPC GNU/Linux, the option
     `-malign-natural' overrides the ABI-defined alignment of larger
     types, such as floating-point doubles, on their natural size-based
     boundary.  The option `-malign-power' instructs GCC to follow the
     ABI-specified alignment rules.  GCC defaults to the standard
     alignment defined in the ABI.

`-msoft-float'
`-mhard-float'
     Generate code that does not use (uses) the floating-point register
     set.  Software floating point emulation is provided if you use the
     `-msoft-float' option, and pass the option to GCC when linking.

`-mmultiple'
`-mno-multiple'
     Generate code that uses (does not use) the load multiple word
     instructions and the store multiple word instructions.  These
     instructions are generated by default on POWER systems, and not
     generated on PowerPC systems.  Do not use `-mmultiple' on little
     endian PowerPC systems, since those instructions do not work when
     the processor is in little endian mode.  The exceptions are PPC740
     and PPC750 which permit the instructions usage in little endian
     mode.

`-mstring'
`-mno-string'
     Generate code that uses (does not use) the load string instructions
     and the store string word instructions to save multiple registers
     and do small block moves.  These instructions are generated by
     default on POWER systems, and not generated on PowerPC systems.
     Do not use `-mstring' on little endian PowerPC systems, since those
     instructions do not work when the processor is in little endian
     mode.  The exceptions are PPC740 and PPC750 which permit the
     instructions usage in little endian mode.

`-mupdate'
`-mno-update'
     Generate code that uses (does not use) the load or store
     instructions that update the base register to the address of the
     calculated memory location.  These instructions are generated by
     default.  If you use `-mno-update', there is a small window
     between the time that the stack pointer is updated and the address
     of the previous frame is stored, which means code that walks the
     stack frame across interrupts or signals may get corrupted data.

`-mfused-madd'
`-mno-fused-madd'
     Generate code that uses (does not use) the floating point multiply
     and accumulate instructions.  These instructions are generated by
     default if hardware floating is used.

`-mno-bit-align'
`-mbit-align'
     On System V.4 and embedded PowerPC systems do not (do) force
     structures and unions that contain bit-fields to be aligned to the
     base type of the bit-field.

     For example, by default a structure containing nothing but 8
     `unsigned' bit-fields of length 1 would be aligned to a 4 byte
     boundary and have a size of 4 bytes.  By using `-mno-bit-align',
     the structure would be aligned to a 1 byte boundary and be one
     byte in size.

`-mno-strict-align'
`-mstrict-align'
     On System V.4 and embedded PowerPC systems do not (do) assume that
     unaligned memory references will be handled by the system.

`-mrelocatable'
`-mno-relocatable'
     On embedded PowerPC systems generate code that allows (does not
     allow) the program to be relocated to a different address at
     runtime.  If you use `-mrelocatable' on any module, all objects
     linked together must be compiled with `-mrelocatable' or
     `-mrelocatable-lib'.

`-mrelocatable-lib'
`-mno-relocatable-lib'
     On embedded PowerPC systems generate code that allows (does not
     allow) the program to be relocated to a different address at
     runtime.  Modules compiled with `-mrelocatable-lib' can be linked
     with either modules compiled without `-mrelocatable' and
     `-mrelocatable-lib' or with modules compiled with the
     `-mrelocatable' options.

`-mno-toc'
`-mtoc'
     On System V.4 and embedded PowerPC systems do not (do) assume that
     register 2 contains a pointer to a global area pointing to the
     addresses used in the program.

`-mlittle'
`-mlittle-endian'
     On System V.4 and embedded PowerPC systems compile code for the
     processor in little endian mode.  The `-mlittle-endian' option is
     the same as `-mlittle'.

`-mbig'
`-mbig-endian'
     On System V.4 and embedded PowerPC systems compile code for the
     processor in big endian mode.  The `-mbig-endian' option is the
     same as `-mbig'.

`-mdynamic-no-pic'
     On Darwin and Mac OS X systems, compile code so that it is not
     relocatable, but that its external references are relocatable.  The
     resulting code is suitable for applications, but not shared
     libraries.

`-mprioritize-restricted-insns=PRIORITY'
     This option controls the priority that is assigned to
     dispatch-slot restricted instructions during the second scheduling
     pass.  The argument PRIORITY takes the value 0/1/2 to assign
     NO/HIGHEST/SECOND-HIGHEST priority to dispatch slot restricted
     instructions.

`-msched-costly-dep=DEPENDENCE_TYPE'
     This option controls which dependences are considered costly by
     the target during instruction scheduling.  The argument
     DEPENDENCE_TYPE takes one of the following values: NO: no
     dependence is costly, ALL: all dependences are costly,
     TRUE_STORE_TO_LOAD: a true dependence from store to load is costly,
     STORE_TO_LOAD: any dependence from store to load is costly,
     NUMBER: any dependence which latency >= NUMBER is costly.

`-minsert-sched-nops=SCHEME'
     This option controls which nop insertion scheme will be used during
     the second scheduling pass. The argument SCHEME takes one of the
     following values: NO: Don't insert nops.  PAD: Pad with nops any
     dispatch group which has vacant issue slots, according to the
     scheduler's grouping.  REGROUP_EXACT: Insert nops to force costly
     dependent insns into separate groups.  Insert exactly as many nops
     as needed to force an insn to a new group, according to the
     estimated processor grouping.  NUMBER: Insert nops to force costly
     dependent insns into separate groups.  Insert NUMBER nops to force
     an insn to a new group.

`-mcall-sysv'
     On System V.4 and embedded PowerPC systems compile code using
     calling conventions that adheres to the March 1995 draft of the
     System V Application Binary Interface, PowerPC processor
     supplement.  This is the default unless you configured GCC using
     `powerpc-*-eabiaix'.

`-mcall-sysv-eabi'
     Specify both `-mcall-sysv' and `-meabi' options.

`-mcall-sysv-noeabi'
     Specify both `-mcall-sysv' and `-mno-eabi' options.

`-mcall-solaris'
     On System V.4 and embedded PowerPC systems compile code for the
     Solaris operating system.

`-mcall-linux'
     On System V.4 and embedded PowerPC systems compile code for the
     Linux-based GNU system.

`-mcall-gnu'
     On System V.4 and embedded PowerPC systems compile code for the
     Hurd-based GNU system.

`-mcall-netbsd'
     On System V.4 and embedded PowerPC systems compile code for the
     NetBSD operating system.

`-maix-struct-return'
     Return all structures in memory (as specified by the AIX ABI).

`-msvr4-struct-return'
     Return structures smaller than 8 bytes in registers (as specified
     by the SVR4 ABI).

`-mabi=altivec'
     Extend the current ABI with AltiVec ABI extensions.  This does not
     change the default ABI, instead it adds the AltiVec ABI extensions
     to the current ABI.

`-mabi=no-altivec'
     Disable AltiVec ABI extensions for the current ABI.

`-mprototype'
`-mno-prototype'
     On System V.4 and embedded PowerPC systems assume that all calls to
     variable argument functions are properly prototyped.  Otherwise,
     the compiler must insert an instruction before every non
     prototyped call to set or clear bit 6 of the condition code
     register (CR) to indicate whether floating point values were
     passed in the floating point registers in case the function takes
     a variable arguments.  With `-mprototype', only calls to
     prototyped variable argument functions will set or clear the bit.

`-msim'
     On embedded PowerPC systems, assume that the startup module is
     called `sim-crt0.o' and that the standard C libraries are
     `libsim.a' and `libc.a'.  This is the default for
     `powerpc-*-eabisim'.  configurations.

`-mmvme'
     On embedded PowerPC systems, assume that the startup module is
     called `crt0.o' and the standard C libraries are `libmvme.a' and
     `libc.a'.

`-mads'
     On embedded PowerPC systems, assume that the startup module is
     called `crt0.o' and the standard C libraries are `libads.a' and
     `libc.a'.

`-myellowknife'
     On embedded PowerPC systems, assume that the startup module is
     called `crt0.o' and the standard C libraries are `libyk.a' and
     `libc.a'.

`-mvxworks'
     On System V.4 and embedded PowerPC systems, specify that you are
     compiling for a VxWorks system.

`-mwindiss'
     Specify that you are compiling for the WindISS simulation
     environment.

`-memb'
     On embedded PowerPC systems, set the PPC_EMB bit in the ELF flags
     header to indicate that `eabi' extended relocations are used.

`-meabi'
`-mno-eabi'
     On System V.4 and embedded PowerPC systems do (do not) adhere to
     the Embedded Applications Binary Interface (eabi) which is a set of
     modifications to the System V.4 specifications.  Selecting `-meabi'
     means that the stack is aligned to an 8 byte boundary, a function
     `__eabi' is called to from `main' to set up the eabi environment,
     and the `-msdata' option can use both `r2' and `r13' to point to
     two separate small data areas.  Selecting `-mno-eabi' means that
     the stack is aligned to a 16 byte boundary, do not call an
     initialization function from `main', and the `-msdata' option will
     only use `r13' to point to a single small data area.  The `-meabi'
     option is on by default if you configured GCC using one of the
     `powerpc*-*-eabi*' options.

`-msdata=eabi'
     On System V.4 and embedded PowerPC systems, put small initialized
     `const' global and static data in the `.sdata2' section, which is
     pointed to by register `r2'.  Put small initialized non-`const'
     global and static data in the `.sdata' section, which is pointed
     to by register `r13'.  Put small uninitialized global and static
     data in the `.sbss' section, which is adjacent to the `.sdata'
     section.  The `-msdata=eabi' option is incompatible with the
     `-mrelocatable' option.  The `-msdata=eabi' option also sets the
     `-memb' option.

`-msdata=sysv'
     On System V.4 and embedded PowerPC systems, put small global and
     static data in the `.sdata' section, which is pointed to by
     register `r13'.  Put small uninitialized global and static data in
     the `.sbss' section, which is adjacent to the `.sdata' section.
     The `-msdata=sysv' option is incompatible with the `-mrelocatable'
     option.

`-msdata=default'
`-msdata'
     On System V.4 and embedded PowerPC systems, if `-meabi' is used,
     compile code the same as `-msdata=eabi', otherwise compile code the
     same as `-msdata=sysv'.

`-msdata-data'
     On System V.4 and embedded PowerPC systems, put small global and
     static data in the `.sdata' section.  Put small uninitialized
     global and static data in the `.sbss' section.  Do not use
     register `r13' to address small data however.  This is the default
     behavior unless other `-msdata' options are used.

`-msdata=none'
`-mno-sdata'
     On embedded PowerPC systems, put all initialized global and static
     data in the `.data' section, and all uninitialized data in the
     `.bss' section.

`-G NUM'
     On embedded PowerPC systems, put global and static items less than
     or equal to NUM bytes into the small data or bss sections instead
     of the normal data or bss section.  By default, NUM is 8.  The `-G
     NUM' switch is also passed to the linker.  All modules should be
     compiled with the same `-G NUM' value.

`-mregnames'
`-mno-regnames'
     On System V.4 and embedded PowerPC systems do (do not) emit
     register names in the assembly language output using symbolic
     forms.

`-mlongcall'
`-mno-longcall'
     Default to making all function calls via pointers, so that
     functions which reside further than 64 megabytes (67,108,864
     bytes) from the current location can be called.  This setting can
     be overridden by the `shortcall' function attribute, or by
     `#pragma longcall(0)'.

     Some linkers are capable of detecting out-of-range calls and
     generating glue code on the fly.  On these systems, long calls are
     unnecessary and generate slower code.  As of this writing, the AIX
     linker can do this, as can the GNU linker for PowerPC/64.  It is
     planned to add this feature to the GNU linker for 32-bit PowerPC
     systems as well.

     On Mach-O (Darwin) systems, this option directs the compiler emit
     to the glue for every direct call, and the Darwin linker decides
     whether to use or discard it.

     In the future, we may cause GCC to ignore all longcall
     specifications when the linker is known to generate glue.

`-pthread'
     Adds support for multithreading with the "pthreads" library.  This
     option sets flags for both the preprocessor and linker.


File: gcc.info,  Node: Darwin Options,  Next: MIPS Options,  Prev: RS/6000 and PowerPC Options,  Up: Submodel Options

3.17.9 Darwin Options
---------------------

These options are defined for all architectures running the Darwin
operating system.  They are useful for compatibility with other Mac OS
compilers.

`-all_load'
     Loads all members of static archive libraries.  See man ld(1) for
     more information.

`-arch_errors_fatal'
     Cause the errors having to do with files that have the wrong
     architecture to be fatal.

`-bind_at_load'
     Causes the output file to be marked such that the dynamic linker
     will bind all undefined references when the file is loaded or
     launched.

`-bundle'
     Produce a Mach-o bundle format file.  See man ld(1) for more
     information.

`-bundle_loader EXECUTABLE'
     This specifies the EXECUTABLE that will be loading the build
     output file being linked. See man ld(1) for more information.

`-allowable_client  CLIENT_NAME'
`-arch_only'
`-client_name'
`-compatibility_version'
`-current_version'
`-dependency-file'
`-dylib_file'
`-dylinker_install_name'
`-dynamic'
`-dynamiclib'
`-exported_symbols_list'
`-filelist'
`-flat_namespace'
`-force_cpusubtype_ALL'
`-force_flat_namespace'
`-headerpad_max_install_names'
`-image_base'
`-init'
`-install_name'
`-keep_private_externs'
`-multi_module'
`-multiply_defined'
`-multiply_defined_unused'
`-noall_load'
`-nofixprebinding'
`-nomultidefs'
`-noprebind'
`-noseglinkedit'
`-pagezero_size'
`-prebind'
`-prebind_all_twolevel_modules'
`-private_bundle'
`-read_only_relocs'
`-sectalign'
`-sectobjectsymbols'
`-whyload'
`-seg1addr'
`-sectcreate'
`-sectobjectsymbols'
`-sectorder'
`-seg_addr_table'
`-seg_addr_table_filename'
`-seglinkedit'
`-segprot'
`-segs_read_only_addr'
`-segs_read_write_addr'
`-single_module'
`-static'
`-sub_library'
`-sub_umbrella'
`-twolevel_namespace'
`-umbrella'
`-undefined'
`-unexported_symbols_list'
`-weak_reference_mismatches'
`-whatsloaded'
     These options are available for Darwin linker. Darwin linker man
     page describes them in detail.

File: gcc.info,  Node: MIPS Options,  Next: i386 and x86-64 Options,  Prev: Darwin Options,  Up: Submodel Options

3.17.10 MIPS Options
--------------------

`-EB'
     Generate big-endian code.

`-EL'
     Generate little-endian code.  This is the default for `mips*el-*-*'
     configurations.

`-march=ARCH'
     Generate code that will run on ARCH, which can be the name of a
     generic MIPS ISA, or the name of a particular processor.  The ISA
     names are: `mips1', `mips2', `mips3', `mips4', `mips32',
     `mips32r2', and `mips64'.  The processor names are: `4kc', `4kp',
     `5kc', `20kc', `m4k', `r2000', `r3000', `r3900', `r4000', `r4400',
     `r4600', `r4650', `r6000', `r8000', `rm7000', `rm9000', `orion',
     `sb1', `vr4100', `vr4111', `vr4120', `vr4300', `vr5000', `vr5400'
     and `vr5500'.  The special value `from-abi' selects the most
     compatible architecture for the selected ABI (that is, `mips1' for
     32-bit ABIs and `mips3' for 64-bit ABIs).

     In processor names, a final `000' can be abbreviated as `k' (for
     example, `-march=r2k').  Prefixes are optional, and `vr' may be
     written `r'.

     GCC defines two macros based on the value of this option.  The
     first is `_MIPS_ARCH', which gives the name of target
     architecture, as a string.  The second has the form
     `_MIPS_ARCH_FOO', where FOO is the capitalized value of
     `_MIPS_ARCH'.  For example, `-march=r2000' will set `_MIPS_ARCH'
     to `"r2000"' and define the macro `_MIPS_ARCH_R2000'.

     Note that the `_MIPS_ARCH' macro uses the processor names given
     above.  In other words, it will have the full prefix and will not
     abbreviate `000' as `k'.  In the case of `from-abi', the macro
     names the resolved architecture (either `"mips1"' or `"mips3"').
     It names the default architecture when no `-march' option is given.

`-mtune=ARCH'
     Optimize for ARCH.  Among other things, this option controls the
     way instructions are scheduled, and the perceived cost of
     arithmetic operations.  The list of ARCH values is the same as for
     `-march'.

     When this option is not used, GCC will optimize for the processor
     specified by `-march'.  By using `-march' and `-mtune' together,
     it is possible to generate code that will run on a family of
     processors, but optimize the code for one particular member of
     that family.

     `-mtune' defines the macros `_MIPS_TUNE' and `_MIPS_TUNE_FOO',
     which work in the same way as the `-march' ones described above.

`-mips1'
     Equivalent to `-march=mips1'.

`-mips2'
     Equivalent to `-march=mips2'.

`-mips3'
     Equivalent to `-march=mips3'.

`-mips4'
     Equivalent to `-march=mips4'.

`-mips32'
     Equivalent to `-march=mips32'.

`-mips32r2'
     Equivalent to `-march=mips32r2'.

`-mips64'
     Equivalent to `-march=mips64'.

`-mips16'
`-mno-mips16'
     Use (do not use) the MIPS16 ISA.

`-mabi=32'
`-mabi=o64'
`-mabi=n32'
`-mabi=64'
`-mabi=eabi'
     Generate code for the given ABI.

     Note that the EABI has a 32-bit and a 64-bit variant.  GCC normally
     generates 64-bit code when you select a 64-bit architecture, but
     you can use `-mgp32' to get 32-bit code instead.

`-mabicalls'
`-mno-abicalls'
     Generate (do not generate) SVR4-style position-independent code.
     `-mabicalls' is the default for SVR4-based systems.

`-mxgot'
`-mno-xgot'
     Lift (do not lift) the usual restrictions on the size of the global
     offset table.

     GCC normally uses a single instruction to load values from the GOT.
     While this is relatively efficient, it will only work if the GOT
     is smaller than about 64k.  Anything larger will cause the linker
     to report an error such as:

          relocation truncated to fit: R_MIPS_GOT16 foobar

     If this happens, you should recompile your code with `-mxgot'.  It
     should then work with very large GOTs, although it will also be
     less efficient, since it will take three instructions to fetch the
     value of a global symbol.

     Note that some linkers can create multiple GOTs.  If you have such
     a linker, you should only need to use `-mxgot' when a single object
     file accesses more than 64k's worth of GOT entries.  Very few do.

     These options have no effect unless GCC is generating position
     independent code.

`-membedded-pic'
`-mno-embedded-pic'
     Generate (do not generate) position-independent code suitable for
     some embedded systems.  All calls are made using PC relative
     addresses, and all data is addressed using the $gp register.  No
     more than 65536 bytes of global data may be used.  This requires
     GNU as and GNU ld, which do most of the work.

`-mgp32'
     Assume that general-purpose registers are 32 bits wide.

`-mgp64'
     Assume that general-purpose registers are 64 bits wide.

`-mfp32'
     Assume that floating-point registers are 32 bits wide.

`-mfp64'
     Assume that floating-point registers are 64 bits wide.

`-mhard-float'
     Use floating-point coprocessor instructions.

`-msoft-float'
     Do not use floating-point coprocessor instructions.  Implement
     floating-point calculations using library calls instead.

`-msingle-float'
     Assume that the floating-point coprocessor only supports
     single-precision operations.

`-mdouble-float'
     Assume that the floating-point coprocessor supports
     double-precision operations.  This is the default.

`-mint64'
     Force `int' and `long' types to be 64 bits wide.  See `-mlong32'
     for an explanation of the default and the way that the pointer
     size is determined.

`-mlong64'
     Force `long' types to be 64 bits wide.  See `-mlong32' for an
     explanation of the default and the way that the pointer size is
     determined.

`-mlong32'
     Force `long', `int', and pointer types to be 32 bits wide.

     The default size of `int's, `long's and pointers depends on the
     ABI.  All the supported ABIs use 32-bit `int's.  The n64 ABI uses
     64-bit `long's, as does the 64-bit EABI; the others use 32-bit
     `long's.  Pointers are the same size as `long's, or the same size
     as integer registers, whichever is smaller.

`-G NUM'
     Put global and static items less than or equal to NUM bytes into
     the small data or bss section instead of the normal data or bss
     section.  This allows the data to be accessed using a single
     instruction.

     All modules should be compiled with the same `-G NUM' value.

`-membedded-data'
`-mno-embedded-data'
     Allocate variables to the read-only data section first if
     possible, then next in the small data section if possible,
     otherwise in data.  This gives slightly slower code than the
     default, but reduces the amount of RAM required when executing,
     and thus may be preferred for some embedded systems.

`-muninit-const-in-rodata'
`-mno-uninit-const-in-rodata'
     Put uninitialized `const' variables in the read-only data section.
     This option is only meaningful in conjunction with
     `-membedded-data'.

`-msplit-addresses'
`-mno-split-addresses'
     Enable (disable) use of the `%hi()' and `%lo()' assembler
     relocation operators.  This option has been superceded by
     `-mexplicit-relocs' but is retained for backwards compatibility.

`-mexplicit-relocs'
`-mno-explicit-relocs'
     Use (do not use) assembler relocation operators when dealing with
     symbolic addresses.  The alternative, selected by
     `-mno-explicit-relocs', is to use assembler macros instead.

     `-mexplicit-relocs' is usually the default if GCC was configured
     to use an assembler that supports relocation operators.  However,
     there are two exceptions:

        * GCC is not yet able to generate explicit relocations for the
          combination of `-mabi=64' and `-mno-abicalls'.  This will be
          addressed in a future release.

        * The combination of `-mabicalls' and `-fno-unit-at-a-time'
          implies `-mno-explicit-relocs' unless explicitly overridden.
          This is because, when generating abicalls, the choice of
          relocation depends on whether a symbol is local or global.
          In some rare cases, GCC will not be able to decide this until
          the whole compilation unit has been read.

`-mrnames'
`-mno-rnames'
     Generate (do not generate) code that refers to registers using
     their software names.  The default is `-mno-rnames', which tells
     GCC to use hardware names like `$4' instead of software names like
     `a0'.  The only assembler known to support `-rnames' is the
     Algorithmics assembler.

`-mcheck-zero-division'
`-mno-check-zero-division'
     Trap (do not trap) on integer division by zero.  The default is
     `-mcheck-zero-division'.

`-mmemcpy'
`-mno-memcpy'
     Force (do not force) the use of `memcpy()' for non-trivial block
     moves.  The default is `-mno-memcpy', which allows GCC to inline
     most constant-sized copies.

`-mlong-calls'
`-mno-long-calls'
     Disable (do not disable) use of the `jal' instruction.  Calling
     functions using `jal' is more efficient but requires the caller
     and callee to be in the same 256 megabyte segment.

     This option has no effect on abicalls code.  The default is
     `-mno-long-calls'.

`-mmad'
`-mno-mad'
     Enable (disable) use of the `mad', `madu' and `mul' instructions,
     as provided by the R4650 ISA.

`-mfused-madd'
`-mno-fused-madd'
     Enable (disable) use of the floating point multiply-accumulate
     instructions, when they are available.  The default is
     `-mfused-madd'.

     When multiply-accumulate instructions are used, the intermediate
     product is calculated to infinite precision and is not subject to
     the FCSR Flush to Zero bit.  This may be undesirable in some
     circumstances.

`-nocpp'
     Tell the MIPS assembler to not run its preprocessor over user
     assembler files (with a `.s' suffix) when assembling them.

`-mfix-sb1'
`-mno-fix-sb1'
     Work around certain SB-1 CPU core errata.  (This flag currently
     works around the SB-1 revision 2 "F1" and "F2" floating point
     errata.)

`-mflush-func=FUNC'
`-mno-flush-func'
     Specifies the function to call to flush the I and D caches, or to
     not call any such function.  If called, the function must take the
     same arguments as the common `_flush_func()', that is, the address
     of the memory range for which the cache is being flushed, the size
     of the memory range, and the number 3 (to flush both caches).  The
     default depends on the target GCC was configured for, but commonly
     is either `_flush_func' or `__cpu_flush'.

`-mbranch-likely'
`-mno-branch-likely'
     Enable or disable use of Branch Likely instructions, regardless of
     the default for the selected architecture.  By default, Branch
     Likely instructions may be generated if they are supported by the
     selected architecture.  An exception is for the MIPS32 and MIPS64
     architectures and processors which implement those architectures;
     for those, Branch Likely instructions will not be generated by
     default because the MIPS32 and MIPS64 architectures specifically
     deprecate their use.

File: gcc.info,  Node: i386 and x86-64 Options,  Next: HPPA Options,  Prev: MIPS Options,  Up: Submodel Options

3.17.11 Intel 386 and AMD x86-64 Options
----------------------------------------

These `-m' options are defined for the i386 and x86-64 family of
computers:

`-mtune=CPU-TYPE'
     Tune to CPU-TYPE everything applicable about the generated code,
     except for the ABI and the set of available instructions.  The
     choices for CPU-TYPE are:
    _i386_
          Original Intel's i386 CPU.

    _i486_
          Intel's i486 CPU.  (No scheduling is implemented for this
          chip.)

    _i586, pentium_
          Intel Pentium CPU with no MMX support.

    _pentium-mmx_
          Intel PentiumMMX CPU based on Pentium core with MMX
          instruction set support.

    _i686, pentiumpro_
          Intel PentiumPro CPU.

    _pentium2_
          Intel Pentium2 CPU based on PentiumPro core with MMX
          instruction set support.

    _pentium3, pentium3m_
          Intel Pentium3 CPU based on PentiumPro core with MMX and SSE
          instruction set support.

    _pentium-m_
          Low power version of Intel Pentium3 CPU with MMX, SSE and
          SSE2 instruction set support.  Used by Centrino notebooks.

    _pentium4, pentium4m_
          Intel Pentium4 CPU with MMX, SSE and SSE2 instruction set
          support.

    _prescott_
          Improved version of Intel Pentium4 CPU with MMX, SSE, SSE2
          and SSE3 instruction set support.

    _nocona_
          Improved version of Intel Pentium4 CPU with 64-bit
          extensions, MMX, SSE, SSE2 and SSE3 instruction set support.

    _k6_
          AMD K6 CPU with MMX instruction set support.

    _k6-2, k6-3_
          Improved versions of AMD K6 CPU with MMX and 3dNOW!
          instruction set support.

    _athlon, athlon-tbird_
          AMD Athlon CPU with MMX, 3dNOW!, enhanced 3dNOW! and SSE
          prefetch instructions support.

    _athlon-4, athlon-xp, athlon-mp_
          Improved AMD Athlon CPU with MMX, 3dNOW!, enhanced 3dNOW! and
          full SSE instruction set support.

    _k8, opteron, athlon64, athlon-fx_
          AMD K8 core based CPUs with x86-64 instruction set support.
          (This supersets MMX, SSE, SSE2, 3dNOW!, enhanced 3dNOW! and
          64-bit instruction set extensions.)

    _winchip-c6_
          IDT Winchip C6 CPU, dealt in same way as i486 with additional
          MMX instruction set support.

    _winchip2_
          IDT Winchip2 CPU, dealt in same way as i486 with additional
          MMX and 3dNOW!  instruction set support.

    _c3_
          Via C3 CPU with MMX and 3dNOW!  instruction set support.  (No
          scheduling is implemented for this chip.)

    _c3-2_
          Via C3-2 CPU with MMX and SSE instruction set support.  (No
          scheduling is implemented for this chip.)

     While picking a specific CPU-TYPE will schedule things
     appropriately for that particular chip, the compiler will not
     generate any code that does not run on the i386 without the
     `-march=CPU-TYPE' option being used.

`-march=CPU-TYPE'
     Generate instructions for the machine type CPU-TYPE.  The choices
     for CPU-TYPE are the same as for `-mtune'.  Moreover, specifying
     `-march=CPU-TYPE' implies `-mtune=CPU-TYPE'.

`-mcpu=CPU-TYPE'
     A deprecated synonym for `-mtune'.

`-m386'
`-m486'
`-mpentium'
`-mpentiumpro'
     These options are synonyms for `-mtune=i386', `-mtune=i486',
     `-mtune=pentium', and `-mtune=pentiumpro' respectively.  These
     synonyms are deprecated.

`-mfpmath=UNIT'
     Generate floating point arithmetics for selected unit UNIT.  The
     choices for UNIT are:

    `387'
          Use the standard 387 floating point coprocessor present
          majority of chips and emulated otherwise.  Code compiled with
          this option will run almost everywhere.  The temporary
          results are computed in 80bit precision instead of precision
          specified by the type resulting in slightly different results
          compared to most of other chips. See `-ffloat-store' for more
          detailed description.

          This is the default choice for i386 compiler.

    `sse'
          Use scalar floating point instructions present in the SSE
          instruction set.  This instruction set is supported by
          Pentium3 and newer chips, in the AMD line by Athlon-4,
          Athlon-xp and Athlon-mp chips.  The earlier version of SSE
          instruction set supports only single precision arithmetics,
          thus the double and extended precision arithmetics is still
          done using 387.  Later version, present only in Pentium4 and
          the future AMD x86-64 chips supports double precision
          arithmetics too.

          For i387 you need to use `-march=CPU-TYPE', `-msse' or
          `-msse2' switches to enable SSE extensions and make this
          option effective.  For x86-64 compiler, these extensions are
          enabled by default.

          The resulting code should be considerably faster in the
          majority of cases and avoid the numerical instability
          problems of 387 code, but may break some existing code that
          expects temporaries to be 80bit.

          This is the default choice for the x86-64 compiler.

    `sse,387'
          Attempt to utilize both instruction sets at once.  This
          effectively double the amount of available registers and on
          chips with separate execution units for 387 and SSE the
          execution resources too.  Use this option with care, as it is
          still experimental, because the GCC register allocator does
          not model separate functional units well resulting in
          instable performance.

`-masm=DIALECT'
     Output asm instructions using selected DIALECT. Supported choices
     are `intel' or `att' (the default one).

`-mieee-fp'
`-mno-ieee-fp'
     Control whether or not the compiler uses IEEE floating point
     comparisons.  These handle correctly the case where the result of a
     comparison is unordered.

`-msoft-float'
     Generate output containing library calls for floating point.
     *Warning:* the requisite libraries are not part of GCC.  Normally
     the facilities of the machine's usual C compiler are used, but
     this can't be done directly in cross-compilation.  You must make
     your own arrangements to provide suitable library functions for
     cross-compilation.

     On machines where a function returns floating point results in the
     80387 register stack, some floating point opcodes may be emitted
     even if `-msoft-float' is used.

`-mno-fp-ret-in-387'
     Do not use the FPU registers for return values of functions.

     The usual calling convention has functions return values of types
     `float' and `double' in an FPU register, even if there is no FPU.
     The idea is that the operating system should emulate an FPU.

     The option `-mno-fp-ret-in-387' causes such values to be returned
     in ordinary CPU registers instead.

`-mno-fancy-math-387'
     Some 387 emulators do not support the `sin', `cos' and `sqrt'
     instructions for the 387.  Specify this option to avoid generating
     those instructions.  This option is the default on FreeBSD,
     OpenBSD and NetBSD.  This option is overridden when `-march'
     indicates that the target cpu will always have an FPU and so the
     instruction will not need emulation.  As of revision 2.6.1, these
     instructions are not generated unless you also use the
     `-funsafe-math-optimizations' switch.

`-malign-double'
`-mno-align-double'
     Control whether GCC aligns `double', `long double', and `long
     long' variables on a two word boundary or a one word boundary.
     Aligning `double' variables on a two word boundary will produce
     code that runs somewhat faster on a `Pentium' at the expense of
     more memory.

     *Warning:* if you use the `-malign-double' switch, structures
     containing the above types will be aligned differently than the
     published application binary interface specifications for the 386
     and will not be binary compatible with structures in code compiled
     without that switch.

`-m96bit-long-double'
`-m128bit-long-double'
     These switches control the size of `long double' type. The i386
     application binary interface specifies the size to be 96 bits, so
     `-m96bit-long-double' is the default in 32 bit mode.

     Modern architectures (Pentium and newer) would prefer `long double'
     to be aligned to an 8 or 16 byte boundary.  In arrays or structures
     conforming to the ABI, this would not be possible.  So specifying a
     `-m128bit-long-double' will align `long double' to a 16 byte
     boundary by padding the `long double' with an additional 32 bit
     zero.

     In the x86-64 compiler, `-m128bit-long-double' is the default
     choice as its ABI specifies that `long double' is to be aligned on
     16 byte boundary.

     Notice that neither of these options enable any extra precision
     over the x87 standard of 80 bits for a `long double'.

     *Warning:* if you override the default value for your target ABI,
     the structures and arrays containing `long double' variables will
     change their size as well as function calling convention for
     function taking `long double' will be modified.  Hence they will
     not be binary compatible with arrays or structures in code
     compiled without that switch.

`-msvr3-shlib'
`-mno-svr3-shlib'
     Control whether GCC places uninitialized local variables into the
     `bss' or `data' segments.  `-msvr3-shlib' places them into `bss'.
     These options are meaningful only on System V Release 3.

`-mrtd'
     Use a different function-calling convention, in which functions
     that take a fixed number of arguments return with the `ret' NUM
     instruction, which pops their arguments while returning.  This
     saves one instruction in the caller since there is no need to pop
     the arguments there.

     You can specify that an individual function is called with this
     calling sequence with the function attribute `stdcall'.  You can
     also override the `-mrtd' option by using the function attribute
     `cdecl'.  *Note Function Attributes::.

     *Warning:* this calling convention is incompatible with the one
     normally used on Unix, so you cannot use it if you need to call
     libraries compiled with the Unix compiler.

     Also, you must provide function prototypes for all functions that
     take variable numbers of arguments (including `printf'); otherwise
     incorrect code will be generated for calls to those functions.

     In addition, seriously incorrect code will result if you call a
     function with too many arguments.  (Normally, extra arguments are
     harmlessly ignored.)

`-mregparm=NUM'
     Control how many registers are used to pass integer arguments.  By
     default, no registers are used to pass arguments, and at most 3
     registers can be used.  You can control this behavior for a
     specific function by using the function attribute `regparm'.
     *Note Function Attributes::.

     *Warning:* if you use this switch, and NUM is nonzero, then you
     must build all modules with the same value, including any
     libraries.  This includes the system libraries and startup modules.

`-mpreferred-stack-boundary=NUM'
     Attempt to keep the stack boundary aligned to a 2 raised to NUM
     byte boundary.  If `-mpreferred-stack-boundary' is not specified,
     the default is 4 (16 bytes or 128 bits), except when optimizing
     for code size (`-Os'), in which case the default is the minimum
     correct alignment (4 bytes for x86, and 8 bytes for x86-64).

     On Pentium and PentiumPro, `double' and `long double' values
     should be aligned to an 8 byte boundary (see `-malign-double') or
     suffer significant run time performance penalties.  On Pentium
     III, the Streaming SIMD Extension (SSE) data type `__m128' suffers
     similar penalties if it is not 16 byte aligned.

     To ensure proper alignment of this values on the stack, the stack
     boundary must be as aligned as that required by any value stored
     on the stack.  Further, every function must be generated such that
     it keeps the stack aligned.  Thus calling a function compiled with
     a higher preferred stack boundary from a function compiled with a
     lower preferred stack boundary will most likely misalign the
     stack.  It is recommended that libraries that use callbacks always
     use the default setting.

     This extra alignment does consume extra stack space, and generally
     increases code size.  Code that is sensitive to stack space usage,
     such as embedded systems and operating system kernels, may want to
     reduce the preferred alignment to `-mpreferred-stack-boundary=2'.

`-mmmx'
`-mno-mmx'

`-msse'
`-mno-sse'

`-msse2'
`-mno-sse2'

`-msse3'
`-mno-sse3'

`-m3dnow'
`-mno-3dnow'
     These switches enable or disable the use of built-in functions
     that allow direct access to the MMX, SSE, SSE2, SSE3 and 3Dnow
     extensions of the instruction set.

     *Note X86 Built-in Functions::, for details of the functions
     enabled and disabled by these switches.

     To have SSE/SSE2 instructions generated automatically from
     floating-point code, see `-mfpmath=sse'.

`-mpush-args'
`-mno-push-args'
     Use PUSH operations to store outgoing parameters.  This method is
     shorter and usually equally fast as method using SUB/MOV
     operations and is enabled by default.  In some cases disabling it
     may improve performance because of improved scheduling and reduced
     dependencies.

`-maccumulate-outgoing-args'
     If enabled, the maximum amount of space required for outgoing
     arguments will be computed in the function prologue.  This is
     faster on most modern CPUs because of reduced dependencies,
     improved scheduling and reduced stack usage when preferred stack
     boundary is not equal to 2.  The drawback is a notable increase in
     code size.  This switch implies `-mno-push-args'.

`-mthreads'
     Support thread-safe exception handling on `Mingw32'.  Code that
     relies on thread-safe exception handling must compile and link all
     code with the `-mthreads' option.  When compiling, `-mthreads'
     defines `-D_MT'; when linking, it links in a special thread helper
     library `-lmingwthrd' which cleans up per thread exception
     handling data.

`-mno-align-stringops'
     Do not align destination of inlined string operations.  This
     switch reduces code size and improves performance in case the
     destination is already aligned, but GCC doesn't know about it.

`-minline-all-stringops'
     By default GCC inlines string operations only when destination is
     known to be aligned at least to 4 byte boundary.  This enables
     more inlining, increase code size, but may improve performance of
     code that depends on fast memcpy, strlen and memset for short
     lengths.

`-momit-leaf-frame-pointer'
     Don't keep the frame pointer in a register for leaf functions.
     This avoids the instructions to save, set up and restore frame
     pointers and makes an extra register available in leaf functions.
     The option `-fomit-frame-pointer' removes the frame pointer for
     all functions which might make debugging harder.

`-mtls-direct-seg-refs'
`-mno-tls-direct-seg-refs'
     Controls whether TLS variables may be accessed with offsets from
     the TLS segment register (`%gs' for 32-bit, `%fs' for 64-bit), or
     whether the thread base pointer must be added.  Whether or not this
     is legal depends on the operating system, and whether it maps the
     segment to cover the entire TLS area.

     For systems that use GNU libc, the default is on.

 These `-m' switches are supported in addition to the above on AMD
x86-64 processors in 64-bit environments.

`-m32'
`-m64'
     Generate code for a 32-bit or 64-bit environment.  The 32-bit
     environment sets int, long and pointer to 32 bits and generates
     code that runs on any i386 system.  The 64-bit environment sets
     int to 32 bits and long and pointer to 64 bits and generates code
     for AMD's x86-64 architecture.

`-mno-red-zone'
     Do not use a so called red zone for x86-64 code.  The red zone is
     mandated by the x86-64 ABI, it is a 128-byte area beyond the
     location of the stack pointer that will not be modified by signal
     or interrupt handlers and therefore can be used for temporary data
     without adjusting the stack pointer.  The flag `-mno-red-zone'
     disables this red zone.

`-mcmodel=small'
     Generate code for the small code model: the program and its
     symbols must be linked in the lower 2 GB of the address space.
     Pointers are 64 bits.  Programs can be statically or dynamically
     linked.  This is the default code model.

`-mcmodel=kernel'
     Generate code for the kernel code model.  The kernel runs in the
     negative 2 GB of the address space.  This model has to be used for
     Linux kernel code.

`-mcmodel=medium'
     Generate code for the medium model: The program is linked in the
     lower 2 GB of the address space but symbols can be located
     anywhere in the address space.  Programs can be statically or
     dynamically linked, but building of shared libraries are not
     supported with the medium model.

`-mcmodel=large'
     Generate code for the large model: This model makes no assumptions
     about addresses and sizes of sections.  Currently GCC does not
     implement this model.

File: gcc.info,  Node: HPPA Options,  Next: Intel 960 Options,  Prev: i386 and x86-64 Options,  Up: Submodel Options

3.17.12 HPPA Options
--------------------

These `-m' options are defined for the HPPA family of computers:

`-march=ARCHITECTURE-TYPE'
     Generate code for the specified architecture.  The choices for
     ARCHITECTURE-TYPE are `1.0' for PA 1.0, `1.1' for PA 1.1, and
     `2.0' for PA 2.0 processors.  Refer to `/usr/lib/sched.models' on
     an HP-UX system to determine the proper architecture option for
     your machine.  Code compiled for lower numbered architectures will
     run on higher numbered architectures, but not the other way around.

     PA 2.0 support currently requires gas snapshot 19990413 or later.
     The next release of binutils (current is 2.9.1) will probably
     contain PA 2.0 support.

`-mpa-risc-1-0'
`-mpa-risc-1-1'
`-mpa-risc-2-0'
     Synonyms for `-march=1.0', `-march=1.1', and `-march=2.0'
     respectively.

`-mbig-switch'
     Generate code suitable for big switch tables.  Use this option
     only if the assembler/linker complain about out of range branches
     within a switch table.

`-mjump-in-delay'
     Fill delay slots of function calls with unconditional jump
     instructions by modifying the return pointer for the function call
     to be the target of the conditional jump.

`-mdisable-fpregs'
     Prevent floating point registers from being used in any manner.
     This is necessary for compiling kernels which perform lazy context
     switching of floating point registers.  If you use this option and
     attempt to perform floating point operations, the compiler will
     abort.

`-mdisable-indexing'
     Prevent the compiler from using indexing address modes.  This
     avoids some rather obscure problems when compiling MIG generated
     code under MACH.

`-mno-space-regs'
     Generate code that assumes the target has no space registers.
     This allows GCC to generate faster indirect calls and use unscaled
     index address modes.

     Such code is suitable for level 0 PA systems and kernels.

`-mfast-indirect-calls'
     Generate code that assumes calls never cross space boundaries.
     This allows GCC to emit code which performs faster indirect calls.

     This option will not work in the presence of shared libraries or
     nested functions.

`-mlong-load-store'
     Generate 3-instruction load and store sequences as sometimes
     required by the HP-UX 10 linker.  This is equivalent to the `+k'
     option to the HP compilers.

`-mportable-runtime'
     Use the portable calling conventions proposed by HP for ELF
     systems.

`-mgas'
     Enable the use of assembler directives only GAS understands.

`-mschedule=CPU-TYPE'
     Schedule code according to the constraints for the machine type
     CPU-TYPE.  The choices for CPU-TYPE are `700' `7100', `7100LC',
     `7200', `7300' and `8000'.  Refer to `/usr/lib/sched.models' on an
     HP-UX system to determine the proper scheduling option for your
     machine.  The default scheduling is `8000'.

`-mlinker-opt'
     Enable the optimization pass in the HP-UX linker.  Note this makes
     symbolic debugging impossible.  It also triggers a bug in the
     HP-UX 8 and HP-UX 9 linkers in which they give bogus error
     messages when linking some programs.

`-msoft-float'
     Generate output containing library calls for floating point.
     *Warning:* the requisite libraries are not available for all HPPA
     targets.  Normally the facilities of the machine's usual C
     compiler are used, but this cannot be done directly in
     cross-compilation.  You must make your own arrangements to provide
     suitable library functions for cross-compilation.  The embedded
     target `hppa1.1-*-pro' does provide software floating point
     support.

     `-msoft-float' changes the calling convention in the output file;
     therefore, it is only useful if you compile _all_ of a program with
     this option.  In particular, you need to compile `libgcc.a', the
     library that comes with GCC, with `-msoft-float' in order for this
     to work.

`-msio'
     Generate the predefine, `_SIO', for server IO.  The default is
     `-mwsio'.  This generates the predefines, `__hp9000s700',
     `__hp9000s700__' and `_WSIO', for workstation IO.  These options
     are available under HP-UX and HI-UX.

`-mgnu-ld'
     Use GNU ld specific options.  This passes `-shared' to ld when
     building a shared library.  It is the default when GCC is
     configured, explicitly or implicitly, with the GNU linker.  This
     option does not have any affect on which ld is called, it only
     changes what parameters are passed to that ld.  The ld that is
     called is determined by the `--with-ld' configure option, GCC's
     program search path, and finally by the user's `PATH'.  The linker
     used by GCC can be printed using `which `gcc
     -print-prog-name=ld`'.  This option is only available on the 64
     bit HP-UX GCC, i.e. configured with `hppa*64*-*-hpux*'.

`-mhp-ld'
     Use HP ld specific options.  This passes `-b' to ld when building
     a shared library and passes `+Accept TypeMismatch' to ld on all
     links.  It is the default when GCC is configured, explicitly or
     implicitly, with the HP linker.  This option does not have any
     affect on which ld is called, it only changes what parameters are
     passed to that ld.  The ld that is called is determined by the
     `--with-ld' configure option, GCC's program search path, and
     finally by the user's `PATH'.  The linker used by GCC can be
     printed using `which `gcc -print-prog-name=ld`'.  This option is
     only available on the 64 bit HP-UX GCC, i.e. configured with
     `hppa*64*-*-hpux*'.

`-mlong-calls'
     Generate code that uses long call sequences.  This ensures that a
     call is always able to reach linker generated stubs.  The default
     is to generate long calls only when the distance from the call
     site to the beginning of the function or translation unit, as the
     case may be, exceeds a predefined limit set by the branch type
     being used.  The limits for normal calls are 7,600,000 and 240,000
     bytes, respectively for the PA 2.0 and PA 1.X architectures.
     Sibcalls are always limited at 240,000 bytes.

     Distances are measured from the beginning of functions when using
     the `-ffunction-sections' option, or when using the `-mgas' and
     `-mno-portable-runtime' options together under HP-UX with the SOM
     linker.

     It is normally not desirable to use this option as it will degrade
     performance.  However, it may be useful in large applications,
     particularly when partial linking is used to build the application.

     The types of long calls used depends on the capabilities of the
     assembler and linker, and the type of code being generated.  The
     impact on systems that support long absolute calls, and long pic
     symbol-difference or pc-relative calls should be relatively small.
     However, an indirect call is used on 32-bit ELF systems in pic code
     and it is quite long.

`-nolibdld'
     Suppress the generation of link options to search libdld.sl when
     the `-static' option is specified on HP-UX 10 and later.

`-static'
     The HP-UX implementation of setlocale in libc has a dependency on
     libdld.sl.  There isn't an archive version of libdld.sl.  Thus,
     when the `-static' option is specified, special link options are
     needed to resolve this dependency.

     On HP-UX 10 and later, the GCC driver adds the necessary options to
     link with libdld.sl when the `-static' option is specified.  This
     causes the resulting binary to be dynamic.  On the 64-bit port,
     the linkers generate dynamic binaries by default in any case.  The
     `-nolibdld' option can be used to prevent the GCC driver from
     adding these link options.

`-threads'
     Add support for multithreading with the "dce thread" library under
     HP-UX.  This option sets flags for both the preprocessor and
     linker.

File: gcc.info,  Node: Intel 960 Options,  Next: DEC Alpha Options,  Prev: HPPA Options,  Up: Submodel Options

3.17.13 Intel 960 Options
-------------------------

These `-m' options are defined for the Intel 960 implementations:

`-mCPU-TYPE'
     Assume the defaults for the machine type CPU-TYPE for some of the
     other options, including instruction scheduling, floating point
     support, and addressing modes.  The choices for CPU-TYPE are `ka',
     `kb', `mc', `ca', `cf', `sa', and `sb'.  The default is `kb'.

`-mnumerics'
`-msoft-float'
     The `-mnumerics' option indicates that the processor does support
     floating-point instructions.  The `-msoft-float' option indicates
     that floating-point support should not be assumed.

`-mleaf-procedures'
`-mno-leaf-procedures'
     Do (or do not) attempt to alter leaf procedures to be callable
     with the `bal' instruction as well as `call'.  This will result in
     more efficient code for explicit calls when the `bal' instruction
     can be substituted by the assembler or linker, but less efficient
     code in other cases, such as calls via function pointers, or using
     a linker that doesn't support this optimization.

`-mtail-call'
`-mno-tail-call'
     Do (or do not) make additional attempts (beyond those of the
     machine-independent portions of the compiler) to optimize
     tail-recursive calls into branches.  You may not want to do this
     because the detection of cases where this is not valid is not
     totally complete.  The default is `-mno-tail-call'.

`-mcomplex-addr'
`-mno-complex-addr'
     Assume (or do not assume) that the use of a complex addressing
     mode is a win on this implementation of the i960.  Complex
     addressing modes may not be worthwhile on the K-series, but they
     definitely are on the C-series.  The default is currently
     `-mcomplex-addr' for all processors except the CB and CC.

`-mcode-align'
`-mno-code-align'
     Align code to 8-byte boundaries for faster fetching (or don't
     bother).  Currently turned on by default for C-series
     implementations only.

`-mic-compat'
`-mic2.0-compat'
`-mic3.0-compat'
     Enable compatibility with iC960 v2.0 or v3.0.

`-masm-compat'
`-mintel-asm'
     Enable compatibility with the iC960 assembler.

`-mstrict-align'
`-mno-strict-align'
     Do not permit (do permit) unaligned accesses.

`-mold-align'
     Enable structure-alignment compatibility with Intel's gcc release
     version 1.3 (based on gcc 1.37).  This option implies
     `-mstrict-align'.

`-mlong-double-64'
     Implement type `long double' as 64-bit floating point numbers.
     Without the option `long double' is implemented by 80-bit floating
     point numbers.  The only reason we have it because there is no
     128-bit `long double' support in `fp-bit.c' yet.  So it is only
     useful for people using soft-float targets.  Otherwise, we should
     recommend against use of it.


File: gcc.info,  Node: DEC Alpha Options,  Next: DEC Alpha/VMS Options,  Prev: Intel 960 Options,  Up: Submodel Options

3.17.14 DEC Alpha Options
-------------------------

These `-m' options are defined for the DEC Alpha implementations:

`-mno-soft-float'
`-msoft-float'
     Use (do not use) the hardware floating-point instructions for
     floating-point operations.  When `-msoft-float' is specified,
     functions in `libgcc.a' will be used to perform floating-point
     operations.  Unless they are replaced by routines that emulate the
     floating-point operations, or compiled in such a way as to call
     such emulations routines, these routines will issue floating-point
     operations.   If you are compiling for an Alpha without
     floating-point operations, you must ensure that the library is
     built so as not to call them.

     Note that Alpha implementations without floating-point operations
     are required to have floating-point registers.

`-mfp-reg'
`-mno-fp-regs'
     Generate code that uses (does not use) the floating-point register
     set.  `-mno-fp-regs' implies `-msoft-float'.  If the floating-point
     register set is not used, floating point operands are passed in
     integer registers as if they were integers and floating-point
     results are passed in `$0' instead of `$f0'.  This is a
     non-standard calling sequence, so any function with a
     floating-point argument or return value called by code compiled
     with `-mno-fp-regs' must also be compiled with that option.

     A typical use of this option is building a kernel that does not
     use, and hence need not save and restore, any floating-point
     registers.

`-mieee'
     The Alpha architecture implements floating-point hardware
     optimized for maximum performance.  It is mostly compliant with
     the IEEE floating point standard.  However, for full compliance,
     software assistance is required.  This option generates code fully
     IEEE compliant code _except_ that the INEXACT-FLAG is not
     maintained (see below).  If this option is turned on, the
     preprocessor macro `_IEEE_FP' is defined during compilation.  The
     resulting code is less efficient but is able to correctly support
     denormalized numbers and exceptional IEEE values such as
     not-a-number and plus/minus infinity.  Other Alpha compilers call
     this option `-ieee_with_no_inexact'.

`-mieee-with-inexact'
     This is like `-mieee' except the generated code also maintains the
     IEEE INEXACT-FLAG.  Turning on this option causes the generated
     code to implement fully-compliant IEEE math.  In addition to
     `_IEEE_FP', `_IEEE_FP_EXACT' is defined as a preprocessor macro.
     On some Alpha implementations the resulting code may execute
     significantly slower than the code generated by default.  Since
     there is very little code that depends on the INEXACT-FLAG, you
     should normally not specify this option.  Other Alpha compilers
     call this option `-ieee_with_inexact'.

`-mfp-trap-mode=TRAP-MODE'
     This option controls what floating-point related traps are enabled.
     Other Alpha compilers call this option `-fptm TRAP-MODE'.  The
     trap mode can be set to one of four values:

    `n'
          This is the default (normal) setting.  The only traps that
          are enabled are the ones that cannot be disabled in software
          (e.g., division by zero trap).

    `u'
          In addition to the traps enabled by `n', underflow traps are
          enabled as well.

    `su'
          Like `su', but the instructions are marked to be safe for
          software completion (see Alpha architecture manual for
          details).

    `sui'
          Like `su', but inexact traps are enabled as well.

`-mfp-rounding-mode=ROUNDING-MODE'
     Selects the IEEE rounding mode.  Other Alpha compilers call this
     option `-fprm ROUNDING-MODE'.  The ROUNDING-MODE can be one of:

    `n'
          Normal IEEE rounding mode.  Floating point numbers are
          rounded towards the nearest machine number or towards the
          even machine number in case of a tie.

    `m'
          Round towards minus infinity.

    `c'
          Chopped rounding mode.  Floating point numbers are rounded
          towards zero.

    `d'
          Dynamic rounding mode.  A field in the floating point control
          register (FPCR, see Alpha architecture reference manual)
          controls the rounding mode in effect.  The C library
          initializes this register for rounding towards plus infinity.
          Thus, unless your program modifies the FPCR, `d' corresponds
          to round towards plus infinity.

`-mtrap-precision=TRAP-PRECISION'
     In the Alpha architecture, floating point traps are imprecise.
     This means without software assistance it is impossible to recover
     from a floating trap and program execution normally needs to be
     terminated.  GCC can generate code that can assist operating
     system trap handlers in determining the exact location that caused
     a floating point trap.  Depending on the requirements of an
     application, different levels of precisions can be selected:

    `p'
          Program precision.  This option is the default and means a
          trap handler can only identify which program caused a
          floating point exception.

    `f'
          Function precision.  The trap handler can determine the
          function that caused a floating point exception.

    `i'
          Instruction precision.  The trap handler can determine the
          exact instruction that caused a floating point exception.

     Other Alpha compilers provide the equivalent options called
     `-scope_safe' and `-resumption_safe'.

`-mieee-conformant'
     This option marks the generated code as IEEE conformant.  You must
     not use this option unless you also specify `-mtrap-precision=i'
     and either `-mfp-trap-mode=su' or `-mfp-trap-mode=sui'.  Its only
     effect is to emit the line `.eflag 48' in the function prologue of
     the generated assembly file.  Under DEC Unix, this has the effect
     that IEEE-conformant math library routines will be linked in.

`-mbuild-constants'
     Normally GCC examines a 32- or 64-bit integer constant to see if
     it can construct it from smaller constants in two or three
     instructions.  If it cannot, it will output the constant as a
     literal and generate code to load it from the data segment at
     runtime.

     Use this option to require GCC to construct _all_ integer constants
     using code, even if it takes more instructions (the maximum is
     six).

     You would typically use this option to build a shared library
     dynamic loader.  Itself a shared library, it must relocate itself
     in memory before it can find the variables and constants in its
     own data segment.

`-malpha-as'
`-mgas'
     Select whether to generate code to be assembled by the
     vendor-supplied assembler (`-malpha-as') or by the GNU assembler
     `-mgas'.

`-mbwx'
`-mno-bwx'
`-mcix'
`-mno-cix'
`-mfix'
`-mno-fix'
`-mmax'
`-mno-max'
     Indicate whether GCC should generate code to use the optional BWX,
     CIX, FIX and MAX instruction sets.  The default is to use the
     instruction sets supported by the CPU type specified via `-mcpu='
     option or that of the CPU on which GCC was built if none was
     specified.

`-mfloat-vax'
`-mfloat-ieee'
     Generate code that uses (does not use) VAX F and G floating point
     arithmetic instead of IEEE single and double precision.

`-mexplicit-relocs'
`-mno-explicit-relocs'
     Older Alpha assemblers provided no way to generate symbol
     relocations except via assembler macros.  Use of these macros does
     not allow optimal instruction scheduling.  GNU binutils as of
     version 2.12 supports a new syntax that allows the compiler to
     explicitly mark which relocations should apply to which
     instructions.  This option is mostly useful for debugging, as GCC
     detects the capabilities of the assembler when it is built and
     sets the default accordingly.

`-msmall-data'
`-mlarge-data'
     When `-mexplicit-relocs' is in effect, static data is accessed via
     "gp-relative" relocations.  When `-msmall-data' is used, objects 8
     bytes long or smaller are placed in a "small data area" (the
     `.sdata' and `.sbss' sections) and are accessed via 16-bit
     relocations off of the `$gp' register.  This limits the size of
     the small data area to 64KB, but allows the variables to be
     directly accessed via a single instruction.

     The default is `-mlarge-data'.  With this option the data area is
     limited to just below 2GB.  Programs that require more than 2GB of
     data must use `malloc' or `mmap' to allocate the data in the heap
     instead of in the program's data segment.

     When generating code for shared libraries, `-fpic' implies
     `-msmall-data' and `-fPIC' implies `-mlarge-data'.

`-msmall-text'
`-mlarge-text'
     When `-msmall-text' is used, the compiler assumes that the code of
     the entire program (or shared library) fits in 4MB, and is thus
     reachable with a branch instruction.  When `-msmall-data' is used,
     the compiler can assume that all local symbols share the same
     `$gp' value, and thus reduce the number of instructions required
     for a function call from 4 to 1.

     The default is `-mlarge-text'.

`-mcpu=CPU_TYPE'
     Set the instruction set and instruction scheduling parameters for
     machine type CPU_TYPE.  You can specify either the `EV' style name
     or the corresponding chip number.  GCC supports scheduling
     parameters for the EV4, EV5 and EV6 family of processors and will
     choose the default values for the instruction set from the
     processor you specify.  If you do not specify a processor type,
     GCC will default to the processor on which the compiler was built.

     Supported values for CPU_TYPE are

    `ev4'
    `ev45'
    `21064'
          Schedules as an EV4 and has no instruction set extensions.

    `ev5'
    `21164'
          Schedules as an EV5 and has no instruction set extensions.

    `ev56'
    `21164a'
          Schedules as an EV5 and supports the BWX extension.

    `pca56'
    `21164pc'
    `21164PC'
          Schedules as an EV5 and supports the BWX and MAX extensions.

    `ev6'
    `21264'
          Schedules as an EV6 and supports the BWX, FIX, and MAX
          extensions.

    `ev67'
    `21264a'
          Schedules as an EV6 and supports the BWX, CIX, FIX, and MAX
          extensions.

`-mtune=CPU_TYPE'
     Set only the instruction scheduling parameters for machine type
     CPU_TYPE.  The instruction set is not changed.

`-mmemory-latency=TIME'
     Sets the latency the scheduler should assume for typical memory
     references as seen by the application.  This number is highly
     dependent on the memory access patterns used by the application
     and the size of the external cache on the machine.

     Valid options for TIME are

    `NUMBER'
          A decimal number representing clock cycles.

    `L1'
    `L2'
    `L3'
    `main'
          The compiler contains estimates of the number of clock cycles
          for "typical" EV4 & EV5 hardware for the Level 1, 2 & 3 caches
          (also called Dcache, Scache, and Bcache), as well as to main
          memory.  Note that L3 is only valid for EV5.


File: gcc.info,  Node: DEC Alpha/VMS Options,  Next: H8/300 Options,  Prev: DEC Alpha Options,  Up: Submodel Options

3.17.15 DEC Alpha/VMS Options
-----------------------------

These `-m' options are defined for the DEC Alpha/VMS implementations:

`-mvms-return-codes'
     Return VMS condition codes from main.  The default is to return
     POSIX style condition (e.g. error) codes.

File: gcc.info,  Node: H8/300 Options,  Next: SH Options,  Prev: DEC Alpha/VMS Options,  Up: Submodel Options

3.17.16 H8/300 Options
----------------------

These `-m' options are defined for the H8/300 implementations:

`-mrelax'
     Shorten some address references at link time, when possible; uses
     the linker option `-relax'.  *Note `ld' and the H8/300:
     (ld)H8/300, for a fuller description.

`-mh'
     Generate code for the H8/300H.

`-ms'
     Generate code for the H8S.

`-mn'
     Generate code for the H8S and H8/300H in the normal mode.  This
     switch must be used either with -mh or -ms.

`-ms2600'
     Generate code for the H8S/2600.  This switch must be used with
     `-ms'.

`-mint32'
     Make `int' data 32 bits by default.

`-malign-300'
     On the H8/300H and H8S, use the same alignment rules as for the
     H8/300.  The default for the H8/300H and H8S is to align longs and
     floats on 4 byte boundaries.  `-malign-300' causes them to be
     aligned on 2 byte boundaries.  This option has no effect on the
     H8/300.

File: gcc.info,  Node: SH Options,  Next: System V Options,  Prev: H8/300 Options,  Up: Submodel Options

3.17.17 SH Options
------------------

These `-m' options are defined for the SH implementations:

`-m1'
     Generate code for the SH1.

`-m2'
     Generate code for the SH2.

`-m2e'
     Generate code for the SH2e.

`-m3'
     Generate code for the SH3.

`-m3e'
     Generate code for the SH3e.

`-m4-nofpu'
     Generate code for the SH4 without a floating-point unit.

`-m4-single-only'
     Generate code for the SH4 with a floating-point unit that only
     supports single-precision arithmetic.

`-m4-single'
     Generate code for the SH4 assuming the floating-point unit is in
     single-precision mode by default.

`-m4'
     Generate code for the SH4.

`-mb'
     Compile code for the processor in big endian mode.

`-ml'
     Compile code for the processor in little endian mode.

`-mdalign'
     Align doubles at 64-bit boundaries.  Note that this changes the
     calling conventions, and thus some functions from the standard C
     library will not work unless you recompile it first with
     `-mdalign'.

`-mrelax'
     Shorten some address references at link time, when possible; uses
     the linker option `-relax'.

`-mbigtable'
     Use 32-bit offsets in `switch' tables.  The default is to use
     16-bit offsets.

`-mfmovd'
     Enable the use of the instruction `fmovd'.

`-mhitachi'
     Comply with the calling conventions defined by Renesas.

`-mnomacsave'
     Mark the `MAC' register as call-clobbered, even if `-mhitachi' is
     given.

`-mieee'
     Increase IEEE-compliance of floating-point code.

`-misize'
     Dump instruction size and location in the assembly code.

`-mpadstruct'
     This option is deprecated.  It pads structures to multiple of 4
     bytes, which is incompatible with the SH ABI.

`-mspace'
     Optimize for space instead of speed.  Implied by `-Os'.

`-mprefergot'
     When generating position-independent code, emit function calls
     using the Global Offset Table instead of the Procedure Linkage
     Table.

`-musermode'
     Generate a library function call to invalidate instruction cache
     entries, after fixing up a trampoline.  This library function call
     doesn't assume it can write to the whole memory address space.
     This is the default when the target is `sh-*-linux*'.

File: gcc.info,  Node: System V Options,  Next: TMS320C3x/C4x Options,  Prev: SH Options,  Up: Submodel Options

3.17.18 Options for System V
----------------------------

These additional options are available on System V Release 4 for
compatibility with other compilers on those systems:

`-G'
     Create a shared object.  It is recommended that `-symbolic' or
     `-shared' be used instead.

`-Qy'
     Identify the versions of each tool used by the compiler, in a
     `.ident' assembler directive in the output.

`-Qn'
     Refrain from adding `.ident' directives to the output file (this is
     the default).

`-YP,DIRS'
     Search the directories DIRS, and no others, for libraries
     specified with `-l'.

`-Ym,DIR'
     Look in the directory DIR to find the M4 preprocessor.  The
     assembler uses this option.

File: gcc.info,  Node: TMS320C3x/C4x Options,  Next: V850 Options,  Prev: System V Options,  Up: Submodel Options

3.17.19 TMS320C3x/C4x Options
-----------------------------

These `-m' options are defined for TMS320C3x/C4x implementations:

`-mcpu=CPU_TYPE'
     Set the instruction set, register set, and instruction scheduling
     parameters for machine type CPU_TYPE.  Supported values for
     CPU_TYPE are `c30', `c31', `c32', `c40', and `c44'.  The default
     is `c40' to generate code for the TMS320C40.

`-mbig-memory'
`-mbig'
`-msmall-memory'
`-msmall'
     Generates code for the big or small memory model.  The small memory
     model assumed that all data fits into one 64K word page.  At
     run-time the data page (DP) register must be set to point to the
     64K page containing the .bss and .data program sections.  The big
     memory model is the default and requires reloading of the DP
     register for every direct memory access.

`-mbk'
`-mno-bk'
     Allow (disallow) allocation of general integer operands into the
     block count register BK.

`-mdb'
`-mno-db'
     Enable (disable) generation of code using decrement and branch,
     DBcond(D), instructions.  This is enabled by default for the C4x.
     To be on the safe side, this is disabled for the C3x, since the
     maximum iteration count on the C3x is 2^23 + 1 (but who iterates
     loops more than 2^23 times on the C3x?).  Note that GCC will try
     to reverse a loop so that it can utilize the decrement and branch
     instruction, but will give up if there is more than one memory
     reference in the loop.  Thus a loop where the loop counter is
     decremented can generate slightly more efficient code, in cases
     where the RPTB instruction cannot be utilized.

`-mdp-isr-reload'
`-mparanoid'
     Force the DP register to be saved on entry to an interrupt service
     routine (ISR), reloaded to point to the data section, and restored
     on exit from the ISR.  This should not be required unless someone
     has violated the small memory model by modifying the DP register,
     say within an object library.

`-mmpyi'
`-mno-mpyi'
     For the C3x use the 24-bit MPYI instruction for integer multiplies
     instead of a library call to guarantee 32-bit results.  Note that
     if one of the operands is a constant, then the multiplication will
     be performed using shifts and adds.  If the `-mmpyi' option is not
     specified for the C3x, then squaring operations are performed
     inline instead of a library call.

`-mfast-fix'
`-mno-fast-fix'
     The C3x/C4x FIX instruction to convert a floating point value to an
     integer value chooses the nearest integer less than or equal to the
     floating point value rather than to the nearest integer.  Thus if
     the floating point number is negative, the result will be
     incorrectly truncated an additional code is necessary to detect
     and correct this case.  This option can be used to disable
     generation of the additional code required to correct the result.

`-mrptb'
`-mno-rptb'
     Enable (disable) generation of repeat block sequences using the
     RPTB instruction for zero overhead looping.  The RPTB construct is
     only used for innermost loops that do not call functions or jump
     across the loop boundaries.  There is no advantage having nested
     RPTB loops due to the overhead required to save and restore the
     RC, RS, and RE registers.  This is enabled by default with `-O2'.

`-mrpts=COUNT'
`-mno-rpts'
     Enable (disable) the use of the single instruction repeat
     instruction RPTS.  If a repeat block contains a single
     instruction, and the loop count can be guaranteed to be less than
     the value COUNT, GCC will emit a RPTS instruction instead of a
     RPTB.  If no value is specified, then a RPTS will be emitted even
     if the loop count cannot be determined at compile time.  Note that
     the repeated instruction following RPTS does not have to be
     reloaded from memory each iteration, thus freeing up the CPU buses
     for operands.  However, since interrupts are blocked by this
     instruction, it is disabled by default.

`-mloop-unsigned'
`-mno-loop-unsigned'
     The maximum iteration count when using RPTS and RPTB (and DB on
     the C40) is 2^31 + 1 since these instructions test if the
     iteration count is negative to terminate the loop.  If the
     iteration count is unsigned there is a possibility than the 2^31 +
     1 maximum iteration count may be exceeded.  This switch allows an
     unsigned iteration count.

`-mti'
     Try to emit an assembler syntax that the TI assembler (asm30) is
     happy with.  This also enforces compatibility with the API
     employed by the TI C3x C compiler.  For example, long doubles are
     passed as structures rather than in floating point registers.

`-mregparm'
`-mmemparm'
     Generate code that uses registers (stack) for passing arguments to
     functions.  By default, arguments are passed in registers where
     possible rather than by pushing arguments on to the stack.

`-mparallel-insns'
`-mno-parallel-insns'
     Allow the generation of parallel instructions.  This is enabled by
     default with `-O2'.

`-mparallel-mpy'
`-mno-parallel-mpy'
     Allow the generation of MPY||ADD and MPY||SUB parallel
     instructions, provided `-mparallel-insns' is also specified.
     These instructions have tight register constraints which can
     pessimize the code generation of large functions.


File: gcc.info,  Node: V850 Options,  Next: ARC Options,  Prev: TMS320C3x/C4x Options,  Up: Submodel Options

3.17.20 V850 Options
--------------------

These `-m' options are defined for V850 implementations:

`-mlong-calls'
`-mno-long-calls'
     Treat all calls as being far away (near).  If calls are assumed to
     be far away, the compiler will always load the functions address
     up into a register, and call indirect through the pointer.

`-mno-ep'
`-mep'
     Do not optimize (do optimize) basic blocks that use the same index
     pointer 4 or more times to copy pointer into the `ep' register, and
     use the shorter `sld' and `sst' instructions.  The `-mep' option
     is on by default if you optimize.

`-mno-prolog-function'
`-mprolog-function'
     Do not use (do use) external functions to save and restore
     registers at the prologue and epilogue of a function.  The
     external functions are slower, but use less code space if more
     than one function saves the same number of registers.  The
     `-mprolog-function' option is on by default if you optimize.

`-mspace'
     Try to make the code as small as possible.  At present, this just
     turns on the `-mep' and `-mprolog-function' options.

`-mtda=N'
     Put static or global variables whose size is N bytes or less into
     the tiny data area that register `ep' points to.  The tiny data
     area can hold up to 256 bytes in total (128 bytes for byte
     references).

`-msda=N'
     Put static or global variables whose size is N bytes or less into
     the small data area that register `gp' points to.  The small data
     area can hold up to 64 kilobytes.

`-mzda=N'
     Put static or global variables whose size is N bytes or less into
     the first 32 kilobytes of memory.

`-mv850'
     Specify that the target processor is the V850.

`-mbig-switch'
     Generate code suitable for big switch tables.  Use this option
     only if the assembler/linker complain about out of range branches
     within a switch table.

`-mapp-regs'
     This option will cause r2 and r5 to be used in the code generated
     by the compiler.  This setting is the default.

`-mno-app-regs'
     This option will cause r2 and r5 to be treated as fixed registers.

`-mv850e1'
     Specify that the target processor is the V850E1.  The preprocessor
     constants `__v850e1__' and `__v850e__' will be defined if this
     option is used.

`-mv850e'
     Specify that the target processor is the V850E.  The preprocessor
     constant `__v850e__' will be defined if this option is used.

     If neither `-mv850' nor `-mv850e' nor `-mv850e1' are defined then
     a default target processor will be chosen and the relevant
     `__v850*__' preprocessor constant will be defined.

     The preprocessor constants `__v850' and `__v851__' are always
     defined, regardless of which processor variant is the target.

`-mdisable-callt'
     This option will suppress generation of the CALLT instruction for
     the v850e and v850e1 flavors of the v850 architecture.  The
     default is `-mno-disable-callt' which allows the CALLT instruction
     to be used.


File: gcc.info,  Node: ARC Options,  Next: NS32K Options,  Prev: V850 Options,  Up: Submodel Options

3.17.21 ARC Options
-------------------

These options are defined for ARC implementations:

`-EL'
     Compile code for little endian mode.  This is the default.

`-EB'
     Compile code for big endian mode.

`-mmangle-cpu'
     Prepend the name of the cpu to all public symbol names.  In
     multiple-processor systems, there are many ARC variants with
     different instruction and register set characteristics.  This flag
     prevents code compiled for one cpu to be linked with code compiled
     for another.  No facility exists for handling variants that are
     "almost identical".  This is an all or nothing option.

`-mcpu=CPU'
     Compile code for ARC variant CPU.  Which variants are supported
     depend on the configuration.  All variants support `-mcpu=base',
     this is the default.

`-mtext=TEXT-SECTION'
`-mdata=DATA-SECTION'
`-mrodata=READONLY-DATA-SECTION'
     Put functions, data, and readonly data in TEXT-SECTION,
     DATA-SECTION, and READONLY-DATA-SECTION respectively by default.
     This can be overridden with the `section' attribute.  *Note
     Variable Attributes::.


File: gcc.info,  Node: NS32K Options,  Next: AVR Options,  Prev: ARC Options,  Up: Submodel Options

3.17.22 NS32K Options
---------------------

These are the `-m' options defined for the 32000 series.  The default
values for these options depends on which style of 32000 was selected
when the compiler was configured; the defaults for the most common
choices are given below.

`-m32032'
`-m32032'
     Generate output for a 32032.  This is the default when the
     compiler is configured for 32032 and 32016 based systems.

`-m32332'
`-m32332'
     Generate output for a 32332.  This is the default when the
     compiler is configured for 32332-based systems.

`-m32532'
`-m32532'
     Generate output for a 32532.  This is the default when the
     compiler is configured for 32532-based systems.

`-m32081'
     Generate output containing 32081 instructions for floating point.
     This is the default for all systems.

`-m32381'
     Generate output containing 32381 instructions for floating point.
     This also implies `-m32081'.  The 32381 is only compatible with
     the 32332 and 32532 cpus.  This is the default for the
     pc532-netbsd configuration.

`-mmulti-add'
     Try and generate multiply-add floating point instructions `polyF'
     and `dotF'.  This option is only available if the `-m32381' option
     is in effect.  Using these instructions requires changes to
     register allocation which generally has a negative impact on
     performance.  This option should only be enabled when compiling
     code particularly likely to make heavy use of multiply-add
     instructions.

`-mnomulti-add'
     Do not try and generate multiply-add floating point instructions
     `polyF' and `dotF'.  This is the default on all platforms.

`-msoft-float'
     Generate output containing library calls for floating point.
     *Warning:* the requisite libraries may not be available.

`-mieee-compare'
`-mno-ieee-compare'
     Control whether or not the compiler uses IEEE floating point
     comparisons.  These handle correctly the case where the result of a
     comparison is unordered.  *Warning:* the requisite kernel support
     may not be available.

`-mnobitfield'
     Do not use the bit-field instructions.  On some machines it is
     faster to use shifting and masking operations.  This is the
     default for the pc532.

`-mbitfield'
     Do use the bit-field instructions.  This is the default for all
     platforms except the pc532.

`-mrtd'
     Use a different function-calling convention, in which functions
     that take a fixed number of arguments return pop their arguments
     on return with the `ret' instruction.

     This calling convention is incompatible with the one normally used
     on Unix, so you cannot use it if you need to call libraries
     compiled with the Unix compiler.

     Also, you must provide function prototypes for all functions that
     take variable numbers of arguments (including `printf'); otherwise
     incorrect code will be generated for calls to those functions.

     In addition, seriously incorrect code will result if you call a
     function with too many arguments.  (Normally, extra arguments are
     harmlessly ignored.)

     This option takes its name from the 680x0 `rtd' instruction.

`-mregparam'
     Use a different function-calling convention where the first two
     arguments are passed in registers.

     This calling convention is incompatible with the one normally used
     on Unix, so you cannot use it if you need to call libraries
     compiled with the Unix compiler.

`-mnoregparam'
     Do not pass any arguments in registers.  This is the default for
     all targets.

`-msb'
     It is OK to use the sb as an index register which is always loaded
     with zero.  This is the default for the pc532-netbsd target.

`-mnosb'
     The sb register is not available for use or has not been
     initialized to zero by the run time system.  This is the default
     for all targets except the pc532-netbsd.  It is also implied
     whenever `-mhimem' or `-fpic' is set.

`-mhimem'
     Many ns32000 series addressing modes use displacements of up to
     512MB.  If an address is above 512MB then displacements from zero
     can not be used.  This option causes code to be generated which
     can be loaded above 512MB.  This may be useful for operating
     systems or ROM code.

`-mnohimem'
     Assume code will be loaded in the first 512MB of virtual address
     space.  This is the default for all platforms.


File: gcc.info,  Node: AVR Options,  Next: MCore Options,  Prev: NS32K Options,  Up: Submodel Options

3.17.23 AVR Options
-------------------

These options are defined for AVR implementations:

`-mmcu=MCU'
     Specify ATMEL AVR instruction set or MCU type.

     Instruction set avr1 is for the minimal AVR core, not supported by
     the C compiler, only for assembler programs (MCU types: at90s1200,
     attiny10, attiny11, attiny12, attiny15, attiny28).

     Instruction set avr2 (default) is for the classic AVR core with up
     to 8K program memory space (MCU types: at90s2313, at90s2323,
     attiny22, at90s2333, at90s2343, at90s4414, at90s4433, at90s4434,
     at90s8515, at90c8534, at90s8535).

     Instruction set avr3 is for the classic AVR core with up to 128K
     program memory space (MCU types: atmega103, atmega603, at43usb320,
     at76c711).

     Instruction set avr4 is for the enhanced AVR core with up to 8K
     program memory space (MCU types: atmega8, atmega83, atmega85).

     Instruction set avr5 is for the enhanced AVR core with up to 128K
     program memory space (MCU types: atmega16, atmega161, atmega163,
     atmega32, atmega323, atmega64, atmega128, at43usb355, at94k).

`-msize'
     Output instruction sizes to the asm file.

`-minit-stack=N'
     Specify the initial stack address, which may be a symbol or
     numeric value, `__stack' is the default.

`-mno-interrupts'
     Generated code is not compatible with hardware interrupts.  Code
     size will be smaller.

`-mcall-prologues'
     Functions prologues/epilogues expanded as call to appropriate
     subroutines.  Code size will be smaller.

`-mno-tablejump'
     Do not generate tablejump insns which sometimes increase code size.

`-mtiny-stack'
     Change only the low 8 bits of the stack pointer.

File: gcc.info,  Node: MCore Options,  Next: IA-64 Options,  Prev: AVR Options,  Up: Submodel Options

3.17.24 MCore Options
---------------------

These are the `-m' options defined for the Motorola M*Core processors.

`-mhardlit'
`-mno-hardlit'
     Inline constants into the code stream if it can be done in two
     instructions or less.

`-mdiv'
`-mno-div'
     Use the divide instruction.  (Enabled by default).

`-mrelax-immediate'
`-mno-relax-immediate'
     Allow arbitrary sized immediates in bit operations.

`-mwide-bitfields'
`-mno-wide-bitfields'
     Always treat bit-fields as int-sized.

`-m4byte-functions'
`-mno-4byte-functions'
     Force all functions to be aligned to a four byte boundary.

`-mcallgraph-data'
`-mno-callgraph-data'
     Emit callgraph information.

`-mslow-bytes'
`-mno-slow-bytes'
     Prefer word access when reading byte quantities.

`-mlittle-endian'
`-mbig-endian'
     Generate code for a little endian target.

`-m210'
`-m340'
     Generate code for the 210 processor.

File: gcc.info,  Node: IA-64 Options,  Next: D30V Options,  Prev: MCore Options,  Up: Submodel Options

3.17.25 IA-64 Options
---------------------

These are the `-m' options defined for the Intel IA-64 architecture.

`-mbig-endian'
     Generate code for a big endian target.  This is the default for
     HP-UX.

`-mlittle-endian'
     Generate code for a little endian target.  This is the default for
     AIX5 and GNU/Linux.

`-mgnu-as'
`-mno-gnu-as'
     Generate (or don't) code for the GNU assembler.  This is the
     default.

`-mgnu-ld'
`-mno-gnu-ld'
     Generate (or don't) code for the GNU linker.  This is the default.

`-mno-pic'
     Generate code that does not use a global pointer register.  The
     result is not position independent code, and violates the IA-64
     ABI.

`-mvolatile-asm-stop'
`-mno-volatile-asm-stop'
     Generate (or don't) a stop bit immediately before and after
     volatile asm statements.

`-mb-step'
     Generate code that works around Itanium B step errata.

`-mregister-names'
`-mno-register-names'
     Generate (or don't) `in', `loc', and `out' register names for the
     stacked registers.  This may make assembler output more readable.

`-mno-sdata'
`-msdata'
     Disable (or enable) optimizations that use the small data section.
     This may be useful for working around optimizer bugs.

`-mconstant-gp'
     Generate code that uses a single constant global pointer value.
     This is useful when compiling kernel code.

`-mauto-pic'
     Generate code that is self-relocatable.  This implies
     `-mconstant-gp'.  This is useful when compiling firmware code.

`-minline-float-divide-min-latency'
     Generate code for inline divides of floating point values using
     the minimum latency algorithm.

`-minline-float-divide-max-throughput'
     Generate code for inline divides of floating point values using
     the maximum throughput algorithm.

`-minline-int-divide-min-latency'
     Generate code for inline divides of integer values using the
     minimum latency algorithm.

`-minline-int-divide-max-throughput'
     Generate code for inline divides of integer values using the
     maximum throughput algorithm.

`-minline-sqrt-min-latency'
     Generate code for inline square roots using the minimum latency
     algorithm.

`-minline-sqrt-max-throughput'
     Generate code for inline square roots using the maximum throughput
     algorithm.

`-mno-dwarf2-asm'
`-mdwarf2-asm'
     Don't (or do) generate assembler code for the DWARF2 line number
     debugging info.  This may be useful when not using the GNU
     assembler.

`-mearly-stop-bits'
`-mno-early-stop-bits'
     Allow stop bits to be placed earlier than immediately preceding the
     instruction that triggered the stop bit.  This can improve
     instruction scheduling, but does not always do so.

`-mfixed-range=REGISTER-RANGE'
     Generate code treating the given register range as fixed registers.
     A fixed register is one that the register allocator can not use.
     This is useful when compiling kernel code.  A register range is
     specified as two registers separated by a dash.  Multiple register
     ranges can be specified separated by a comma.

`-mtls-size=TLS-SIZE'
     Specify bit size of immediate TLS offsets.  Valid values are 14,
     22, and 64.

`-mtune=CPU-TYPE'
     Tune the instruction scheduling for a particular CPU, Valid values
     are itanium, itanium1, merced, itanium2, and mckinley.

`-mt'
`-pthread'
     Add support for multithreading using the POSIX threads library.
     This option sets flags for both the preprocessor and linker.  It
     does not affect the thread safety of object code produced by the
     compiler or that of libraries supplied with it.  These are HP-UX
     specific flags.

`-milp32'
`-mlp64'
     Generate code for a 32-bit or 64-bit environment.  The 32-bit
     environment sets int, long and pointer to 32 bits.  The 64-bit
     environment sets int to 32 bits and long and pointer to 64 bits.
     These are HP-UX specific flags.


File: gcc.info,  Node: D30V Options,  Next: S/390 and zSeries Options,  Prev: IA-64 Options,  Up: Submodel Options

3.17.26 D30V Options
--------------------

These `-m' options are defined for D30V implementations:

`-mextmem'
     Link the `.text', `.data', `.bss', `.strings', `.rodata',
     `.rodata1', `.data1' sections into external memory, which starts
     at location `0x80000000'.

`-mextmemory'
     Same as the `-mextmem' switch.

`-monchip'
     Link the `.text' section into onchip text memory, which starts at
     location `0x0'.  Also link `.data', `.bss', `.strings', `.rodata',
     `.rodata1', `.data1' sections into onchip data memory, which
     starts at location `0x20000000'.

`-mno-asm-optimize'
`-masm-optimize'
     Disable (enable) passing `-O' to the assembler when optimizing.
     The assembler uses the `-O' option to automatically parallelize
     adjacent short instructions where possible.

`-mbranch-cost=N'
     Increase the internal costs of branches to N.  Higher costs means
     that the compiler will issue more instructions to avoid doing a
     branch.  The default is 2.

`-mcond-exec=N'
     Specify the maximum number of conditionally executed instructions
     that replace a branch.  The default is 4.

File: gcc.info,  Node: S/390 and zSeries Options,  Next: CRIS Options,  Prev: D30V Options,  Up: Submodel Options

3.17.27 S/390 and zSeries Options
---------------------------------

These are the `-m' options defined for the S/390 and zSeries
architecture.

`-mhard-float'
`-msoft-float'
     Use (do not use) the hardware floating-point instructions and
     registers for floating-point operations.  When `-msoft-float' is
     specified, functions in `libgcc.a' will be used to perform
     floating-point operations.  When `-mhard-float' is specified, the
     compiler generates IEEE floating-point instructions.  This is the
     default.

`-mbackchain'
`-mno-backchain'
     Store (do not store) the address of the caller's frame as
     backchain pointer into the callee's stack frame.  A backchain may
     be needed to allow debugging using tools that do not understand
     DWARF-2 call frame information.  When `-mno-packed-stack' is in
     effect, the backchain pointer is stored at the bottom of the stack
     frame; when `-mpacked-stack' is in effect, the backchain is placed
     into the topmost word of the 96/160 byte register save area.

     In general, code compiled with `-mbackchain' is call-compatible
     with code compiled with `-mmo-backchain'; however, use of the
     backchain for debugging purposes usually requires that the whole
     binary is built with `-mbackchain'.  Note that the combination of
     `-mbackchain' and `-mpacked-stack' generates code that is not
     ABI-compatible.

     The default is to not maintain the backchain.

`-mpacked-stack'

`-mno-packed-stack'
     Use (do not use) the packed stack layout.  When
     `-mno-packed-stack' is specified, the compiler uses all the fields
     of the 96/160 byte register save area only for their default
     purpose; unused fields still take up stack space.  When
     `-mpacked-stack' is specified, register save slots are densely
     packed at the top of the register save area; unused space is
     reused for other purposes, allowing for more efficient use of the
     available stack space.  However, when `-mbackchain' is also in
     effect, the topmost word of the save area is always used to store
     the backchain, and the return address register is always saved two
     words below the backchain.

     As long as the stack frame backchain is not used, code generated
     with `-mpacked-stack' is call-compatible with code generated with
     `-mno-packed-stack'.  Note that some non-FSF releases of GCC 2.95
     for S/390 or zSeries generated code that uses the stack frame
     backchain at run time, not just for debugging purposes.  Such code
     is not call-compatible with code compiled with `-mpacked-stack'.
     Also, note that the combination of `-mbackchain' and
     `-mpacked-stack' generates code that is not ABI-compatible.

`-msmall-exec'
`-mno-small-exec'
     Generate (or do not generate) code using the `bras' instruction to
     do subroutine calls.  This only works reliably if the total
     executable size does not exceed 64k.  The default is to use the
     `basr' instruction instead, which does not have this limitation.

`-m64'
`-m31'
     When `-m31' is specified, generate code compliant to the GNU/Linux
     for S/390 ABI.  When `-m64' is specified, generate code compliant
     to the GNU/Linux for zSeries ABI.  This allows GCC in particular
     to generate 64-bit instructions.  For the `s390' targets, the
     default is `-m31', while the `s390x' targets default to `-m64'.

`-mzarch'
`-mesa'
     When `-mzarch' is specified, generate code using the instructions
     available on z/Architecture.  When `-mesa' is specified, generate
     code using the instructions available on ESA/390. Note that
     `-mesa' is not possible with `-m64'.  When generating code
     compliant to the GNU/Linux for S/390 ABI, the default is `-mesa'.
     When generating code compliant to the GNU/Linux for zSeries ABI,
     the default is `-mzarch'.

`-mmvcle'
`-mno-mvcle'
     Generate (or do not generate) code using the `mvcle' instruction
     to perform block moves.  When `-mno-mvcle' is specified, use a
     `mvc' loop instead.  This is the default.

`-mdebug'
`-mno-debug'
     Print (or do not print) additional debug information when
     compiling.  The default is to not print debug information.

`-march=CPU-TYPE'
     Generate code that will run on CPU-TYPE, which is the name of a
     system representing a certain processor type. Possible values for
     CPU-TYPE are `g5', `g6', `z900', and `z990'.  When generating code
     using the instructions available on z/Architecture, the default is
     `-march=z900'.  Otherwise, the default is `-march=g5'.

`-mtune=CPU-TYPE'
     Tune to CPU-TYPE everything applicable about the generated code,
     except for the ABI and the set of available instructions.  The
     list of CPU-TYPE values is the same as for `-march'.  The default
     is the value used for `-march'.

`-mfused-madd'
`-mno-fused-madd'
     Generate code that uses (does not use) the floating point multiply
     and accumulate instructions.  These instructions are generated by
     default if hardware floating point is used.

`-mwarn-framesize=FRAMESIZE'
     Emit a warning if the current function exceeds the given frame
     size. Because this is a compile time check it doesn't need to be a
     real problem when the program runs. It is intended to identify
     functions which most probably cause a stack overflow. It is useful
     to be used in an environment with limited stack size e.g. the
     linux kernel.

`-mwarn-dynamicstack'
     Emit a warning if the function calls alloca or uses dynamically
     sized arrays. This is generally a bad idea with a limited stack
     size.

`-mstack-guard=STACK-GUARD'

`-mstack-size=STACK-SIZE'
     These arguments always have to be used in conjunction. If they are
     present the s390 back end emits additional instructions in the
     function prologue which trigger a trap if the stack size is
     STACK-GUARD bytes above the STACK-SIZE (remember that the stack on
     s390 grows downward). These options are intended to be used to
     help debugging stack overflow problems. The addtionally emitted
     code cause only little overhead and hence can also be used in
     production like systems without greater performance degradation.
     The given values have to be exact powers of 2 and STACK-SIZE has
     to be greater than STACK-GUARD.  In order to be effecient the
     extra code makes the assumption that the stack starts at an
     address aligned to the value given by STACK-SIZE. So don't expect
     this to work correctly with a 8k stack size and an initial stack
     pointer like 0xffffefff.

File: gcc.info,  Node: CRIS Options,  Next: MMIX Options,  Prev: S/390 and zSeries Options,  Up: Submodel Options

3.17.28 CRIS Options
--------------------

These options are defined specifically for the CRIS ports.

`-march=ARCHITECTURE-TYPE'
`-mcpu=ARCHITECTURE-TYPE'
     Generate code for the specified architecture.  The choices for
     ARCHITECTURE-TYPE are `v3', `v8' and `v10' for respectively
     ETRAX 4, ETRAX 100, and ETRAX 100 LX.  Default is `v0' except for
     cris-axis-linux-gnu, where the default is `v10'.

`-mtune=ARCHITECTURE-TYPE'
     Tune to ARCHITECTURE-TYPE everything applicable about the generated
     code, except for the ABI and the set of available instructions.
     The choices for ARCHITECTURE-TYPE are the same as for
     `-march=ARCHITECTURE-TYPE'.

`-mmax-stack-frame=N'
     Warn when the stack frame of a function exceeds N bytes.

`-melinux-stacksize=N'
     Only available with the `cris-axis-aout' target.  Arranges for
     indications in the program to the kernel loader that the stack of
     the program should be set to N bytes.

`-metrax4'
`-metrax100'
     The options `-metrax4' and `-metrax100' are synonyms for
     `-march=v3' and `-march=v8' respectively.

`-mmul-bug-workaround'
`-mno-mul-bug-workaround'
     Work around a bug in the `muls' and `mulu' instructions for CPU
     models where it applies.  This option is active by default.

`-mpdebug'
     Enable CRIS-specific verbose debug-related information in the
     assembly code.  This option also has the effect to turn off the
     `#NO_APP' formatted-code indicator to the assembler at the
     beginning of the assembly file.

`-mcc-init'
     Do not use condition-code results from previous instruction;
     always emit compare and test instructions before use of condition
     codes.

`-mno-side-effects'
     Do not emit instructions with side-effects in addressing modes
     other than post-increment.

`-mstack-align'
`-mno-stack-align'
`-mdata-align'
`-mno-data-align'
`-mconst-align'
`-mno-const-align'
     These options (no-options) arranges (eliminate arrangements) for
     the stack-frame, individual data and constants to be aligned for
     the maximum single data access size for the chosen CPU model.  The
     default is to arrange for 32-bit alignment.  ABI details such as
     structure layout are not affected by these options.

`-m32-bit'
`-m16-bit'
`-m8-bit'
     Similar to the stack- data- and const-align options above, these
     options arrange for stack-frame, writable data and constants to
     all be 32-bit, 16-bit or 8-bit aligned.  The default is 32-bit
     alignment.

`-mno-prologue-epilogue'
`-mprologue-epilogue'
     With `-mno-prologue-epilogue', the normal function prologue and
     epilogue that sets up the stack-frame are omitted and no return
     instructions or return sequences are generated in the code.  Use
     this option only together with visual inspection of the compiled
     code: no warnings or errors are generated when call-saved
     registers must be saved, or storage for local variable needs to be
     allocated.

`-mno-gotplt'
`-mgotplt'
     With `-fpic' and `-fPIC', don't generate (do generate) instruction
     sequences that load addresses for functions from the PLT part of
     the GOT rather than (traditional on other architectures) calls to
     the PLT.  The default is `-mgotplt'.

`-maout'
     Legacy no-op option only recognized with the cris-axis-aout target.

`-melf'
     Legacy no-op option only recognized with the cris-axis-elf and
     cris-axis-linux-gnu targets.

`-melinux'
     Only recognized with the cris-axis-aout target, where it selects a
     GNU/linux-like multilib, include files and instruction set for
     `-march=v8'.

`-mlinux'
     Legacy no-op option only recognized with the cris-axis-linux-gnu
     target.

`-sim'
     This option, recognized for the cris-axis-aout and cris-axis-elf
     arranges to link with input-output functions from a simulator
     library.  Code, initialized data and zero-initialized data are
     allocated consecutively.

`-sim2'
     Like `-sim', but pass linker options to locate initialized data at
     0x40000000 and zero-initialized data at 0x80000000.

File: gcc.info,  Node: MMIX Options,  Next: PDP-11 Options,  Prev: CRIS Options,  Up: Submodel Options

3.17.29 MMIX Options
--------------------

These options are defined for the MMIX:

`-mlibfuncs'
`-mno-libfuncs'
     Specify that intrinsic library functions are being compiled,
     passing all values in registers, no matter the size.

`-mepsilon'
`-mno-epsilon'
     Generate floating-point comparison instructions that compare with
     respect to the `rE' epsilon register.

`-mabi=mmixware'
`-mabi=gnu'
     Generate code that passes function parameters and return values
     that (in the called function) are seen as registers `$0' and up,
     as opposed to the GNU ABI which uses global registers `$231' and
     up.

`-mzero-extend'
`-mno-zero-extend'
     When reading data from memory in sizes shorter than 64 bits, use
     (do not use) zero-extending load instructions by default, rather
     than sign-extending ones.

`-mknuthdiv'
`-mno-knuthdiv'
     Make the result of a division yielding a remainder have the same
     sign as the divisor.  With the default, `-mno-knuthdiv', the sign
     of the remainder follows the sign of the dividend.  Both methods
     are arithmetically valid, the latter being almost exclusively used.

`-mtoplevel-symbols'
`-mno-toplevel-symbols'
     Prepend (do not prepend) a `:' to all global symbols, so the
     assembly code can be used with the `PREFIX' assembly directive.

`-melf'
     Generate an executable in the ELF format, rather than the default
     `mmo' format used by the `mmix' simulator.

`-mbranch-predict'
`-mno-branch-predict'
     Use (do not use) the probable-branch instructions, when static
     branch prediction indicates a probable branch.

`-mbase-addresses'
`-mno-base-addresses'
     Generate (do not generate) code that uses _base addresses_.  Using
     a base address automatically generates a request (handled by the
     assembler and the linker) for a constant to be set up in a global
     register.  The register is used for one or more base address
     requests within the range 0 to 255 from the value held in the
     register.  The generally leads to short and fast code, but the
     number of different data items that can be addressed is limited.
     This means that a program that uses lots of static data may
     require `-mno-base-addresses'.

`-msingle-exit'
`-mno-single-exit'
     Force (do not force) generated code to have a single exit point in
     each function.

File: gcc.info,  Node: PDP-11 Options,  Next: Xstormy16 Options,  Prev: MMIX Options,  Up: Submodel Options

3.17.30 PDP-11 Options
----------------------

These options are defined for the PDP-11:

`-mfpu'
     Use hardware FPP floating point.  This is the default.  (FIS
     floating point on the PDP-11/40 is not supported.)

`-msoft-float'
     Do not use hardware floating point.

`-mac0'
     Return floating-point results in ac0 (fr0 in Unix assembler
     syntax).

`-mno-ac0'
     Return floating-point results in memory.  This is the default.

`-m40'
     Generate code for a PDP-11/40.

`-m45'
     Generate code for a PDP-11/45.  This is the default.

`-m10'
     Generate code for a PDP-11/10.

`-mbcopy-builtin'
     Use inline `movstrhi' patterns for copying memory.  This is the
     default.

`-mbcopy'
     Do not use inline `movstrhi' patterns for copying memory.

`-mint16'
`-mno-int32'
     Use 16-bit `int'.  This is the default.

`-mint32'
`-mno-int16'
     Use 32-bit `int'.

`-mfloat64'
`-mno-float32'
     Use 64-bit `float'.  This is the default.

`-mfloat32'
`-mno-float64'
     Use 32-bit `float'.

`-mabshi'
     Use `abshi2' pattern.  This is the default.

`-mno-abshi'
     Do not use `abshi2' pattern.

`-mbranch-expensive'
     Pretend that branches are expensive.  This is for experimenting
     with code generation only.

`-mbranch-cheap'
     Do not pretend that branches are expensive.  This is the default.

`-msplit'
     Generate code for a system with split I&D.

`-mno-split'
     Generate code for a system without split I&D.  This is the default.

`-munix-asm'
     Use Unix assembler syntax.  This is the default when configured for
     `pdp11-*-bsd'.

`-mdec-asm'
     Use DEC assembler syntax.  This is the default when configured for
     any PDP-11 target other than `pdp11-*-bsd'.

File: gcc.info,  Node: Xstormy16 Options,  Next: Xtensa Options,  Prev: PDP-11 Options,  Up: Submodel Options

3.17.31 Xstormy16 Options
-------------------------

These options are defined for Xstormy16:

`-msim'
     Choose startup files and linker script suitable for the simulator.

File: gcc.info,  Node: Xtensa Options,  Next: FRV Options,  Prev: Xstormy16 Options,  Up: Submodel Options

3.17.33 Xtensa Options
----------------------

These options are supported for Xtensa targets:

`-mconst16'
`-mno-const16'
     Enable or disable use of `CONST16' instructions for loading
     constant values.  The `CONST16' instruction is currently not a
     standard option from Tensilica.  When enabled, `CONST16'
     instructions are always used in place of the standard `L32R'
     instructions.  The use of `CONST16' is enabled by default only if
     the `L32R' instruction is not available.

`-mfused-madd'
`-mno-fused-madd'
     Enable or disable use of fused multiply/add and multiply/subtract
     instructions in the floating-point option.  This has no effect if
     the floating-point option is not also enabled.  Disabling fused
     multiply/add and multiply/subtract instructions forces the
     compiler to use separate instructions for the multiply and
     add/subtract operations.  This may be desirable in some cases
     where strict IEEE 754-compliant results are required: the fused
     multiply add/subtract instructions do not round the intermediate
     result, thereby producing results with _more_ bits of precision
     than specified by the IEEE standard.  Disabling fused multiply
     add/subtract instructions also ensures that the program output is
     not sensitive to the compiler's ability to combine multiply and
     add/subtract operations.

`-mtext-section-literals'
`-mno-text-section-literals'
     Control the treatment of literal pools.  The default is
     `-mno-text-section-literals', which places literals in a separate
     section in the output file.  This allows the literal pool to be
     placed in a data RAM/ROM, and it also allows the linker to combine
     literal pools from separate object files to remove redundant
     literals and improve code size.  With `-mtext-section-literals',
     the literals are interspersed in the text section in order to keep
     them as close as possible to their references.  This may be
     necessary for large assembly files.

`-mtarget-align'
`-mno-target-align'
     When this option is enabled, GCC instructs the assembler to
     automatically align instructions to reduce branch penalties at the
     expense of some code density.  The assembler attempts to widen
     density instructions to align branch targets and the instructions
     following call instructions.  If there are not enough preceding
     safe density instructions to align a target, no widening will be
     performed.  The default is `-mtarget-align'.  These options do not
     affect the treatment of auto-aligned instructions like `LOOP',
     which the assembler will always align, either by widening density
     instructions or by inserting no-op instructions.

`-mlongcalls'
`-mno-longcalls'
     When this option is enabled, GCC instructs the assembler to
     translate direct calls to indirect calls unless it can determine
     that the target of a direct call is in the range allowed by the
     call instruction.  This translation typically occurs for calls to
     functions in other source files.  Specifically, the assembler
     translates a direct `CALL' instruction into an `L32R' followed by
     a `CALLX' instruction.  The default is `-mno-longcalls'.  This
     option should be used in programs where the call target can
     potentially be out of range.  This option is implemented in the
     assembler, not the compiler, so the assembly code generated by GCC
     will still show direct call instructions--look at the disassembled
     object code to see the actual instructions.  Note that the
     assembler will use an indirect call for every cross-file call, not
     just those that really will be out of range.

File: gcc.info,  Node: FRV Options,  Prev: Xtensa Options,  Up: Submodel Options

3.17.32 FRV Options
-------------------

`-mgpr-32'
     Only use the first 32 general purpose registers.

`-mgpr-64'
     Use all 64 general purpose registers.

`-mfpr-32'
     Use only the first 32 floating point registers.

`-mfpr-64'
     Use all 64 floating point registers

`-mhard-float'
     Use hardware instructions for floating point operations.

`-msoft-float'
     Use library routines for floating point operations.

`-malloc-cc'
     Dynamically allocate condition code registers.

`-mfixed-cc'
     Do not try to dynamically allocate condition code registers, only
     use `icc0' and `fcc0'.

`-mdword'
     Change ABI to use double word insns.

`-mno-dword'
     Do not use double word instructions.

`-mdouble'
     Use floating point double instructions.

`-mno-double'
     Do not use floating point double instructions.

`-mmedia'
     Use media instructions.

`-mno-media'
     Do not use media instructions.

`-mmuladd'
     Use multiply and add/subtract instructions.

`-mno-muladd'
     Do not use multiply and add/subtract instructions.

`-mlibrary-pic'
     Enable PIC support for building libraries

`-macc-4'
     Use only the first four media accumulator registers.

`-macc-8'
     Use all eight media accumulator registers.

`-mpack'
     Pack VLIW instructions.

`-mno-pack'
     Do not pack VLIW instructions.

`-mno-eflags'
     Do not mark ABI switches in e_flags.

`-mcond-move'
     Enable the use of conditional-move instructions (default).

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mno-cond-move'
     Disable the use of conditional-move instructions.

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mscc'
     Enable the use of conditional set instructions (default).

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mno-scc'
     Disable the use of conditional set instructions.

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mcond-exec'
     Enable the use of conditional execution (default).

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mno-cond-exec'
     Disable the use of conditional execution.

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mvliw-branch'
     Run a pass to pack branches into VLIW instructions (default).

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mno-vliw-branch'
     Do not run a pass to pack branches into VLIW instructions.

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mmulti-cond-exec'
     Enable optimization of `&&' and `||' in conditional execution
     (default).

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mno-multi-cond-exec'
     Disable optimization of `&&' and `||' in conditional execution.

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mnested-cond-exec'
     Enable nested conditional execution optimizations (default).

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mno-nested-cond-exec'
     Disable nested conditional execution optimizations.

     This switch is mainly for debugging the compiler and will likely
     be removed in a future version.

`-mtomcat-stats'
     Cause gas to print out tomcat statistics.

`-mcpu=CPU'
     Select the processor type for which to generate code.  Possible
     values are `simple', `tomcat', `fr500', `fr400', `fr300', `frv'.


File: gcc.info,  Node: Code Gen Options,  Next: Environment Variables,  Prev: Submodel Options,  Up: Invoking GCC

3.18 Options for Code Generation Conventions
============================================

These machine-independent options control the interface conventions
used in code generation.

 Most of them have both positive and negative forms; the negative form
of `-ffoo' would be `-fno-foo'.  In the table below, only one of the
forms is listed--the one which is not the default.  You can figure out
the other form by either removing `no-' or adding it.

`-fbounds-check'
     For front-ends that support it, generate additional code to check
     that indices used to access arrays are within the declared range.
     This is currently only supported by the Java and Fortran 77
     front-ends, where this option defaults to true and false
     respectively.

`-ftrapv'
     This option generates traps for signed overflow on addition,
     subtraction, multiplication operations.

`-fwrapv'
     This option instructs the compiler to assume that signed arithmetic
     overflow of addition, subtraction and multiplication wraps around
     using twos-complement representation.  This flag enables some
     optimizations and disables other.  This option is enabled by
     default for the Java front-end, as required by the Java language
     specification.

`-fexceptions'
     Enable exception handling.  Generates extra code needed to
     propagate exceptions.  For some targets, this implies GCC will
     generate frame unwind information for all functions, which can
     produce significant data size overhead, although it does not
     affect execution.  If you do not specify this option, GCC will
     enable it by default for languages like C++ which normally require
     exception handling, and disable it for languages like C that do
     not normally require it.  However, you may need to enable this
     option when compiling C code that needs to interoperate properly
     with exception handlers written in C++.  You may also wish to
     disable this option if you are compiling older C++ programs that
     don't use exception handling.

`-fnon-call-exceptions'
     Generate code that allows trapping instructions to throw
     exceptions.  Note that this requires platform-specific runtime
     support that does not exist everywhere.  Moreover, it only allows
     _trapping_ instructions to throw exceptions, i.e. memory
     references or floating point instructions.  It does not allow
     exceptions to be thrown from arbitrary signal handlers such as
     `SIGALRM'.

`-funwind-tables'
     Similar to `-fexceptions', except that it will just generate any
     needed static data, but will not affect the generated code in any
     other way.  You will normally not enable this option; instead, a
     language processor that needs this handling would enable it on
     your behalf.

`-fasynchronous-unwind-tables'
     Generate unwind table in dwarf2 format, if supported by target
     machine.  The table is exact at each instruction boundary, so it
     can be used for stack unwinding from asynchronous events (such as
     debugger or garbage collector).

`-fpcc-struct-return'
     Return "short" `struct' and `union' values in memory like longer
     ones, rather than in registers.  This convention is less
     efficient, but it has the advantage of allowing intercallability
     between GCC-compiled files and files compiled with other
     compilers, particularly the Portable C Compiler (pcc).

     The precise convention for returning structures in memory depends
     on the target configuration macros.

     Short structures and unions are those whose size and alignment
     match that of some integer type.

     *Warning:* code compiled with the `-fpcc-struct-return' switch is
     not binary compatible with code compiled with the
     `-freg-struct-return' switch.  Use it to conform to a non-default
     application binary interface.

`-freg-struct-return'
     Return `struct' and `union' values in registers when possible.
     This is more efficient for small structures than
     `-fpcc-struct-return'.

     If you specify neither `-fpcc-struct-return' nor
     `-freg-struct-return', GCC defaults to whichever convention is
     standard for the target.  If there is no standard convention, GCC
     defaults to `-fpcc-struct-return', except on targets where GCC is
     the principal compiler.  In those cases, we can choose the
     standard, and we chose the more efficient register return
     alternative.

     *Warning:* code compiled with the `-freg-struct-return' switch is
     not binary compatible with code compiled with the
     `-fpcc-struct-return' switch.  Use it to conform to a non-default
     application binary interface.

`-fshort-enums'
     Allocate to an `enum' type only as many bytes as it needs for the
     declared range of possible values.  Specifically, the `enum' type
     will be equivalent to the smallest integer type which has enough
     room.

     *Warning:* the `-fshort-enums' switch causes GCC to generate code
     that is not binary compatible with code generated without that
     switch.  Use it to conform to a non-default application binary
     interface.

`-fshort-double'
     Use the same size for `double' as for `float'.

     *Warning:* the `-fshort-double' switch causes GCC to generate code
     that is not binary compatible with code generated without that
     switch.  Use it to conform to a non-default application binary
     interface.

`-fshort-wchar'
     Override the underlying type for `wchar_t' to be `short unsigned
     int' instead of the default for the target.  This option is useful
     for building programs to run under WINE.

     *Warning:* the `-fshort-wchar' switch causes GCC to generate code
     that is not binary compatible with code generated without that
     switch.  Use it to conform to a non-default application binary
     interface.

`-fshared-data'
     Requests that the data and non-`const' variables of this
     compilation be shared data rather than private data.  The
     distinction makes sense only on certain operating systems, where
     shared data is shared between processes running the same program,
     while private data exists in one copy per process.

`-fno-common'
     In C, allocate even uninitialized global variables in the data
     section of the object file, rather than generating them as common
     blocks.  This has the effect that if the same variable is declared
     (without `extern') in two different compilations, you will get an
     error when you link them.  The only reason this might be useful is
     if you wish to verify that the program will work on other systems
     which always work this way.

`-fno-ident'
     Ignore the `#ident' directive.

`-finhibit-size-directive'
     Don't output a `.size' assembler directive, or anything else that
     would cause trouble if the function is split in the middle, and the
     two halves are placed at locations far apart in memory.  This
     option is used when compiling `crtstuff.c'; you should not need to
     use it for anything else.

`-fverbose-asm'
     Put extra commentary information in the generated assembly code to
     make it more readable.  This option is generally only of use to
     those who actually need to read the generated assembly code
     (perhaps while debugging the compiler itself).

     `-fno-verbose-asm', the default, causes the extra information to
     be omitted and is useful when comparing two assembler files.

`-fpic'
     Generate position-independent code (PIC) suitable for use in a
     shared library, if supported for the target machine.  Such code
     accesses all constant addresses through a global offset table
     (GOT).  The dynamic loader resolves the GOT entries when the
     program starts (the dynamic loader is not part of GCC; it is part
     of the operating system).  If the GOT size for the linked
     executable exceeds a machine-specific maximum size, you get an
     error message from the linker indicating that `-fpic' does not
     work; in that case, recompile with `-fPIC' instead.  (These
     maximums are 8k on the SPARC and 32k on the m68k and RS/6000.  The
     386 has no such limit.)

     Position-independent code requires special support, and therefore
     works only on certain machines.  For the 386, GCC supports PIC for
     System V but not for the Sun 386i.  Code generated for the IBM
     RS/6000 is always position-independent.

`-fPIC'
     If supported for the target machine, emit position-independent
     code, suitable for dynamic linking and avoiding any limit on the
     size of the global offset table.  This option makes a difference
     on the m68k and the SPARC.

     Position-independent code requires special support, and therefore
     works only on certain machines.

`-fpie'
`-fPIE'
     These options are similar to `-fpic' and `-fPIC', but generated
     position independent code can be only linked into executables.
     Usually these options are used when `-pie' GCC option will be used
     during linking.

`-ffixed-REG'
     Treat the register named REG as a fixed register; generated code
     should never refer to it (except perhaps as a stack pointer, frame
     pointer or in some other fixed role).

     REG must be the name of a register.  The register names accepted
     are machine-specific and are defined in the `REGISTER_NAMES' macro
     in the machine description macro file.

     This flag does not have a negative form, because it specifies a
     three-way choice.

`-fcall-used-REG'
     Treat the register named REG as an allocable register that is
     clobbered by function calls.  It may be allocated for temporaries
     or variables that do not live across a call.  Functions compiled
     this way will not save and restore the register REG.

     It is an error to used this flag with the frame pointer or stack
     pointer.  Use of this flag for other registers that have fixed
     pervasive roles in the machine's execution model will produce
     disastrous results.

     This flag does not have a negative form, because it specifies a
     three-way choice.

`-fcall-saved-REG'
     Treat the register named REG as an allocable register saved by
     functions.  It may be allocated even for temporaries or variables
     that live across a call.  Functions compiled this way will save
     and restore the register REG if they use it.

     It is an error to used this flag with the frame pointer or stack
     pointer.  Use of this flag for other registers that have fixed
     pervasive roles in the machine's execution model will produce
     disastrous results.

     A different sort of disaster will result from the use of this flag
     for a register in which function values may be returned.

     This flag does not have a negative form, because it specifies a
     three-way choice.

`-fpack-struct'
     Pack all structure members together without holes.

     *Warning:* the `-fpack-struct' switch causes GCC to generate code
     that is not binary compatible with code generated without that
     switch.  Additionally, it makes the code suboptimal.  Use it to
     conform to a non-default application binary interface.

`-finstrument-functions'
     Generate instrumentation calls for entry and exit to functions.
     Just after function entry and just before function exit, the
     following profiling functions will be called with the address of
     the current function and its call site.  (On some platforms,
     `__builtin_return_address' does not work beyond the current
     function, so the call site information may not be available to the
     profiling functions otherwise.)

          void __cyg_profile_func_enter (void *this_fn,
                                         void *call_site);
          void __cyg_profile_func_exit  (void *this_fn,
                                         void *call_site);

     The first argument is the address of the start of the current
     function, which may be looked up exactly in the symbol table.

     This currently disables function inlining.  This restriction is
     expected to be removed in future releases.

     A function may be given the attribute `no_instrument_function', in
     which case this instrumentation will not be done.  This can be
     used, for example, for the profiling functions listed above,
     high-priority interrupt routines, and any functions from which the
     profiling functions cannot safely be called (perhaps signal
     handlers, if the profiling routines generate output or allocate
     memory).

`-fstack-check'
     Generate code to verify that you do not go beyond the boundary of
     the stack.  You should specify this flag if you are running in an
     environment with multiple threads, but only rarely need to specify
     it in a single-threaded environment since stack overflow is
     automatically detected on nearly all systems if there is only one
     stack.

     Note that this switch does not actually cause checking to be done;
     the operating system must do that.  The switch causes generation
     of code to ensure that the operating system sees the stack being
     extended.

`-fstack-limit-register=REG'
`-fstack-limit-symbol=SYM'
`-fno-stack-limit'
     Generate code to ensure that the stack does not grow beyond a
     certain value, either the value of a register or the address of a
     symbol.  If the stack would grow beyond the value, a signal is
     raised.  For most targets, the signal is raised before the stack
     overruns the boundary, so it is possible to catch the signal
     without taking special precautions.

     For instance, if the stack starts at absolute address `0x80000000'
     and grows downwards, you can use the flags
     `-fstack-limit-symbol=__stack_limit' and
     `-Wl,--defsym,__stack_limit=0x7ffe0000' to enforce a stack limit
     of 128KB.  Note that this may only work with the GNU linker.

`-fargument-alias'
`-fargument-noalias'
`-fargument-noalias-global'
     Specify the possible relationships among parameters and between
     parameters and global data.

     `-fargument-alias' specifies that arguments (parameters) may alias
     each other and may alias global storage.
     `-fargument-noalias' specifies that arguments do not alias each
     other, but may alias global storage.
     `-fargument-noalias-global' specifies that arguments do not alias
     each other and do not alias global storage.

     Each language will automatically use whatever option is required by
     the language standard.  You should not need to use these options
     yourself.

`-fleading-underscore'
     This option and its counterpart, `-fno-leading-underscore',
     forcibly change the way C symbols are represented in the object
     file.  One use is to help link with legacy assembly code.

     *Warning:* the `-fleading-underscore' switch causes GCC to
     generate code that is not binary compatible with code generated
     without that switch.  Use it to conform to a non-default
     application binary interface.  Not all targets provide complete
     support for this switch.

`-ftls-model=MODEL'
     Alter the thread-local storage model to be used (*note
     Thread-Local::).  The MODEL argument should be one of
     `global-dynamic', `local-dynamic', `initial-exec' or `local-exec'.

     The default without `-fpic' is `initial-exec'; with `-fpic' the
     default is `global-dynamic'.

`-fvisibility=DEFAULT|INTERNAL|HIDDEN|PROTECTED'
     Set the default ELF image symbol visibility to the specified
     option - all symbols will be marked with this unless overrided
     within the code.  Using this feature can very substantially
     improve linking and load times of shared object libraries, produce
     more optimised code, provide near-perfect API export and prevent
     symbol clashes.  It is *strongly* recommended that you use this in
     any shared objects you distribute.

     Despite the nomenclature, `default' always means public ie;
     available to be linked against from outside the shared object.
     `protected' and `internal' are pretty useless in real-world usage
     so the only other commonly used option will be `hidden'.  The
     default if -fvisibility isn't specified is `default' ie; make every
     symbol public - this causes the same behaviour as previous
     versions of GCC.

     A good explanation of the benefits offered by ensuring ELF symbols
     have the correct visibility is given by "How To Write Shared
     Libraries" by Ulrich Drepper (which can be found at
     `http://people.redhat.com/~drepper/') - however a superior
     solution made possible by this option to marking things hidden when
     the default is public is to make the default hidden and mark things
     public. This is the norm with DLL's on Windows and with
     `-fvisibility=hidden' and `__attribute__
     ((visibility("default")))' instead of `__declspec(dllexport)' you
     get almost identical semantics with identical syntax. This is a
     great boon to those working with cross-platform projects.

     For those adding visibility support to existing code, you may find
     `#pragma GCC visibility' of use. This works by you enclosing the
     declarations you wish to set visibility for with (for example)
     `#pragma GCC visibility push(hidden)' and `#pragma GCC visibility
     pop'.  Bear in mind that symbol visibility should be viewed *as
     part of the API interface contract* and thus all new code should
     always specify visibility when it is not the default ie;
     declarations only for use within the local DSO should *always* be
     marked explicitly as hidden as so to avoid PLT indirection
     overheads - making this abundantly clear also aids readability and
     self-documentation of the code.  Note that due to ISO C++
     specification requirements, operator new and operator delete must
     always be of default visibility.

     An overview of these techniques, their benefits and how to use them
     is at `http://www.nedprod.com/programs/gccvisibility.html'.


File: gcc.info,  Node: Environment Variables,  Next: Precompiled Headers,  Prev: Code Gen Options,  Up: Invoking GCC

3.19 Environment Variables Affecting GCC
========================================

This section describes several environment variables that affect how GCC
operates.  Some of them work by specifying directories or prefixes to
use when searching for various kinds of files.  Some are used to
specify other aspects of the compilation environment.

 Note that you can also specify places to search using options such as
`-B', `-I' and `-L' (*note Directory Options::).  These take precedence
over places specified using environment variables, which in turn take
precedence over those specified by the configuration of GCC.  *Note
Controlling the Compilation Driver `gcc': (gccint)Driver.

`LANG'
`LC_CTYPE'
`LC_MESSAGES'
`LC_ALL'
     These environment variables control the way that GCC uses
     localization information that allow GCC to work with different
     national conventions.  GCC inspects the locale categories
     `LC_CTYPE' and `LC_MESSAGES' if it has been configured to do so.
     These locale categories can be set to any value supported by your
     installation.  A typical value is `en_GB.UTF-8' for English in the
     United Kingdom encoded in UTF-8.

     The `LC_CTYPE' environment variable specifies character
     classification.  GCC uses it to determine the character boundaries
     in a string; this is needed for some multibyte encodings that
     contain quote and escape characters that would otherwise be
     interpreted as a string end or escape.

     The `LC_MESSAGES' environment variable specifies the language to
     use in diagnostic messages.

     If the `LC_ALL' environment variable is set, it overrides the value
     of `LC_CTYPE' and `LC_MESSAGES'; otherwise, `LC_CTYPE' and
     `LC_MESSAGES' default to the value of the `LANG' environment
     variable.  If none of these variables are set, GCC defaults to
     traditional C English behavior.

`TMPDIR'
     If `TMPDIR' is set, it specifies the directory to use for temporary
     files.  GCC uses temporary files to hold the output of one stage of
     compilation which is to be used as input to the next stage: for
     example, the output of the preprocessor, which is the input to the
     compiler proper.

`GCC_EXEC_PREFIX'
     If `GCC_EXEC_PREFIX' is set, it specifies a prefix to use in the
     names of the subprograms executed by the compiler.  No slash is
     added when this prefix is combined with the name of a subprogram,
     but you can specify a prefix that ends with a slash if you wish.

     If `GCC_EXEC_PREFIX' is not set, GCC will attempt to figure out an
     appropriate prefix to use based on the pathname it was invoked
     with.

     If GCC cannot find the subprogram using the specified prefix, it
     tries looking in the usual places for the subprogram.

     The default value of `GCC_EXEC_PREFIX' is `PREFIX/lib/gcc/' where
     PREFIX is the value of `prefix' when you ran the `configure'
     script.

     Other prefixes specified with `-B' take precedence over this
     prefix.

     This prefix is also used for finding files such as `crt0.o' that
     are used for linking.

     In addition, the prefix is used in an unusual way in finding the
     directories to search for header files.  For each of the standard
     directories whose name normally begins with `/usr/local/lib/gcc'
     (more precisely, with the value of `GCC_INCLUDE_DIR'), GCC tries
     replacing that beginning with the specified prefix to produce an
     alternate directory name.  Thus, with `-Bfoo/', GCC will search
     `foo/bar' where it would normally search `/usr/local/lib/bar'.
     These alternate directories are searched first; the standard
     directories come next.

`COMPILER_PATH'
     The value of `COMPILER_PATH' is a colon-separated list of
     directories, much like `PATH'.  GCC tries the directories thus
     specified when searching for subprograms, if it can't find the
     subprograms using `GCC_EXEC_PREFIX'.

`LIBRARY_PATH'
     The value of `LIBRARY_PATH' is a colon-separated list of
     directories, much like `PATH'.  When configured as a native
     compiler, GCC tries the directories thus specified when searching
     for special linker files, if it can't find them using
     `GCC_EXEC_PREFIX'.  Linking using GCC also uses these directories
     when searching for ordinary libraries for the `-l' option (but
     directories specified with `-L' come first).

`LANG'
     This variable is used to pass locale information to the compiler.
     One way in which this information is used is to determine the
     character set to be used when character literals, string literals
     and comments are parsed in C and C++.  When the compiler is
     configured to allow multibyte characters, the following values for
     `LANG' are recognized:

    `C-JIS'
          Recognize JIS characters.

    `C-SJIS'
          Recognize SJIS characters.

    `C-EUCJP'
          Recognize EUCJP characters.

     If `LANG' is not defined, or if it has some other value, then the
     compiler will use mblen and mbtowc as defined by the default
     locale to recognize and translate multibyte characters.

Some additional environments variables affect the behavior of the
preprocessor.

`CPATH'
`C_INCLUDE_PATH'
`CPLUS_INCLUDE_PATH'
`OBJC_INCLUDE_PATH'
     Each variable's value is a list of directories separated by a
     special character, much like `PATH', in which to look for header
     files.  The special character, `PATH_SEPARATOR', is
     target-dependent and determined at GCC build time.  For Microsoft
     Windows-based targets it is a semicolon, and for almost all other
     targets it is a colon.

     `CPATH' specifies a list of directories to be searched as if
     specified with `-I', but after any paths given with `-I' options
     on the command line.  This environment variable is used regardless
     of which language is being preprocessed.

     The remaining environment variables apply only when preprocessing
     the particular language indicated.  Each specifies a list of
     directories to be searched as if specified with `-isystem', but
     after any paths given with `-isystem' options on the command line.

     In all these variables, an empty element instructs the compiler to
     search its current working directory.  Empty elements can appear
     at the beginning or end of a path.  For instance, if the value of
     `CPATH' is `:/special/include', that has the same effect as
     `-I. -I/special/include'.

`DEPENDENCIES_OUTPUT'
     If this variable is set, its value specifies how to output
     dependencies for Make based on the non-system header files
     processed by the compiler.  System header files are ignored in the
     dependency output.

     The value of `DEPENDENCIES_OUTPUT' can be just a file name, in
     which case the Make rules are written to that file, guessing the
     target name from the source file name.  Or the value can have the
     form `FILE TARGET', in which case the rules are written to file
     FILE using TARGET as the target name.

     In other words, this environment variable is equivalent to
     combining the options `-MM' and `-MF' (*note Preprocessor
     Options::), with an optional `-MT' switch too.

`SUNPRO_DEPENDENCIES'
     This variable is the same as `DEPENDENCIES_OUTPUT' (see above),
     except that system header files are not ignored, so it implies
     `-M' rather than `-MM'.  However, the dependence on the main input
     file is omitted.  *Note Preprocessor Options::.

File: gcc.info,  Node: Precompiled Headers,  Next: Running Protoize,  Prev: Environment Variables,  Up: Invoking GCC

3.20 Using Precompiled Headers
==============================

Often large projects have many header files that are included in every
source file.  The time the compiler takes to process these header files
over and over again can account for nearly all of the time required to
build the project.  To make builds faster, GCC allows users to
`precompile' a header file; then, if builds can use the precompiled
header file they will be much faster.

 *Caution:* There are a few known situations where GCC will crash when
trying to use a precompiled header.  If you have trouble with a
precompiled header, you should remove the precompiled header and
compile without it.  In addition, please use GCC's on-line
defect-tracking system to report any problems you encounter with
precompiled headers.  *Note Bugs::.

 To create a precompiled header file, simply compile it as you would any
other file, if necessary using the `-x' option to make the driver treat
it as a C or C++ header file.  You will probably want to use a tool
like `make' to keep the precompiled header up-to-date when the headers
it contains change.

 A precompiled header file will be searched for when `#include' is seen
in the compilation.  As it searches for the included file (*note Search
Path: (cpp)Search Path.) the compiler looks for a precompiled header in
each directory just before it looks for the include file in that
directory.  The name searched for is the name specified in the
`#include' with `.gch' appended.  If the precompiled header file can't
be used, it is ignored.

 For instance, if you have `#include "all.h"', and you have `all.h.gch'
in the same directory as `all.h', then the precompiled header file will
be used if possible, and the original header will be used otherwise.

 Alternatively, you might decide to put the precompiled header file in a
directory and use `-I' to ensure that directory is searched before (or
instead of) the directory containing the original header.  Then, if you
want to check that the precompiled header file is always used, you can
put a file of the same name as the original header in this directory
containing an `#error' command.

 This also works with `-include'.  So yet another way to use
precompiled headers, good for projects not designed with precompiled
header files in mind, is to simply take most of the header files used by
a project, include them from another header file, precompile that header
file, and `-include' the precompiled header.  If the header files have
guards against multiple inclusion, they will be skipped because they've
already been included (in the precompiled header).

 If you need to precompile the same header file for different
languages, targets, or compiler options, you can instead make a
_directory_ named like `all.h.gch', and put each precompiled header in
the directory.  (It doesn't matter what you call the files in the
directory, every precompiled header in the directory will be
considered.)  The first precompiled header encountered in the directory
that is valid for this compilation will be used; they're searched in no
particular order.

 There are many other possibilities, limited only by your imagination,
good sense, and the constraints of your build system.

 A precompiled header file can be used only when these conditions apply:

   * Only one precompiled header can be used in a particular
     compilation.

   * A precompiled header can't be used once the first C token is seen.
     You can have preprocessor directives before a precompiled header;
     you can even include a precompiled header from inside another
     header, so long as there are no C tokens before the `#include'.

   * The precompiled header file must be produced for the same language
     as the current compilation.  You can't use a C precompiled header
     for a C++ compilation.

   * The precompiled header file must be produced by the same compiler
     version and configuration as the current compilation is using.
     The easiest way to guarantee this is to use the same compiler
     binary for creating and using precompiled headers.

   * Any macros defined before the precompiled header (including with
     `-D') must either be defined in the same way as when the
     precompiled header was generated, or must not affect the
     precompiled header, which usually means that the they don't appear
     in the precompiled header at all.

   * Certain command-line options must be defined in the same way as
     when the precompiled header was generated.  At present, it's not
     clear which options are safe to change and which are not; the
     safest choice is to use exactly the same options when generating
     and using the precompiled header.

 For all of these but the last, the compiler will automatically ignore
the precompiled header if the conditions aren't met.  For the last item,
some option changes will cause the precompiled header to be rejected,
but not all incompatible option combinations have yet been found.  If
you find a new incompatible combination, please consider filing a bug
report, see *Note Bugs::.

File: gcc.info,  Node: Running Protoize,  Prev: Precompiled Headers,  Up: Invoking GCC

3.21 Running Protoize
=====================

The program `protoize' is an optional part of GCC.  You can use it to
add prototypes to a program, thus converting the program to ISO C in
one respect.  The companion program `unprotoize' does the reverse: it
removes argument types from any prototypes that are found.

 When you run these programs, you must specify a set of source files as
command line arguments.  The conversion programs start out by compiling
these files to see what functions they define.  The information gathered
about a file FOO is saved in a file named `FOO.X'.

 After scanning comes actual conversion.  The specified files are all
eligible to be converted; any files they include (whether sources or
just headers) are eligible as well.

 But not all the eligible files are converted.  By default, `protoize'
and `unprotoize' convert only source and header files in the current
directory.  You can specify additional directories whose files should
be converted with the `-d DIRECTORY' option.  You can also specify
particular files to exclude with the `-x FILE' option.  A file is
converted if it is eligible, its directory name matches one of the
specified directory names, and its name within the directory has not
been excluded.

 Basic conversion with `protoize' consists of rewriting most function
definitions and function declarations to specify the types of the
arguments.  The only ones not rewritten are those for varargs functions.

 `protoize' optionally inserts prototype declarations at the beginning
of the source file, to make them available for any calls that precede
the function's definition.  Or it can insert prototype declarations
with block scope in the blocks where undeclared functions are called.

 Basic conversion with `unprotoize' consists of rewriting most function
declarations to remove any argument types, and rewriting function
definitions to the old-style pre-ISO form.

 Both conversion programs print a warning for any function declaration
or definition that they can't convert.  You can suppress these warnings
with `-q'.

 The output from `protoize' or `unprotoize' replaces the original
source file.  The original file is renamed to a name ending with
`.save' (for DOS, the saved filename ends in `.sav' without the
original `.c' suffix).  If the `.save' (`.sav' for DOS) file already
exists, then the source file is simply discarded.

 `protoize' and `unprotoize' both depend on GCC itself to scan the
program and collect information about the functions it uses.  So
neither of these programs will work until GCC is installed.

 Here is a table of the options you can use with `protoize' and
`unprotoize'.  Each option works with both programs unless otherwise
stated.

`-B DIRECTORY'
     Look for the file `SYSCALLS.c.X' in DIRECTORY, instead of the
     usual directory (normally `/usr/local/lib').  This file contains
     prototype information about standard system functions.  This option
     applies only to `protoize'.

`-c COMPILATION-OPTIONS'
     Use COMPILATION-OPTIONS as the options when running `gcc' to
     produce the `.X' files.  The special option `-aux-info' is always
     passed in addition, to tell `gcc' to write a `.X' file.

     Note that the compilation options must be given as a single
     argument to `protoize' or `unprotoize'.  If you want to specify
     several `gcc' options, you must quote the entire set of
     compilation options to make them a single word in the shell.

     There are certain `gcc' arguments that you cannot use, because they
     would produce the wrong kind of output.  These include `-g', `-O',
     `-c', `-S', and `-o' If you include these in the
     COMPILATION-OPTIONS, they are ignored.

`-C'
     Rename files to end in `.C' (`.cc' for DOS-based file systems)
     instead of `.c'.  This is convenient if you are converting a C
     program to C++.  This option applies only to `protoize'.

`-g'
     Add explicit global declarations.  This means inserting explicit
     declarations at the beginning of each source file for each function
     that is called in the file and was not declared.  These
     declarations precede the first function definition that contains a
     call to an undeclared function.  This option applies only to
     `protoize'.

`-i STRING'
     Indent old-style parameter declarations with the string STRING.
     This option applies only to `protoize'.

     `unprotoize' converts prototyped function definitions to old-style
     function definitions, where the arguments are declared between the
     argument list and the initial `{'.  By default, `unprotoize' uses
     five spaces as the indentation.  If you want to indent with just
     one space instead, use `-i " "'.

`-k'
     Keep the `.X' files.  Normally, they are deleted after conversion
     is finished.

`-l'
     Add explicit local declarations.  `protoize' with `-l' inserts a
     prototype declaration for each function in each block which calls
     the function without any declaration.  This option applies only to
     `protoize'.

`-n'
     Make no real changes.  This mode just prints information about the
     conversions that would have been done without `-n'.

`-N'
     Make no `.save' files.  The original files are simply deleted.
     Use this option with caution.

`-p PROGRAM'
     Use the program PROGRAM as the compiler.  Normally, the name `gcc'
     is used.

`-q'
     Work quietly.  Most warnings are suppressed.

`-v'
     Print the version number, just like `-v' for `gcc'.

 If you need special compiler options to compile one of your program's
source files, then you should generate that file's `.X' file specially,
by running `gcc' on that source file with the appropriate options and
the option `-aux-info'.  Then run `protoize' on the entire set of
files.  `protoize' will use the existing `.X' file because it is newer
than the source file.  For example:

     gcc -Dfoo=bar file1.c -aux-info file1.X
     protoize *.c

You need to include the special files along with the rest in the
`protoize' command, even though their `.X' files already exist, because
otherwise they won't get converted.

 *Note Protoize Caveats::, for more information on how to use
`protoize' successfully.

File: gcc.info,  Node: C Implementation,  Next: C Extensions,  Prev: Invoking GCC,  Up: Top

4 C Implementation-defined behavior
***********************************

A conforming implementation of ISO C is required to document its choice
of behavior in each of the areas that are designated "implementation
defined."  The following lists all such areas, along with the section
number from the ISO/IEC 9899:1999 standard.

* Menu:

* Translation implementation::
* Environment implementation::
* Identifiers implementation::
* Characters implementation::
* Integers implementation::
* Floating point implementation::
* Arrays and pointers implementation::
* Hints implementation::
* Structures unions enumerations and bit-fields implementation::
* Qualifiers implementation::
* Preprocessing directives implementation::
* Library functions implementation::
* Architecture implementation::
* Locale-specific behavior implementation::

File: gcc.info,  Node: Translation implementation,  Next: Environment implementation,  Up: C Implementation

4.1 Translation
===============

   * `How a diagnostic is identified (3.10, 5.1.1.3).'

     Diagnostics consist of all the output sent to stderr by GCC.

   * `Whether each nonempty sequence of white-space characters other
     than new-line is retained or replaced by one space character in
     translation phase 3 (5.1.1.2).'

File: gcc.info,  Node: Environment implementation,  Next: Identifiers implementation,  Prev: Translation implementation,  Up: C Implementation

4.2 Environment
===============

The behavior of these points are dependent on the implementation of the
C library, and are not defined by GCC itself.

File: gcc.info,  Node: Identifiers implementation,  Next: Characters implementation,  Prev: Environment implementation,  Up: C Implementation

4.3 Identifiers
===============

   * `Which additional multibyte characters may appear in identifiers
     and their correspondence to universal character names (6.4.2).'

   * `The number of significant initial characters in an identifier
     (5.2.4.1, 6.4.2).'

     For internal names, all characters are significant.  For external
     names, the number of significant characters are defined by the
     linker; for almost all targets, all characters are significant.


File: gcc.info,  Node: Characters implementation,  Next: Integers implementation,  Prev: Identifiers implementation,  Up: C Implementation

4.4 Characters
==============

   * `The number of bits in a byte (3.6).'

   * `The values of the members of the execution character set (5.2.1).'

   * `The unique value of the member of the execution character set
     produced for each of the standard alphabetic escape sequences
     (5.2.2).'

   * `The value of a `char' object into which has been stored any
     character other than a member of the basic execution character set
     (6.2.5).'

   * `Which of `signed char' or `unsigned char' has the same range,
     representation, and behavior as "plain" `char' (6.2.5, 6.3.1.1).'

   * `The mapping of members of the source character set (in character
     constants and string literals) to members of the execution
     character set (6.4.4.4, 5.1.1.2).'

   * `The value of an integer character constant containing more than
     one character or containing a character or escape sequence that
     does not map to a single-byte execution character (6.4.4.4).'

   * `The value of a wide character constant containing more than one
     multibyte character, or containing a multibyte character or escape
     sequence not represented in the extended execution character set
     (6.4.4.4).'

   * `The current locale used to convert a wide character constant
     consisting of a single multibyte character that maps to a member
     of the extended execution character set into a corresponding wide
     character code (6.4.4.4).'

   * `The current locale used to convert a wide string literal into
     corresponding wide character codes (6.4.5).'

   * `The value of a string literal containing a multibyte character or
     escape sequence not represented in the execution character set
     (6.4.5).'

File: gcc.info,  Node: Integers implementation,  Next: Floating point implementation,  Prev: Characters implementation,  Up: C Implementation

4.5 Integers
============

   * `Any extended integer types that exist in the implementation
     (6.2.5).'

   * `Whether signed integer types are represented using sign and
     magnitude, two's complement, or one's complement, and whether the
     extraordinary value is a trap representation or an ordinary value
     (6.2.6.2).'

     GCC supports only two's complement integer types, and all bit
     patterns are ordinary values.

   * `The rank of any extended integer type relative to another extended
     integer type with the same precision (6.3.1.1).'

   * `The result of, or the signal raised by, converting an integer to a
     signed integer type when the value cannot be represented in an
     object of that type (6.3.1.3).'

   * `The results of some bitwise operations on signed integers (6.5).'

File: gcc.info,  Node: Floating point implementation,  Next: Arrays and pointers implementation,  Prev: Integers implementation,  Up: C Implementation

4.6 Floating point
==================

   * `The accuracy of the floating-point operations and of the library
     functions in `<math.h>' and `<complex.h>' that return
     floating-point results (5.2.4.2.2).'

   * `The rounding behaviors characterized by non-standard values of
     `FLT_ROUNDS'  (5.2.4.2.2).'

   * `The evaluation methods characterized by non-standard negative
     values of `FLT_EVAL_METHOD' (5.2.4.2.2).'

   * `The direction of rounding when an integer is converted to a
     floating-point number that cannot exactly represent the original
     value (6.3.1.4).'

   * `The direction of rounding when a floating-point number is
     converted to a narrower floating-point number (6.3.1.5).'

   * `How the nearest representable value or the larger or smaller
     representable value immediately adjacent to the nearest
     representable value is chosen for certain floating constants
     (6.4.4.2).'

   * `Whether and how floating expressions are contracted when not
     disallowed by the `FP_CONTRACT' pragma (6.5).'

   * `The default state for the `FENV_ACCESS' pragma (7.6.1).'

   * `Additional floating-point exceptions, rounding modes,
     environments, and classifications, and their macro names (7.6,
     7.12).'

   * `The default state for the `FP_CONTRACT' pragma (7.12.2).'

   * `Whether the "inexact" floating-point exception can be raised when
     the rounded result actually does equal the mathematical result in
     an IEC 60559 conformant implementation (F.9).'

   * `Whether the "underflow" (and "inexact") floating-point exception
     can be raised when a result is tiny but not inexact in an IEC
     60559 conformant implementation (F.9).'


File: gcc.info,  Node: Arrays and pointers implementation,  Next: Hints implementation,  Prev: Floating point implementation,  Up: C Implementation

4.7 Arrays and pointers
=======================

   * `The result of converting a pointer to an integer or vice versa
     (6.3.2.3).'

     A cast from pointer to integer discards most-significant bits if
     the pointer representation is larger than the integer type,
     sign-extends(1) if the pointer representation is smaller than the
     integer type, otherwise the bits are unchanged.

     A cast from integer to pointer discards most-significant bits if
     the pointer representation is smaller than the integer type,
     extends according to the signedness of the integer type if the
     pointer representation is larger than the integer type, otherwise
     the bits are unchanged.

     When casting from pointer to integer and back again, the resulting
     pointer must reference the same object as the original pointer,
     otherwise the behavior is undefined.  That is, one may not use
     integer arithmetic to avoid the undefined behavior of pointer
     arithmetic as proscribed in 6.5.6/8.

   * `The size of the result of subtracting two pointers to elements of
     the same array (6.5.6).'


 ---------- Footnotes ----------

 (1) Future versions of GCC may zero-extend, or use a target-defined
`ptr_extend' pattern.  Do not rely on sign extension.

File: gcc.info,  Node: Hints implementation,  Next: Structures unions enumerations and bit-fields implementation,  Prev: Arrays and pointers implementation,  Up: C Implementation

4.8 Hints
=========

   * `The extent to which suggestions made by using the `register'
     storage-class specifier are effective (6.7.1).'

     The `register' specifier affects code generation only in these
     ways:

        * When used as part of the register variable extension, see
          *Note Explicit Reg Vars::.

        * When `-O0' is in use, the compiler allocates distinct stack
          memory for all variables that do not have the `register'
          storage-class specifier; if `register' is specified, the
          variable may have a shorter lifespan than the code would
          indicate and may never be placed in memory.

        * On some rare x86 targets, `setjmp' doesn't save the registers
          in all circumstances.  In those cases, GCC doesn't allocate
          any variables in registers unless they are marked `register'.


   * `The extent to which suggestions made by using the inline function
     specifier are effective (6.7.4).'

     GCC will not inline any functions if the `-fno-inline' option is
     used or if `-O0' is used.  Otherwise, GCC may still be unable to
     inline a function for many reasons; the `-Winline' option may be
     used to determine if a function has not been inlined and why not.


File: gcc.info,  Node: Structures unions enumerations and bit-fields implementation,  Next: Qualifiers implementation,  Prev: Hints implementation,  Up: C Implementation

4.9 Structures, unions, enumerations, and bit-fields
====================================================

   * `Whether a "plain" int bit-field is treated as a `signed int'
     bit-field or as an `unsigned int' bit-field (6.7.2, 6.7.2.1).'

   * `Allowable bit-field types other than `_Bool', `signed int', and
     `unsigned int' (6.7.2.1).'

   * `Whether a bit-field can straddle a storage-unit boundary
     (6.7.2.1).'

   * `The order of allocation of bit-fields within a unit (6.7.2.1).'

   * `The alignment of non-bit-field members of structures (6.7.2.1).'

   * `The integer type compatible with each enumerated type (6.7.2.2).'


File: gcc.info,  Node: Qualifiers implementation,  Next: Preprocessing directives implementation,  Prev: Structures unions enumerations and bit-fields implementation,  Up: C Implementation

4.10 Qualifiers
===============

   * `What constitutes an access to an object that has
     volatile-qualified type (6.7.3).'


File: gcc.info,  Node: Preprocessing directives implementation,  Next: Library functions implementation,  Prev: Qualifiers implementation,  Up: C Implementation

4.11 Preprocessing directives
=============================

   * `How sequences in both forms of header names are mapped to headers
     or external source file names (6.4.7).'

   * `Whether the value of a character constant in a constant expression
     that controls conditional inclusion matches the value of the same
     character constant in the execution character set (6.10.1).'

   * `Whether the value of a single-character character constant in a
     constant expression that controls conditional inclusion may have a
     negative value (6.10.1).'

   * `The places that are searched for an included `<>' delimited
     header, and how the places are specified or the header is
     identified (6.10.2).'

   * `How the named source file is searched for in an included `""'
     delimited header (6.10.2).'

   * `The method by which preprocessing tokens (possibly resulting from
     macro expansion) in a `#include' directive are combined into a
     header name (6.10.2).'

   * `The nesting limit for `#include' processing (6.10.2).'

     GCC imposes a limit of 200 nested `#include's.

   * `Whether the `#' operator inserts a `\' character before the `\'
     character that begins a universal character name in a character
     constant or string literal (6.10.3.2).'

   * `The behavior on each recognized non-`STDC #pragma' directive
     (6.10.6).'

   * `The definitions for `__DATE__' and `__TIME__' when respectively,
     the date and time of translation are not available (6.10.8).'

     If the date and time are not available, `__DATE__' expands to
     `"??? ?? ????"' and `__TIME__' expands to `"??:??:??"'.


File: gcc.info,  Node: Library functions implementation,  Next: Architecture implementation,  Prev: Preprocessing directives implementation,  Up: C Implementation

4.12 Library functions
======================

The behavior of these points are dependent on the implementation of the
C library, and are not defined by GCC itself.

File: gcc.info,  Node: Architecture implementation,  Next: Locale-specific behavior implementation,  Prev: Library functions implementation,  Up: C Implementation

4.13 Architecture
=================

   * `The values or expressions assigned to the macros specified in the
     headers `<float.h>', `<limits.h>', and `<stdint.h>' (5.2.4.2,
     7.18.2, 7.18.3).'

   * `The number, order, and encoding of bytes in any object (when not
     explicitly specified in this International Standard) (6.2.6.1).'

   * `The value of the result of the sizeof operator (6.5.3.4).'


File: gcc.info,  Node: Locale-specific behavior implementation,  Prev: Architecture implementation,  Up: C Implementation

4.14 Locale-specific behavior
=============================

The behavior of these points are dependent on the implementation of the
C library, and are not defined by GCC itself.

File: gcc.info,  Node: C Extensions,  Next: C++ Extensions,  Prev: C Implementation,  Up: Top

5 Extensions to the C Language Family
*************************************

GNU C provides several language features not found in ISO standard C.
(The `-pedantic' option directs GCC to print a warning message if any
of these features is used.)  To test for the availability of these
features in conditional compilation, check for a predefined macro
`__GNUC__', which is always defined under GCC.

 These extensions are available in C and Objective-C.  Most of them are
also available in C++.  *Note Extensions to the C++ Language: C++
Extensions, for extensions that apply _only_ to C++.

 Some features that are in ISO C99 but not C89 or C++ are also, as
extensions, accepted by GCC in C89 mode and in C++.

* Menu:

* Statement Exprs::     Putting statements and declarations inside expressions.
* Local Labels::        Labels local to a block.
* Labels as Values::    Getting pointers to labels, and computed gotos.
* Nested Functions::    As in Algol and Pascal, lexical scoping of functions.
* Constructing Calls::	Dispatching a call to another function.
* Typeof::              `typeof': referring to the type of an expression.
* Lvalues::             Using `?:', `,' and casts in lvalues.
* Conditionals::        Omitting the middle operand of a `?:' expression.
* Long Long::		Double-word integers---`long long int'.
* Complex::             Data types for complex numbers.
* Hex Floats::          Hexadecimal floating-point constants.
* Zero Length::         Zero-length arrays.
* Variable Length::     Arrays whose length is computed at run time.
* Empty Structures::    Structures with no members.
* Variadic Macros::	Macros with a variable number of arguments.
* Escaped Newlines::    Slightly looser rules for escaped newlines.
* Subscripting::        Any array can be subscripted, even if not an lvalue.
* Pointer Arith::       Arithmetic on `void'-pointers and function pointers.
* Initializers::        Non-constant initializers.
* Compound Literals::   Compound literals give structures, unions
                         or arrays as values.
* Designated Inits::	Labeling elements of initializers.
* Cast to Union::       Casting to union type from any member of the union.
* Case Ranges::		`case 1 ... 9' and such.
* Mixed Declarations::	Mixing declarations and code.
* Function Attributes:: Declaring that functions have no side effects,
                         or that they can never return.
* Attribute Syntax::    Formal syntax for attributes.
* Function Prototypes:: Prototype declarations and old-style definitions.
* C++ Comments::        C++ comments are recognized.
* Dollar Signs::        Dollar sign is allowed in identifiers.
* Character Escapes::   `\e' stands for the character <ESC>.
* Variable Attributes::	Specifying attributes of variables.
* Type Attributes::	Specifying attributes of types.
* Alignment::           Inquiring about the alignment of a type or variable.
* Inline::              Defining inline functions (as fast as macros).
* Extended Asm::        Assembler instructions with C expressions as operands.
                         (With them you can define ``built-in'' functions.)
* Constraints::         Constraints for asm operands
* Asm Labels::          Specifying the assembler name to use for a C symbol.
* Explicit Reg Vars::   Defining variables residing in specified registers.
* Alternate Keywords::  `__const__', `__asm__', etc., for header files.
* Incomplete Enums::    `enum foo;', with details to follow.
* Function Names::	Printable strings which are the name of the current
			 function.
* Return Address::      Getting the return or frame address of a function.
* Vector Extensions::   Using vector instructions through built-in functions.
* Object Size Checking:: Built-in functions for limited buffer overflow
			 checking.
* Other Builtins::      Other built-in functions.
* Target Builtins::     Built-in functions specific to particular targets.
* Pragmas::             Pragmas accepted by GCC.
* Unnamed Fields::      Unnamed struct/union fields within structs/unions.
* Thread-Local::        Per-thread variables.

File: gcc.info,  Node: Statement Exprs,  Next: Local Labels,  Up: C Extensions

5.1 Statements and Declarations in Expressions
==============================================

A compound statement enclosed in parentheses may appear as an expression
in GNU C.  This allows you to use loops, switches, and local variables
within an expression.

 Recall that a compound statement is a sequence of statements surrounded
by braces; in this construct, parentheses go around the braces.  For
example:

     ({ int y = foo (); int z;
        if (y > 0) z = y;
        else z = - y;
        z; })

is a valid (though slightly more complex than necessary) expression for
the absolute value of `foo ()'.

 The last thing in the compound statement should be an expression
followed by a semicolon; the value of this subexpression serves as the
value of the entire construct.  (If you use some other kind of statement
last within the braces, the construct has type `void', and thus
effectively no value.)

 This feature is especially useful in making macro definitions "safe"
(so that they evaluate each operand exactly once).  For example, the
"maximum" function is commonly defined as a macro in standard C as
follows:

     #define max(a,b) ((a) > (b) ? (a) : (b))

But this definition computes either A or B twice, with bad results if
the operand has side effects.  In GNU C, if you know the type of the
operands (here taken as `int'), you can define the macro safely as
follows:

     #define maxint(a,b) \
       ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

 Embedded statements are not allowed in constant expressions, such as
the value of an enumeration constant, the width of a bit-field, or the
initial value of a static variable.

 If you don't know the type of the operand, you can still do this, but
you must use `typeof' (*note Typeof::).

 In G++, the result value of a statement expression undergoes array and
function pointer decay, and is returned by value to the enclosing
expression. For instance, if `A' is a class, then

             A a;

             ({a;}).Foo ()

will construct a temporary `A' object to hold the result of the
statement expression, and that will be used to invoke `Foo'.  Therefore
the `this' pointer observed by `Foo' will not be the address of `a'.

 Any temporaries created within a statement within a statement
expression will be destroyed at the statement's end.  This makes
statement expressions inside macros slightly different from function
calls.  In the latter case temporaries introduced during argument
evaluation will be destroyed at the end of the statement that includes
the function call.  In the statement expression case they will be
destroyed during the statement expression.  For instance,

     #define macro(a)  ({__typeof__(a) b = (a); b + 3; })
     template<typename T> T function(T a) { T b = a; return b + 3; }

     void foo ()
     {
       macro (X ());
       function (X ());
     }

will have different places where temporaries are destroyed.  For the
`macro' case, the temporary `X' will be destroyed just after the
initialization of `b'.  In the `function' case that temporary will be
destroyed when the function returns.

 These considerations mean that it is probably a bad idea to use
statement-expressions of this form in header files that are designed to
work with C++.  (Note that some versions of the GNU C Library contained
header files using statement-expression that lead to precisely this
bug.)

File: gcc.info,  Node: Local Labels,  Next: Labels as Values,  Prev: Statement Exprs,  Up: C Extensions

5.2 Locally Declared Labels
===========================

GCC allows you to declare "local labels" in any nested block scope. A
local label is just like an ordinary label, but you can only reference
it (with a `goto' statement, or by taking its address) within the block
in which it was declared.

 A local label declaration looks like this:

     __label__ LABEL;

or

     __label__ LABEL1, LABEL2, /* ... */;

 Local label declarations must come at the beginning of the block,
before any ordinary declarations or statements.

 The label declaration defines the label _name_, but does not define
the label itself.  You must do this in the usual way, with `LABEL:',
within the statements of the statement expression.

 The local label feature is useful for complex macros.  If a macro
contains nested loops, a `goto' can be useful for breaking out of them.
However, an ordinary label whose scope is the whole function cannot be
used: if the macro can be expanded several times in one function, the
label will be multiply defined in that function.  A local label avoids
this problem.  For example:

     #define SEARCH(value, array, target)              \
     do {                                              \
       __label__ found;                                \
       typeof (target) _SEARCH_target = (target);      \
       typeof (*(array)) *_SEARCH_array = (array);     \
       int i, j;                                       \
       int value;                                      \
       for (i = 0; i < max; i++)                       \
         for (j = 0; j < max; j++)                     \
           if (_SEARCH_array[i][j] == _SEARCH_target)  \
             { (value) = i; goto found; }              \
       (value) = -1;                                   \
      found:;                                          \
     } while (0)

 This could also be written using a statement-expression:

     #define SEARCH(array, target)                     \
     ({                                                \
       __label__ found;                                \
       typeof (target) _SEARCH_target = (target);      \
       typeof (*(array)) *_SEARCH_array = (array);     \
       int i, j;                                       \
       int value;                                      \
       for (i = 0; i < max; i++)                       \
         for (j = 0; j < max; j++)                     \
           if (_SEARCH_array[i][j] == _SEARCH_target)  \
             { value = i; goto found; }                \
       value = -1;                                     \
      found:                                           \
       value;                                          \
     })

 Local label declarations also make the labels they declare visible to
nested functions, if there are any.  *Note Nested Functions::, for
details.

File: gcc.info,  Node: Labels as Values,  Next: Nested Functions,  Prev: Local Labels,  Up: C Extensions

5.3 Labels as Values
====================

You can get the address of a label defined in the current function (or
a containing function) with the unary operator `&&'.  The value has
type `void *'.  This value is a constant and can be used wherever a
constant of that type is valid.  For example:

     void *ptr;
     /* ... */
     ptr = &&foo;

 To use these values, you need to be able to jump to one.  This is done
with the computed goto statement(1), `goto *EXP;'.  For example,

     goto *ptr;

Any expression of type `void *' is allowed.

 One way of using these constants is in initializing a static array that
will serve as a jump table:

     static void *array[] = { &&foo, &&bar, &&hack };

 Then you can select a label with indexing, like this:

     goto *array[i];

Note that this does not check whether the subscript is in bounds--array
indexing in C never does that.

 Such an array of label values serves a purpose much like that of the
`switch' statement.  The `switch' statement is cleaner, so use that
rather than an array unless the problem does not fit a `switch'
statement very well.

 Another use of label values is in an interpreter for threaded code.
The labels within the interpreter function can be stored in the
threaded code for super-fast dispatching.

 You may not use this mechanism to jump to code in a different function.
If you do that, totally unpredictable things will happen.  The best way
to avoid this is to store the label address only in automatic variables
and never pass it as an argument.

 An alternate way to write the above example is

     static const int array[] = { &&foo - &&foo, &&bar - &&foo,
                                  &&hack - &&foo };
     goto *(&&foo + array[i]);

This is more friendly to code living in shared libraries, as it reduces
the number of dynamic relocations that are needed, and by consequence,
allows the data to be read-only.

 ---------- Footnotes ----------

 (1) The analogous feature in Fortran is called an assigned goto, but
that name seems inappropriate in C, where one can do more than simply
store label addresses in label variables.

File: gcc.info,  Node: Nested Functions,  Next: Constructing Calls,  Prev: Labels as Values,  Up: C Extensions

5.4 Nested Functions
====================

A "nested function" is a function defined inside another function.
(Nested functions are not supported for GNU C++.)  The nested function's
name is local to the block where it is defined.  For example, here we
define a nested function named `square', and call it twice:

     foo (double a, double b)
     {
       double square (double z) { return z * z; }

       return square (a) + square (b);
     }

 The nested function can access all the variables of the containing
function that are visible at the point of its definition.  This is
called "lexical scoping".  For example, here we show a nested function
which uses an inherited variable named `offset':

     bar (int *array, int offset, int size)
     {
       int access (int *array, int index)
         { return array[index + offset]; }
       int i;
       /* ... */
       for (i = 0; i < size; i++)
         /* ... */ access (array, i) /* ... */
     }

 Nested function definitions are permitted within functions in the
places where variable definitions are allowed; that is, in any block,
before the first statement in the block.

 It is possible to call the nested function from outside the scope of
its name by storing its address or passing the address to another
function:

     hack (int *array, int size)
     {
       void store (int index, int value)
         { array[index] = value; }

       intermediate (store, size);
     }

 Here, the function `intermediate' receives the address of `store' as
an argument.  If `intermediate' calls `store', the arguments given to
`store' are used to store into `array'.  But this technique works only
so long as the containing function (`hack', in this example) does not
exit.

 If you try to call the nested function through its address after the
containing function has exited, all hell will break loose.  If you try
to call it after a containing scope level has exited, and if it refers
to some of the variables that are no longer in scope, you may be lucky,
but it's not wise to take the risk.  If, however, the nested function
does not refer to anything that has gone out of scope, you should be
safe.

 GCC implements taking the address of a nested function using a
technique called "trampolines".  A paper describing them is available as

`http://people.debian.org/~aaronl/Usenix88-lexic.pdf'.

 A nested function can jump to a label inherited from a containing
function, provided the label was explicitly declared in the containing
function (*note Local Labels::).  Such a jump returns instantly to the
containing function, exiting the nested function which did the `goto'
and any intermediate functions as well.  Here is an example:

     bar (int *array, int offset, int size)
     {
       __label__ failure;
       int access (int *array, int index)
         {
           if (index > size)
             goto failure;
           return array[index + offset];
         }
       int i;
       /* ... */
       for (i = 0; i < size; i++)
         /* ... */ access (array, i) /* ... */
       /* ... */
       return 0;

      /* Control comes here from `access'
         if it detects an error.  */
      failure:
       return -1;
     }

 A nested function always has internal linkage.  Declaring one with
`extern' is erroneous.  If you need to declare the nested function
before its definition, use `auto' (which is otherwise meaningless for
function declarations).

     bar (int *array, int offset, int size)
     {
       __label__ failure;
       auto int access (int *, int);
       /* ... */
       int access (int *array, int index)
         {
           if (index > size)
             goto failure;
           return array[index + offset];
         }
       /* ... */
     }

File: gcc.info,  Node: Constructing Calls,  Next: Typeof,  Prev: Nested Functions,  Up: C Extensions

5.5 Constructing Function Calls
===============================

Using the built-in functions described below, you can record the
arguments a function received, and call another function with the same
arguments, without knowing the number or types of the arguments.

 You can also record the return value of that function call, and later
return that value, without knowing what data type the function tried to
return (as long as your caller expects that data type).

 However, these built-in functions may interact badly with some
sophisticated features or other extensions of the language.  It is,
therefore, not recommended to use them outside very simple functions
acting as mere forwarders for their arguments.

 -- Built-in Function: void * __builtin_apply_args ()
     This built-in function returns a pointer to data describing how to
     perform a call with the same arguments as were passed to the
     current function.

     The function saves the arg pointer register, structure value
     address, and all registers that might be used to pass arguments to
     a function into a block of memory allocated on the stack.  Then it
     returns the address of that block.

 -- Built-in Function: void * __builtin_apply (void (*FUNCTION)(), void
          *ARGUMENTS, size_t SIZE)
     This built-in function invokes FUNCTION with a copy of the
     parameters described by ARGUMENTS and SIZE.

     The value of ARGUMENTS should be the value returned by
     `__builtin_apply_args'.  The argument SIZE specifies the size of
     the stack argument data, in bytes.

     This function returns a pointer to data describing how to return
     whatever value was returned by FUNCTION.  The data is saved in a
     block of memory allocated on the stack.

     It is not always simple to compute the proper value for SIZE.  The
     value is used by `__builtin_apply' to compute the amount of data
     that should be pushed on the stack and copied from the incoming
     argument area.

 -- Built-in Function: void __builtin_return (void *RESULT)
     This built-in function returns the value described by RESULT from
     the containing function.  You should specify, for RESULT, a value
     returned by `__builtin_apply'.

File: gcc.info,  Node: Typeof,  Next: Lvalues,  Prev: Constructing Calls,  Up: C Extensions

5.6 Referring to a Type with `typeof'
=====================================

Another way to refer to the type of an expression is with `typeof'.
The syntax of using of this keyword looks like `sizeof', but the
construct acts semantically like a type name defined with `typedef'.

 There are two ways of writing the argument to `typeof': with an
expression or with a type.  Here is an example with an expression:

     typeof (x[0](1))

This assumes that `x' is an array of pointers to functions; the type
described is that of the values of the functions.

 Here is an example with a typename as the argument:

     typeof (int *)

Here the type described is that of pointers to `int'.

 If you are writing a header file that must work when included in ISO C
programs, write `__typeof__' instead of `typeof'.  *Note Alternate
Keywords::.

 A `typeof'-construct can be used anywhere a typedef name could be
used.  For example, you can use it in a declaration, in a cast, or
inside of `sizeof' or `typeof'.

 `typeof' is often useful in conjunction with the
statements-within-expressions feature.  Here is how the two together can
be used to define a safe "maximum" macro that operates on any
arithmetic type and evaluates each of its arguments exactly once:

     #define max(a,b) \
       ({ typeof (a) _a = (a); \
           typeof (b) _b = (b); \
         _a > _b ? _a : _b; })

 The reason for using names that start with underscores for the local
variables is to avoid conflicts with variable names that occur within
the expressions that are substituted for `a' and `b'.  Eventually we
hope to design a new form of declaration syntax that allows you to
declare variables whose scopes start only after their initializers;
this will be a more reliable way to prevent such conflicts.

Some more examples of the use of `typeof':

   * This declares `y' with the type of what `x' points to.

          typeof (*x) y;

   * This declares `y' as an array of such values.

          typeof (*x) y[4];

   * This declares `y' as an array of pointers to characters:

          typeof (typeof (char *)[4]) y;

     It is equivalent to the following traditional C declaration:

          char *y[4];

     To see the meaning of the declaration using `typeof', and why it
     might be a useful way to write, rewrite it with these macros:

          #define pointer(T)  typeof(T *)
          #define array(T, N) typeof(T [N])

     Now the declaration can be rewritten this way:

          array (pointer (char), 4) y;

     Thus, `array (pointer (char), 4)' is the type of arrays of 4
     pointers to `char'.

 _Compatibility Note:_ In addition to `typeof', GCC 2 supported a more
limited extension which permitted one to write

     typedef T = EXPR;

with the effect of declaring T to have the type of the expression EXPR.
This extension does not work with GCC 3 (versions between 3.0 and 3.2
will crash; 3.2.1 and later give an error).  Code which relies on it
should be rewritten to use `typeof':

     typedef typeof(EXPR) T;

This will work with all versions of GCC.

File: gcc.info,  Node: Lvalues,  Next: Conditionals,  Prev: Typeof,  Up: C Extensions

5.7 Generalized Lvalues
=======================

Compound expressions, conditional expressions and casts are allowed as
lvalues provided their operands are lvalues.  This means that you can
take their addresses or store values into them.  All these extensions
are deprecated.

 Standard C++ allows compound expressions and conditional expressions
as lvalues, and permits casts to reference type, so use of this
extension is not supported for C++ code.

 For example, a compound expression can be assigned, provided the last
expression in the sequence is an lvalue.  These two expressions are
equivalent:

     (a, b) += 5
     a, (b += 5)

 Similarly, the address of the compound expression can be taken.  These
two expressions are equivalent:

     &(a, b)
     a, &b

 A conditional expression is a valid lvalue if its type is not void and
the true and false branches are both valid lvalues.  For example, these
two expressions are equivalent:

     (a ? b : c) = 5
     (a ? b = 5 : (c = 5))

 A cast is a valid lvalue if its operand is an lvalue.  This extension
is deprecated.  A simple assignment whose left-hand side is a cast
works by converting the right-hand side first to the specified type,
then to the type of the inner left-hand side expression.  After this is
stored, the value is converted back to the specified type to become the
value of the assignment.  Thus, if `a' has type `char *', the following
two expressions are equivalent:

     (int)a = 5
     (int)(a = (char *)(int)5)

 An assignment-with-arithmetic operation such as `+=' applied to a cast
performs the arithmetic using the type resulting from the cast, and then
continues as in the previous case.  Therefore, these two expressions are
equivalent:

     (int)a += 5
     (int)(a = (char *)(int) ((int)a + 5))

 You cannot take the address of an lvalue cast, because the use of its
address would not work out coherently.  Suppose that `&(int)f' were
permitted, where `f' has type `float'.  Then the following statement
would try to store an integer bit-pattern where a floating point number
belongs:

     *&(int)f = 1;

 This is quite different from what `(int)f = 1' would do--that would
convert 1 to floating point and store it.  Rather than cause this
inconsistency, we think it is better to prohibit use of `&' on a cast.

 If you really do want an `int *' pointer with the address of `f', you
can simply write `(int *)&f'.

File: gcc.info,  Node: Conditionals,  Next: Long Long,  Prev: Lvalues,  Up: C Extensions

5.8 Conditionals with Omitted Operands
======================================

The middle operand in a conditional expression may be omitted.  Then if
the first operand is nonzero, its value is the value of the conditional
expression.

 Therefore, the expression

     x ? : y

has the value of `x' if that is nonzero; otherwise, the value of `y'.

 This example is perfectly equivalent to

     x ? x : y

In this simple case, the ability to omit the middle operand is not
especially useful.  When it becomes useful is when the first operand
does, or may (if it is a macro argument), contain a side effect.  Then
repeating the operand in the middle would perform the side effect
twice.  Omitting the middle operand uses the value already computed
without the undesirable effects of recomputing it.

File: gcc.info,  Node: Long Long,  Next: Complex,  Prev: Conditionals,  Up: C Extensions

5.9 Double-Word Integers
========================

ISO C99 supports data types for integers that are at least 64 bits wide,
and as an extension GCC supports them in C89 mode and in C++.  Simply
write `long long int' for a signed integer, or `unsigned long long int'
for an unsigned integer.  To make an integer constant of type `long
long int', add the suffix `LL' to the integer.  To make an integer
constant of type `unsigned long long int', add the suffix `ULL' to the
integer.

 You can use these types in arithmetic like any other integer types.
Addition, subtraction, and bitwise boolean operations on these types
are open-coded on all types of machines.  Multiplication is open-coded
if the machine supports fullword-to-doubleword a widening multiply
instruction.  Division and shifts are open-coded only on machines that
provide special support.  The operations that are not open-coded use
special library routines that come with GCC.

 There may be pitfalls when you use `long long' types for function
arguments, unless you declare function prototypes.  If a function
expects type `int' for its argument, and you pass a value of type `long
long int', confusion will result because the caller and the subroutine
will disagree about the number of bytes for the argument.  Likewise, if
the function expects `long long int' and you pass `int'.  The best way
to avoid such problems is to use prototypes.

File: gcc.info,  Node: Complex,  Next: Hex Floats,  Prev: Long Long,  Up: C Extensions

5.10 Complex Numbers
====================

ISO C99 supports complex floating data types, and as an extension GCC
supports them in C89 mode and in C++, and supports complex integer data
types which are not part of ISO C99.  You can declare complex types
using the keyword `_Complex'.  As an extension, the older GNU keyword
`__complex__' is also supported.

 For example, `_Complex double x;' declares `x' as a variable whose
real part and imaginary part are both of type `double'.  `_Complex
short int y;' declares `y' to have real and imaginary parts of type
`short int'; this is not likely to be useful, but it shows that the set
of complex types is complete.

 To write a constant with a complex data type, use the suffix `i' or
`j' (either one; they are equivalent).  For example, `2.5fi' has type
`_Complex float' and `3i' has type `_Complex int'.  Such a constant
always has a pure imaginary value, but you can form any complex value
you like by adding one to a real constant.  This is a GNU extension; if
you have an ISO C99 conforming C library (such as GNU libc), and want
to construct complex constants of floating type, you should include
`<complex.h>' and use the macros `I' or `_Complex_I' instead.

 To extract the real part of a complex-valued expression EXP, write
`__real__ EXP'.  Likewise, use `__imag__' to extract the imaginary
part.  This is a GNU extension; for values of floating type, you should
use the ISO C99 functions `crealf', `creal', `creall', `cimagf',
`cimag' and `cimagl', declared in `<complex.h>' and also provided as
built-in functions by GCC.

 The operator `~' performs complex conjugation when used on a value
with a complex type.  This is a GNU extension; for values of floating
type, you should use the ISO C99 functions `conjf', `conj' and `conjl',
declared in `<complex.h>' and also provided as built-in functions by
GCC.

 GCC can allocate complex automatic variables in a noncontiguous
fashion; it's even possible for the real part to be in a register while
the imaginary part is on the stack (or vice-versa).  Only the DWARF2
debug info format can represent this, so use of DWARF2 is recommended.
If you are using the stabs debug info format, GCC describes a
noncontiguous complex variable as if it were two separate variables of
noncomplex type.  If the variable's actual name is `foo', the two
fictitious variables are named `foo$real' and `foo$imag'.  You can
examine and set these two fictitious variables with your debugger.

File: gcc.info,  Node: Hex Floats,  Next: Zero Length,  Prev: Complex,  Up: C Extensions

5.11 Hex Floats
===============

ISO C99 supports floating-point numbers written not only in the usual
decimal notation, such as `1.55e1', but also numbers such as `0x1.fp3'
written in hexadecimal format.  As a GNU extension, GCC supports this
in C89 mode (except in some cases when strictly conforming) and in C++.
In that format the `0x' hex introducer and the `p' or `P' exponent
field are mandatory.  The exponent is a decimal number that indicates
the power of 2 by which the significant part will be multiplied.  Thus
`0x1.f' is 1 15/16, `p3' multiplies it by 8, and the value of `0x1.fp3'
is the same as `1.55e1'.

 Unlike for floating-point numbers in the decimal notation the exponent
is always required in the hexadecimal notation.  Otherwise the compiler
would not be able to resolve the ambiguity of, e.g., `0x1.f'.  This
could mean `1.0f' or `1.9375' since `f' is also the extension for
floating-point constants of type `float'.

File: gcc.info,  Node: Zero Length,  Next: Variable Length,  Prev: Hex Floats,  Up: C Extensions

5.12 Arrays of Length Zero
==========================

Zero-length arrays are allowed in GNU C.  They are very useful as the
last element of a structure which is really a header for a
variable-length object:

     struct line {
       int length;
       char contents[0];
     };

     struct line *thisline = (struct line *)
       malloc (sizeof (struct line) + this_length);
     thisline->length = this_length;

 In ISO C90, you would have to give `contents' a length of 1, which
means either you waste space or complicate the argument to `malloc'.

 In ISO C99, you would use a "flexible array member", which is slightly
different in syntax and semantics:

   * Flexible array members are written as `contents[]' without the `0'.

   * Flexible array members have incomplete type, and so the `sizeof'
     operator may not be applied.  As a quirk of the original
     implementation of zero-length arrays, `sizeof' evaluates to zero.

   * Flexible array members may only appear as the last member of a
     `struct' that is otherwise non-empty.

   * A structure containing a flexible array member, or a union
     containing such a structure (possibly recursively), may not be a
     member of a structure or an element of an array.  (However, these
     uses are permitted by GCC as extensions.)

 GCC versions before 3.0 allowed zero-length arrays to be statically
initialized, as if they were flexible arrays.  In addition to those
cases that were useful, it also allowed initializations in situations
that would corrupt later data.  Non-empty initialization of zero-length
arrays is now treated like any case where there are more initializer
elements than the array holds, in that a suitable warning about "excess
elements in array" is given, and the excess elements (all of them, in
this case) are ignored.

 Instead GCC allows static initialization of flexible array members.
This is equivalent to defining a new structure containing the original
structure followed by an array of sufficient size to contain the data.
I.e. in the following, `f1' is constructed as if it were declared like
`f2'.

     struct f1 {
       int x; int y[];
     } f1 = { 1, { 2, 3, 4 } };

     struct f2 {
       struct f1 f1; int data[3];
     } f2 = { { 1 }, { 2, 3, 4 } };

The convenience of this extension is that `f1' has the desired type,
eliminating the need to consistently refer to `f2.f1'.

 This has symmetry with normal static arrays, in that an array of
unknown size is also written with `[]'.

 Of course, this extension only makes sense if the extra data comes at
the end of a top-level object, as otherwise we would be overwriting
data at subsequent offsets.  To avoid undue complication and confusion
with initialization of deeply nested arrays, we simply disallow any
non-empty initialization except when the structure is the top-level
object.  For example:

     struct foo { int x; int y[]; };
     struct bar { struct foo z; };

     struct foo a = { 1, { 2, 3, 4 } };        // Valid.
     struct bar b = { { 1, { 2, 3, 4 } } };    // Invalid.
     struct bar c = { { 1, { } } };            // Valid.
     struct foo d[1] = { { 1 { 2, 3, 4 } } };  // Invalid.

File: gcc.info,  Node: Variable Length,  Next: Empty Structures,  Prev: Zero Length,  Up: C Extensions

5.14 Arrays of Variable Length
==============================

Variable-length automatic arrays are allowed in ISO C99, and as an
extension GCC accepts them in C89 mode and in C++.  (However, GCC's
implementation of variable-length arrays does not yet conform in detail
to the ISO C99 standard.)  These arrays are declared like any other
automatic arrays, but with a length that is not a constant expression.
The storage is allocated at the point of declaration and deallocated
when the brace-level is exited.  For example:

     FILE *
     concat_fopen (char *s1, char *s2, char *mode)
     {
       char str[strlen (s1) + strlen (s2) + 1];
       strcpy (str, s1);
       strcat (str, s2);
       return fopen (str, mode);
     }

 Jumping or breaking out of the scope of the array name deallocates the
storage.  Jumping into the scope is not allowed; you get an error
message for it.

 You can use the function `alloca' to get an effect much like
variable-length arrays.  The function `alloca' is available in many
other C implementations (but not in all).  On the other hand,
variable-length arrays are more elegant.

 There are other differences between these two methods.  Space allocated
with `alloca' exists until the containing _function_ returns.  The
space for a variable-length array is deallocated as soon as the array
name's scope ends.  (If you use both variable-length arrays and
`alloca' in the same function, deallocation of a variable-length array
will also deallocate anything more recently allocated with `alloca'.)

 You can also use variable-length arrays as arguments to functions:

     struct entry
     tester (int len, char data[len][len])
     {
       /* ... */
     }

 The length of an array is computed once when the storage is allocated
and is remembered for the scope of the array in case you access it with
`sizeof'.

 If you want to pass the array first and the length afterward, you can
use a forward declaration in the parameter list--another GNU extension.

     struct entry
     tester (int len; char data[len][len], int len)
     {
       /* ... */
     }

 The `int len' before the semicolon is a "parameter forward
declaration", and it serves the purpose of making the name `len' known
when the declaration of `data' is parsed.

 You can write any number of such parameter forward declarations in the
parameter list.  They can be separated by commas or semicolons, but the
last one must end with a semicolon, which is followed by the "real"
parameter declarations.  Each forward declaration must match a "real"
declaration in parameter name and data type.  ISO C99 does not support
parameter forward declarations.

File: gcc.info,  Node: Empty Structures,  Next: Variadic Macros,  Prev: Variable Length,  Up: C Extensions

5.13 Structures With No Members
===============================

GCC permits a C structure to have no members:

     struct empty {
     };

 The structure will have size zero.  In C++, empty structures are part
of the language.  G++ treats empty structures as if they had a single
member of type `char'.

File: gcc.info,  Node: Variadic Macros,  Next: Escaped Newlines,  Prev: Empty Structures,  Up: C Extensions

5.15 Macros with a Variable Number of Arguments.
================================================

In the ISO C standard of 1999, a macro can be declared to accept a
variable number of arguments much as a function can.  The syntax for
defining the macro is similar to that of a function.  Here is an
example:

     #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)

 Here `...' is a "variable argument".  In the invocation of such a
macro, it represents the zero or more tokens until the closing
parenthesis that ends the invocation, including any commas.  This set of
tokens replaces the identifier `__VA_ARGS__' in the macro body wherever
it appears.  See the CPP manual for more information.

 GCC has long supported variadic macros, and used a different syntax
that allowed you to give a name to the variable arguments just like any
other argument.  Here is an example:

     #define debug(format, args...) fprintf (stderr, format, args)

 This is in all ways equivalent to the ISO C example above, but arguably
more readable and descriptive.

 GNU CPP has two further variadic macro extensions, and permits them to
be used with either of the above forms of macro definition.

 In standard C, you are not allowed to leave the variable argument o