gcc - Manpage - Tux24 Net - Linux Unix Network
A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z




NAME
    gcc - GNU project C and C++ compiler

SYNOPSIS
    gcc [-c|-S|-E] [-std=standard]
   [-g] [-pg] [-Olevel]
   [-Wwarn...] [-pedantic]
   [-Idir...] [-Ldir...]
   [-Dmacro[=defn]...] [-Umacro]
   [-foption...] [-mmachine-option...]
   [-o outfile] infile...

    Only the most useful options are listed here; see below for the remain-
    der. g++ accepts mostly the same options as gcc.

DESCRIPTION
    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 docu-
    mented 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.

    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.

OPTIONS
    Option Summary

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

    Overall Options
   -c -S -E -o file -pipe -pass-exit-codes  -x language -v  -###
   --help --target-help --version

    C Language Options
   -ansi -std=standard  -aux-info filename -fno-asm -fno-builtin
   -fno-builtin-function -fhosted -ffreestanding -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
   -fno-access-control -fcheck-new -fconserve-space
   -fno-const-strings -fdollars-in-identifiers -fno-elide-construc-
   tors -fno-enforce-eh-specs -fexternal-templates -falt-exter-
   nal-templates -ffor-scope -fno-for-scope -fno-gnu-keywords
   -fno-implicit-templates -fno-implicit-inline-templates -fno-imple-
   ment-inlines  -fms-extensions -fno-nonansi-builtins -fno-opera-
   tor-names -fno-optional-diags -fpermissive -frepo -fno-rtti
   -fstats -ftemplate-depth-n -fuse-cxa-atexit  -fvtable-gc
   -fno-weak -nostdinc++ -fno-default-inline -Wabi -Wctor-dtor-pri-
   vacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wno-deprecated
   -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual
   -Wno-pmf-conversions -Wsign-promo -Wsynth

    Objective-C Language Options
   -fconstant-string-class=class-name -fgnu-runtime -fnext-runtime
   -gen-decls -Wno-protocol -Wselector

    Language Independent Options
   -fmessage-length=n -fdiagnostics-show-location=[once|every-line]

    Warning Options
   -fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggre-
   gate-return -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment
   -Wconversion  -Wno-deprecated-declarations -Wdisabled-optimization
   -Wdiv-by-zero -Werror -Wfloat-equal  -Wformat -Wformat=2 -Wfor-
   mat-nonliteral -Wformat-security -Wimplicit  -Wimplicit-int -Wim-
   plicit-function-declaration -Werror-implicit-function-declaration
   -Wimport -Winline -Wlarger-than-len  -Wlong-long -Wmain -Wmiss-
   ing-braces -Wmissing-format-attribute -Wmissing-noreturn -Wmulti-
   char  -Wno-format-extra-args  -Wno-format-y2k -Wno-import -Wpacked
   -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wre-
   turn-type -Wsequence-point -Wshadow -Wsign-compare  -Wswitch
   -Wsystem-headers -Wtrigraphs  -Wundef -Wuninitialized -Wun-
   known-pragmas -Wunreachable-code -Wunused -Wunused-function
   -Wunused-label -Wunused-parameter -Wunused-value -Wunused-vari-
   able  -Wwrite-strings

    C-only Warning Options
   -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes
   -Wnested-externs -Wstrict-prototypes  -Wtraditional

    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] -fmem-report  -fpretend-float -fpro-
   file-arcs -fsched-verbose=n -ftest-coverage  -ftime-report -g
   -glevel -gcoff -gdwarf -gdwarf-1 -gdwarf-1+ -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
   -falign-functions=n -falign-jumps=n -falign-labels=n
   -falign-loops=n -fbounds-check -fbranch-probabilities
   -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 -finline-functions -finline-limit=n
   -fkeep-inline-functions -fkeep-static-consts  -fmerge-constants
   -fmerge-all-constants -fmove-all-movables -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
   -fno-trapping-math -fomit-frame-pointer -foptimize-register-move
   -foptimize-sibling-calls -fprefetch-loop-arrays -freduce-all-givs
   -fregmove -frename-registers -frerun-cse-after-loop  -fre-
   run-loop-opt -fschedule-insns -fschedule-insns2
   -fno-sched-interblock -fno-sched-spec -fsched-spec-load
   -fsched-spec-load-dangerous -fsingle-precision-constant -fssa
   -fssa-ccp -fssa-dce -fstrength-reduce -fstrict-aliasing
   -fthread-jumps -ftrapv -funroll-all-loops -funroll-loops --param
   name=value -O -O0 -O1 -O2  -O3 -Os

    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 -remap -tri-
   graphs -undef -Umacro -Wp,option

    Assembler Option
   -Wa,option

    Linker Options
   object-file-name -llibrary -nostartfiles -nodefaultlibs -nost-
   dlib -s -static -static-libgcc -shared -shared-libgcc -sym-
   bolic -Wl,option -Xlinker option -u symbol

    Directory Options
   -Bprefix -Idir -I-  -Ldir -specs=file

    Target Options
   -b machine -V version

    Machine Dependent Options
   M680x0 Options

   -m68000 -m68020 -m68020-40  -m68020-60 -m68030 -m68040 -m68060
   -mcpu32 -m5200 -m68881 -mbitfield  -mc68000 -mc68020 -mfpa
   -mnobitfield  -mrtd -mshort  -msoft-float -mpcrel -malign-int
   -mstrict-align

   M68hc1x Options

   -m6811 -m6812 -m68hc11 -m68hc12 -mauto-incdec -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 -mbroken-saverestore -mcypress -mfaster-structs
   -mflat -mfpu  -mhard-float -mhard-quad-float -mimpure-text
   -mlive-g0 -mno-app-regs -mno-faster-structs  -mno-flat -mno-fpu
   -mno-impure-text -mno-stack-bias -mno-unaligned-doubles
   -msoft-float  -msoft-quad-float -msparclite  -mstack-bias -msuper-
   sparc -munaligned-doubles -mv8

   Convex Options

   -mc1  -mc2 -mc32 -mc34 -mc38 -margcount -mnoargcount -mlong32
   -mlong64 -mvolatile-cache -mvolatile-nocache

   AMD29K Options

   -m29000 -m29050 -mbw -mnbw -mdw -mndw -mlarge -mnormal
   -msmall -mkernel-registers -mno-reuse-arg-regs -mno-stack-check
   -mno-storem-bug -mreuse-arg-regs -msoft-float -mstack-check
   -mstorem-bug  -muser-registers

   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-pro-
   log -mno-sched-prolog -mlittle-endian -mbig-endian  -mwords-lit-
   tle-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
   -mbsd -mxopen -mno-symrename -mabort-on-noreturn -mlong-calls
   -mno-long-calls -msingle-pic-base -mno-single-pic-base -mpic-reg-
   ister=reg -mnop-fun-dllimport -mpoke-function-name -mthumb -marm
   -mtpcs-frame  -mtpcs-leaf-frame -mcaller-super-interworking
   -mcallee-super-interworking

   MN10200 Options

   -mrelax

   MN10300 Options

   -mmult-bug -mno-mult-bug -mam33 -mno-am33 -mno-crt0 -mrelax

   M32R/D Options

   -m32rx -m32r -mcode-model=model-type  -msdata=sdata-type -G num

   M88K Options

   -m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhan-
   dle-large-shift -midentify-revision -mno-check-zero-division
   -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area
   -mno-serialize-volatile -mno-underscores -mocs-debug-info
   -mocs-frame-position  -moptimize-arg-area -mserialize-volatile
   -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift
   -muse-div-instruction -mversion-03.00 -mwarn-passed-structs

   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-call -mno-xl-call -mpe -msoft-float -mhard-float -mmulti-
   ple -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 -mcall-aix -mcall-sysv
   -mcall-netbsd -maix-struct-return -msvr4-struct-return
   -mabi=altivec -mabi=no-altivec -mprototype -mno-prototype -msim
   -mmvme -mads -myellowknife  -memb -msdata -msdata=opt -mvxworks
   -G num -pthread

   RT Options

   -mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs
   -mfull-fp-blocks -mhc-struct-return  -min-line-mul -mmini-
   mum-fp-blocks -mnohc-struct-return

   MIPS Options

   -mabicalls -march=cpu-type -mtune=cpu=type -mcpu=cpu-type -membed-
   ded-data -muninit-const-in-rodata -membedded-pic -mfp32 -mfp64
   -mfused-madd  -mno-fused-madd -mgas -mgp32 -mgp64 -mgpopt
   -mhalf-pic -mhard-float -mint64 -mips1 -mips2 -mips3 -mips4
   -mlong64 -mlong32 -mlong-calls -mmemcpy -mmips-as  -mmips-tfile
   -mno-abicalls -mno-embedded-data -mno-uninit-const-in-rodata
   -mno-embedded-pic -mno-gpopt -mno-long-calls -mno-memcpy
   -mno-mips-tfile -mno-rnames  -mno-stats -mrnames -msoft-float
   -m4650 -msingle-float -mmad -mstats -EL -EB -G num -nocpp
   -mabi=32 -mabi=n32 -mabi=64 -mabi=eabi -mfix7000 -mno-crt0
   -mflush-func=func -mno-flush-func

   i386 and x86-64 Options

   -mcpu=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-bound-
   ary=num -mmmx -msse -msse2 -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 -mcmodel=code-model -m32
   -m64

   HPPA Options

   -march=architecture-type -mbig-switch -mdisable-fpregs -mdis-
   able-indexing -mfast-indirect-calls -mgas -mjump-in-delay
   -mlong-load-store -mno-big-switch -mno-disable-fpregs -mno-dis-
   able-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

   Intel 960 Options

   -mcpu-type -masm-compat -mclean-linkage -mcode-align -mcom-
   plex-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 -mmemory-latency=time

   DEC Alpha/VMS Options

   -mvms-return-codes

   Clipper Options

   -mc300 -mc400

   H8/300 Options

   -mrelax -mh  -ms -mint32 -malign-300

   SH Options

   -m1 -m2 -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 -mpad-
   struct -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 -mv850
   -mbig-switch

   NS32K Options

   -m32032 -m32332 -m32532 -m32081 -m32381 -mmult-add -mno-
   mult-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

   IA-64 Options

   -mbig-endian  -mlittle-endian -mgnu-as -mgnu-ld -mno-pic
   -mvolatile-asm-stop -mb-step -mregister-names -mno-sdata -mcon-
   stant-gp -mauto-pic  -minline-divide-min-latency -min-
   line-divide-max-throughput -mno-dwarf2-asm -mfixed-range=register-
   range

   D30V Options

   -mextmem -mextmemory -monchip -mno-asm-optimize -masm-optimize
   -mbranch-cost=n -mcond-exec=n

   S/390 and zSeries Options

   -mhard-float  -msoft-float -mbackchain -mno-backchain
   -msmall-exec  -mno-small-exec -mmvcle -mno-mvcle -m64 -m31 -mdebug
   -mno-debug

   CRIS Options

   -mcpu=cpu -march=cpu -mtune=cpu -mmax-stack-frame=n -melinux-stack-
   size=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

   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

   -mbig-endian -mlittle-endian -mdensity -mno-density -mmac16
   -mno-mac16 -mmul16 -mno-mul16 -mmul32 -mno-mul32 -mnsa -mno-nsa
   -mminmax -mno-minmax -msext -mno-sext -mbooleans -mno-booleans
   -mhard-float -msoft-float -mfused-madd -mno-fused-madd -mserial-
   ize-volatile -mno-serialize-volatile -mtext-section-literals
   -mno-text-section-literals -mtarget-align -mno-target-align -mlong-
   calls -mno-longcalls

    Code Generation 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 -fno-gnu-linker -fpcc-struct-return -fpic -fPIC
   -freg-struct-return -fshared-data -fshort-enums -fshort-double
   -fshort-wchar -fvolatile -fvolatile-global -fvolatile-static
   -fverbose-asm -fpack-struct  -fstack-check -fstack-limit-regis-
   ter=reg -fstack-limit-symbol=sym -fargument-alias -fargu-
   ment-noalias -fargument-noalias-global -fleading-underscore
   -ftls-model=model

    Options Controlling the Kind of Output

    Compilation can involve up to four stages: preprocessing, compilation
    proper, assembly and linking, always in that order. The first three
    stages apply to an individual source file, and end by producing an
    object file; linking combines all the object files (those newly com-
    piled, 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 header file (not to be compiled or linked).

    file.cc
    file.cp
    file.cxx
    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.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 tradi-
   tional preprocessor).

    file.r
   Fortran source code which must be preprocessed with a RATFOR pre-
   processor (not included with GCC).

    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++-cpp-output
    objective-c objc-cpp-output
    assembler assembler-with-cpp
    ada
    f77 f77-cpp-input ratfor
    java

    -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 numeri-
   cally 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-assem-
   bler 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.

   Since only one output file can be specified, it does not make sense
   to use -o when compiling more than one input file, unless you are
   producing an executable file as output.

   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 com-
   piler driver program and of the preprocessor and the compiler
   proper.

    -###
   Like -v except the commands are not executed and all command argu-
   ments 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 -W 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.

    Compiling C++ Programs

    C++ source files conventionally use one of the suffixes .C, .cc, .cpp,
    .c++, .cp, or .cxx; 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 com-
    piler that understands the C++ language---and under some circumstances,
    you might want to compile programs from standard input, or otherwise
    without a suffix that flags them as C++ programs. 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 com-
    mand-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.

    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 C89 programs. In C++ mode, remove GNU
   extensions that conflict with ISO C++.

   This turns off certain features of GCC that are incompatible with
   ISO C89 (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.

   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 seman-
   tics defined by ISO C (such as "alloca" and "ffs") are not built-in
   functions with -ansi is used.

    -std=
   Determine the language standard. This option is currently only
   supported when compiling C. A value for this option must be pro-
   vided; possible values are

   c89
   iso9899:1990
     ISO C89 (same as -ansi).

   iso9899:199409
     ISO C89 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.1/c99status.html> for more infor-
     mation. The names c9x and iso9899:199x are deprecated.

   gnu89
     Default, ISO C89 plus GNU extensions (including some C99 fea-
     tures).

   gnu99
   gnu9x
     ISO C99 plus GNU extensions. When ISO C99 is fully implemented
     in GCC, this will become the default. The name gnu9x is depre-
     cated.

   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 C89 but
   are in the specified version (for example, // comments and the
   "inline" keyword in ISO C99) are not disabled.

    -aux-info filename
   Output to the given filename prototyped declarations for all func-
   tions declared and/or defined in a translation unit, including
   those in header files. This option is silently ignored in any lan-
   guage 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 (C and Objective-C only)
   Don't recognize built-in functions that do not begin with
   __builtin_ as prefix.

   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.

   In C++, -fno-builtin is always in effect. The -fbuiltin option has
   no effect. Therefore, in C++, the only way to get the optimization
   benefits of built-in functions is to call the function using the
   __builtin_ prefix. The GNU C++ Standard Library uses built-in
   functions to implement many functions (like "std::strchr"), so that
   you automatically get efficient code.

   With the -fno-builtin-function option, not available when compiling
   C++, 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 -ffree-
   standing, 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.

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

    -no-integrated-cpp
   Invoke the external cpp during compilation. The default is to use
   the integrated cpp (internal cpp). This option also allows a user-
   supplied cpp via the -B option. This flag is applicable in both C
   and C++ modes.

   We do not guarantee to retain this option in future, and we may
   change its semantics.

    -traditional
   Attempt to support some aspects of traditional C compilers.
   Specifically:

   o  All "extern" declarations take effect globally even if they are
     written inside of a function definition.  This includes
     implicit declarations of functions.

   o  The newer keywords "typeof", "inline", "signed", "const" and
     "volatile" are not recognized. (You can still use the alterna-
     tive keywords such as "__typeof__", "__inline__", and so on.)

   o  Comparisons between pointers and integers are always allowed.

   o  Integer types "unsigned short" and "unsigned char" promote to
     "unsigned int".

   o  Out-of-range floating point literals are not an error.

   o  Certain constructs which ISO regards as a single invalid pre-
     processing number, such as 0xe-0xd, are treated as expressions
     instead.

   o  String ``constants'' are not necessarily constant; they are
     stored in writable space, and identical looking constants are
     allocated separately. (This is the same as the effect of
     -fwritable-strings.)

   o  All automatic variables not declared "register" are preserved
     by "longjmp". Ordinarily, GNU C follows ISO C: automatic vari-
     ables not declared "volatile" may be clobbered.

   o  The character escape sequences \x and \a evaluate as the lit-
     eral characters x and a respectively. Without -traditional, \x
     is a prefix for the hexadecimal representation of a character,
     and \a produces a bell.

   This option is deprecated and may be removed.

   You may wish to use -fno-builtin as well as -traditional if your
   program uses names that are normally GNU C built-in functions for
   other purposes of its own.

   You cannot use -traditional if you include any header files that
   rely on ISO C features. Some vendors are starting to ship systems
   with ISO C header files and you cannot use -traditional on such
   systems to compile files that include any system headers.

   The -traditional option also enables -traditional-cpp.

    -traditional-cpp
   Attempt to support some aspects of traditional C preprocessors.
   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.

   However, when -traditional is used, bit-fields are all unsigned no
   matter what.

    -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.  The option -tradi-
   tional also has this effect.

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

    -fallow-single-precision
   Do not promote single precision math operations to double preci-
   sion, even when compiling with -traditional.

   Traditional K&R C promotes all floating point operations to double
   precision, regardless of the sizes of the operands.  On the archi-
   tecture for which you are compiling, single precision may be faster
   than double precision.  If you must use -traditional, but want to
   use single precision operations when the operands are single preci-
   sion, use this option.  This option has no effect when compiling
   with ISO or GNU C conventions (the default).

    Options Controlling C++ Dialect

    This section describes the command-line options that are only meaning-
    ful 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:

    -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. The current
   Working Paper requires that "operator new" never return a null
   pointer, so this check is normally unnecessary.

   An alternative to using this option is to specify that your "opera-
   tor new" does not throw any exceptions; if you declare it throw(),
   G++ will check the return value. 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 stan-
   dard. Even if you use -fno-const-strings, you cannot actually mod-
   ify the value of a string constant, unless you also use
   -fwritable-strings.

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

    -fdollars-in-identifiers
   Accept $ in identifiers. You can also explicitly prohibit use of $
   with the option -fno-dollars-in-identifiers.  (GNU C allows $ by
   default on most target systems, but there are a few exceptions.)
   Traditional C allowed the character $ to form part of identifiers.
   However, ISO C and C++ forbid $ in identifiers.

    -fno-elide-constructors
   The C++ standard allows an implementation to omit creating a tempo-
   rary 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 reduc-
   ing code size in production builds, much like defining NDEBUG. The
   compiler will still optimize based on the exception specifications.

    -fexternal-templates
   Cause #pragma interface and implementation to apply to template
   instantiation; template instances are emitted or not according to
   the location of the template definition.

   This option is deprecated.

    -falt-external-templates
   Similar to -fexternal-templates, but template instances are emitted
   or not according to the place where they are first instantiated.

   This option is deprecated.

    -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 instantia-
   tions.

    -fno-implicit-inline-templates
   Don't emit code for implicit instantiations of inline templates,
   either. The default is to handle inlines differently so that com-
   piles 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-stan-
   dard 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 messages about nonconformant code from errors to warn-
   ings. By default, G++ effectively sets -pedantic-errors without
   -pedantic; this option reverses that. This behavior and this
   option are superseded by -pedantic, which works as it does for GNU
   C.

    -frepo
   Enable automatic template instantiation at link time. This option
   also implies -fno-implicit-templates.

    -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 compi-
   lation. 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 end-
   less recursions during template class instantiation.  ANSI/ISO C++
   conforming programs must not rely on a maximum depth greater than
   17.

    -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".

    -fvtable-gc
   Emit special relocations for vtables and virtual function refer-
   ences so that the linker can identify unused virtual functions and
   zero out vtable slots that refer to them. This is most useful with
   -ffunction-sections and -Wl,--gc-sections, in order to also discard
   the functions themselves.

   This optimization requires GNU as and GNU ld. Not all systems sup-
   port this option. -Wl,--gc-sections is ignored without -static.

    -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 avail-
   able. 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 that these functions will have linkage like inline func-
   tions; 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 incompatibilites at this point include:

   o  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 prob-
     lem 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.

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

      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.

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

    -Wnon-virtual-dtor (C++ only)
   Warn when a class declares a non-virtual destructor that should
   probably be virtual, because it looks like the class will be used
   polymorphically.

    -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) { }
    };

   Here the compiler will warn that the member initializers for i and
   j will be rearranged to match the declaration order of the members.

    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:

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

   o  Item 12:  Prefer initialization to assignment in constructors.

   o  Item 14:  Make destructors virtual in base classes.

   o  Item 15:  Have "operator=" return a reference to *this.

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

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

   o  Item 6: Distinguish between prefix and postfix forms of incre-
     ment and decrement operators.

   o  Item 7: Never overload "&&", "||", or ",".

   If you use this option, you should be aware that the standard
   library headers do not obey all of these guidelines; you can use
   grep -v to filter out those warnings.

    -Wno-deprecated (C++ only)
   Do not warn about usage of deprecated features.

    -Wno-non-template-friend (C++ only)
   Disable warnings when non-templatized friend functions are declared
   within a template. With the advent of explicit template specifica-
   tion 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 func-
   tion. (Section 14.5.3). Before G++ implemented explicit specifi-
   cation, unqualified-ids could be interpreted as a particular spe-
   cialization of a templatized function. Because this non-conforming
   behavior is no longer the default behavior for G++, -Wnon-tem-
   plate-friend allows the compiler to check existing code for poten-
   tial trouble spots, and is on by default. This new compiler behav-
   ior 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, reinter-
   pret_cast, and const_cast) are less vulnerable to unintended
   effects, and much easier to grep 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 this:

    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
   enumeral type to a signed type over a conversion to an unsigned
   type of the same size. Previous versions of G++ would try to pre-
   serve unsignedness, but the standard mandates the current behavior.

    -Wsynth (C++ only)
   Warn when G++'s synthesis behavior does not match that of cfront.
   For instance:

    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 =.

    Options Controlling Objective-C Dialect

    This section describes the command-line options that are only meaning-
    ful for Objective-C programs; but you can also use most of the GNU com-
    piler 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, only -fgnu-runtime is an option meant only for Objec-
    tive-C programs; you can use the other options with any language sup-
    ported by GCC.

    Here is a list of options that are only for compiling Objective-C pro-
    grams:

    -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".

    -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.

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

    -Wno-protocol
   Do not warn if methods required by a protocol are not implemented
   in the class adopting it.

    -Wselector
   Warn if a selector has multiple methods of different types defined.

    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 format-
    ting 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 cor-
    rectly.

    -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.

    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 @ref{C++
    Dialect Options} and @ref{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 ver-
   sion 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++ fea-
   tures 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__". How-
   ever, only system header files should use these escape routes;
   application programs should avoid them.

   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 diag-
   nostics 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 warn-
   ings.

    -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, 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 C89 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 for-
   mat features not in the selected standard version (but not for
   "strfmon" formats, since those are not in any version of the C
   standard).

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

    -Wno-format-y2k
   If -Wformat is specified, do not 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 Speci-
   fication says that such unused arguments 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 cur-
   rently 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.  Cur-
   rently equivalent to -Wformat -Wformat-nonliteral
   -Wformat-security.

    -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 brack-
   eted, 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 viola-
   tions of sequence point rules in the C standard.

   The C standard defines the order in which expressions in a C pro-
   gram 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 argu-
   ments and the expression denoting the called function), and in cer-
   tain 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. How-
   ever, 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 posi-
   tive 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 pro-
   grams. 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 sub-
   tle cases. Links to discussions of the problem, including proposed
   formal definitions, may be found on our 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 diagnos-
   tic 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 enumeral type
   and lacks a "case" for one or more of the named codes of that enu-
   meration. (The presence of a "default" label prevents this warn-
   ing.) "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.

    -Wunused-parameter
   Warn whenever a function parameter is unused aside from its decla-
   ration.

   To suppress this warning use the unused attribute.

    -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.

    -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 all the above -Wunused options combined.

   In order to get a warning about an unused function parameter, you
   must either specify -W -Wunused or separately specify
   -Wunused-parameter.

    -Wuninitialized
   Warn if an automatic variable is used without first being initial-
   ized 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 opti-
   mizing. If you don't specify -O, you simply won't get these warn-
   ings.

   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 warn-
   ings 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 ini-
   tialized, 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 func-
   tions you use that never return as "noreturn".

    -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:

    -Wunknown-pragmas
   Warn when a #pragma directive is encountered which is not under-
   stood 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.

    -Wall
   All of the above -W options combined. This enables all the warn-
   ings about constructions that some users consider questionable, and
   that are easy to avoid (or modify to prevent the warning), even in
   conjunction with macros.

    -Wdiv-by-zero
   Warn about compile-time integer division by zero. This is default.
   To inhibit the warning messages, use -Wno-div-by-zero. Floating
   point division by zero is not warned about, as it can be a legiti-
   mate way of obtaining infinities and NaNs.

    -Wmultichar
   Warn if a multicharacter constant ('FOOF') is used. This is
   default. To inhibit the warning messages, use -Wno-multichar.
   Usually they indicate a typo in the user's code, as they have
   implementation-defined values, and should not be used in portable
   code.

    -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.

    The following -W... options are not implied by -Wall. Some of them
    warn about constructions that users generally do not consider question-
    able, 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.

    -W Print extra warning messages for these events:

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

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

   o  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.

   o  An unsigned value is compared against zero with < or <=.

   o  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.

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

   o  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 exten-
     sion will be warned about if -pedantic is specified.)

   o  If -Wall or -Wunused is also specified, warn about unused argu-
     ments.

   o  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 speci-
     fied.)

   o  An aggregate has a partly bracketed initializer.  For example,
     the following code would evoke such a warning, because braces
     are missing around the initializer for "x.h":

      struct s { int f, g; };
      struct t { struct s h; int i; };
      struct t x = { 1, 2, 3 };

   o  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 };

    -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 analysing 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 tradi-
   tional and ISO C. Also warn about ISO C constructs that have no
   traditional C equivalent, and/or problematic constructs which
   should be avoided.

   o  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.

   o  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 under-
     stands 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.

   o  A function-like macro that appears without arguments.

   o  The unary plus operator.

   o  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.

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

   o  A "switch" statement has an operand of type "long".

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

   o  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.

   o  Usage of ISO string concatenation is detected.

   o  Initialization of automatic aggregates.

   o  Identifier conflicts with labels. Traditional C lacks a sepa-
     rate namespace for labels.

   o  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.

   o  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.

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

    -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 conve-
   nience in calculations with "void *" pointers and pointers to func-
   tions.

    -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 care-
   ful 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 proto-
   type. 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 assign-
   ment "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 -W; to get the other
   warnings of -W without this warning, use -W -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.)

    -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
   Warn if a global function is defined without a previous declara-
   tion. 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 "nore-
   turn". 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 sub-
   tle 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 func-
   tion like "vprintf" or "vscanf", but this might not always be the
   case, and some functions for which "format" attributes are appro-
   priate may not be detected. This option has no effect unless
   -Wformat is enabled (possibly by -Wall).

    -Wno-deprecated-declarations
   Do not warn about uses of functions, variables, and types marked as
   deprecated by using the "deprecated" attribute. (@pxref{Function
   Attributes}, @pxref{Variable Attributes}, @pxref{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 ele-
   ment 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 proce-
   dure 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 ver-
   sion of a program there is often substantial code which checks cor-
   rect 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.

    -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 han-
   dle 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.

    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 for-
   mat (stabs, COFF, XCOFF, or DWARF). GDB can work with this debug-
   ging 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 con-
   trol for certain whether to generate the extra information, use
   -gstabs+, -gstabs, -gxcoff+, -gxcoff, -gdwarf-1+, -gdwarf-1, 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 sur-
   prising 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 sup-
   ported), 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.

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

    -gcoff
   Produce debugging information in COFF format (if that is sup-
   ported). 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 sup-
   ported). This is the format used by the DBX debugger on IBM
   RS/6000 systems.

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

    -gdwarf
   Produce debugging information in DWARF version 1 format (if that is
   supported). This is the format used by SDB on most System V
   Release 4 systems.

    -gdwarf+
   Produce debugging information in DWARF version 1 format (if that is
   supported), using GNU extensions understood only by the GNU debug-
   ger (GDB). The use of these extensions is likely to make other
   debuggers crash or refuse to read the program.

    -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 sup-
   ported). 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 defini-
   tions present in the program. Some debuggers support macro expan-
   sion when you use -g3.

   Note that in order to avoid confusion between DWARF1 debug level 2,
   and DWARF2, neither -gdwarf nor -gdwarf-2 accept a concatenated
   debug level.  Instead use an additional -glevel option to change
   the debug level for DWARF1 or DWARF2.

    -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
   Instrument arcs during compilation to generate coverage data or for
   profile-directed block ordering. During execution the program
   records how many times each branch is executed and how many times
   it is taken.  When the compiled program exits it saves this data to
   a file called sourcename.da for each source file.

   For profile-directed block ordering, compile the program with
   -fprofile-arcs plus optimization and code generation options, gen-
   erate the arc profile information by running the program on a
   selected workload, and then compile the program again with the same
   optimization and code generation options plus -fbranch-probabili-
   ties.

   The other use of -fprofile-arcs is for use with "gcov", when it is
   used with the -ftest-coverage option.

   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 instru-
   mented: 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
   Create data files for the gcov code-coverage utility. The data
   file names begin with the name of your source file:

   sourcename.bb
     A mapping from basic blocks to line numbers, which "gcov" uses
     to associate basic block execution counts with line numbers.

   sourcename.bbg
     A list of all arcs in the program flow graph. This allows
     "gcov" to reconstruct the program flow graph, so that it can
     compute all basic block and arc execution counts from the
     information in the "sourcename.da" file.

   Use -ftest-coverage with -fprofile-arcs; the latter option adds
   instrumentation to the program, which then writes execution counts
   to another data file:

   sourcename.da
     Runtime arc execution counts, used in conjunction with the arc
     information in the file "sourcename.bbg".

   Coverage data will map better to the source files if -ftest-cover-
   age is used without optimization.

    -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 source file name (e.g.  foo.c.00.rtl or foo.c.01.sib-
   ling). 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.14.bp.

   B  Dump after block reordering, to file.29.bbro.

   c  Dump after instruction combination, to the file file.16.com-
     bine.

   C  Dump after the first if conversion, to the file file.17.ce.

   d  Dump after delayed branch scheduling, to file.31.dbr.

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

   e  Dump after SSA optimizations, to file.04.ssa and file.07.ussa.

   E  Dump after the second if conversion, to file.26.ce2.

   f  Dump after life analysis, to file.15.life.

   F  Dump after purging "ADDRESSOF" codes, to file.09.addressof.

   g  Dump after global register allocation, to file.21.greg.

   h  Dump after finalization of EH handling code, to file.02.eh.

   k  Dump after reg-to-stack conversion, to file.28.stack.

   o  Dump after post-reload optimizations, to file.22.postreload.

   G  Dump after GCSE, to file.10.gcse.

   i  Dump after sibling call optimizations, to file.01.sibling.

   j  Dump after the first jump optimization, to file.03.jump.

   k  Dump after conversion from registers to stack, to
     file.32.stack.

   l  Dump after local register allocation, to file.20.lreg.

   L  Dump after loop optimization, to file.11.loop.

   M  Dump after performing the machine dependent reorganisation
     pass, to file.30.mach.

   n  Dump after register renumbering, to file.25.rnreg.

   N  Dump after the register move pass, to file.18.regmove.

   r  Dump after RTL generation, to file.00.rtl.

   R  Dump after the second scheduling pass, to file.27.sched2.

   s  Dump after CSE (including the jump optimization that sometimes
     follows CSE), to file.08.cse.

   S  Dump after the first scheduling pass, to file.19.sched.

   t  Dump after the second CSE pass (including the jump optimization
     that sometimes follows CSE), to file.12.cse2.

   w  Dump after the second flow pass, to file.23.flow2.

   X  Dump after SSA dead code elimination, to file.06.ssadce.

   z  Dump after the peephole pass, to file.24.peephole2.

   a  Produce all the dumps listed above.

   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 instruc-
     tion 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.00.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. Usu-
     ally used with r.

   y  Dump debugging information during parsing, to standard error.

    -fdump-unnumbered
   When doing debugging dumps (see -d option above), suppress instruc-
   tion numbers and line number note output. This makes it more fea-
   sible 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 transla-
   tion 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 func-
   tion 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 intermedi-
   ate language tree to a file.  The file name is generated by append-
   ing 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 applica-
   ble 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 environ-
     ment.

   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.

    -fsched-verbose=n
   On targets that use instruction scheduling, this option controls
   the amount of debugging output the scheduler prints.  This informa-
   tion 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 out-
   put is always printed to standard error.

   For n greater than zero, -fsched-verbose outputs the same informa-
   tion 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.

    -fpretend-float
   When running a cross-compiler, pretend that the target machine uses
   the same floating point format as the host machine. This causes
   incorrect output of the actual floating constants, but the actual
   instruction sequence will probably be the same as GCC would make
   when running on the target machine.

    -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 prepro-
   cessed 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.

    -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
   @samp{-, without spaces between multiple switches. This is sup-
   posed 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 prob-
   lem, 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 '/'.

    -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 any-
   thing else.

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

    Options That Control Optimization

    These options control various sorts of optimizations:

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

   Without -O, the compiler's goal is to reduce the cost of compila-
   tion and to make debugging produce the expected results. State-
   ments 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 func-
   tion and get exactly the results you would expect from the source
   code.

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

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

   -O2 turns on all optional optimizations except for loop unrolling,
   function inlining, and register renaming. It also turns on the
   -fforce-mem option on all machines and frame pointer elimination on
   machines where doing so does not interfere with debugging.

   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 and -frename-registers
   options.

    -O0 Do not optimize.

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

   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 which is not the default. You can figure out the
    other form by either removing no- or adding it.

    -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.

    -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 com-
   piled 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.

    -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 com-
   mon subexpressions, instruction combination should eliminate the
   separate register-load. The -O2 option turns on this option.

    -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.

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

    -ftrapv
   This option generates traps for signed overflow on addition, sub-
   traction, multiplication operations.

    -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.

    -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 (ie 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++.

   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 func-
   tion 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 com-
   piler 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) accross compilation units.

   This option is default for optimized compilation if assembler and
   linker support it. Use -fno-merge-constants to inhibit this behav-
   ior.

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

   This option implies -fmerge-constants. In addition to -fmerge-con-
   stants this considers e.g. even constant initialized arrays or ini-
   tialized 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-conform-
   ing behavior.

    -fno-branch-count-reg
   Do not use ``decrement and branch'' instructions on a count regis-
   ter, 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 sup-
   port such instructions, which include x86, PowerPC, IA-64 and
   S/390.

    -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 optimiza-
   tions performed when this option is not used.

    -ffast-math
   Sets -fno-math-errno, -funsafe-math-optimizations, and -fno-trap-
   ping-math.

   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 func-
   tions.

    -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 func-
   tions.

   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 func-
   tions.

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

    -fno-trapping-math
   Compile code assuming that floating-point operations cannot gener-
   ate user-visible traps. 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 func-
   tions.

   The default is -ftrapping-math.

    -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 currenly only supported by the Java and Fortran 77
   front-ends, where this option defaults to true and false respec-
   tively.

    The following options control specific optimizations. The -O2 option
    turns on all of these optimizations except -funroll-loops and -fun-
    roll-all-loops. On most machines, the -O option turns on the
    -fthread-jumps and -fdelayed-branch options, but specific machines may
    handle it differently.

    You can use the following flags in the rare cases when ``fine-tuning''
    of optimizations to be performed is desired.

    Not all of the optimizations performed by GCC have -f options to con-
    trol them.

    -fstrength-reduce
   Perform the optimizations of loop strength reduction and elimina-
   tion of iteration variables.

    -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.

    -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.

    -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".

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

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

    -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 exten-
   sion, you may get better runtime performance if you disable the
   global common subexpression elmination pass by adding -fno-gcse to
   the command line.

    -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.

    -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.

    -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.

    -fexpensive-optimizations
   Perform a number of minor optimizations that are relatively expen-
   sive.

    -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. GCC enables this optimization by
   default with -O2 or higher.

   Note -fregmove and -foptimize-register-move are the same optimiza-
   tion.

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

    -fschedule-insns
   If supported for the target machine, attempt to reorder instruc-
   tions 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.

    -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 num-
   ber of registers and where memory load instructions take more than
   one cycle.

    -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 alloca-
   tion, 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.

    -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 optimiza-
   tions to improve locality of reference in the instruction space.
   HPPA processors running HP-UX and Sparc processors running Solaris
   2 have linkers with such optimizations. Other systems using the
   ELF object format as well as 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.

    -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, usu-
   ally those which have no call-preserved registers to use instead.

   For all machines, optimization level 2 and higher enables this flag
   by default.

    -funroll-loops
   Unroll loops whose number of iterations can be determined at com-
   pile time or upon entry to the loop.  -funroll-loops implies both
   -fstrength-reduce and -frerun-cse-after-loop. 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 -fun-
   roll-loops,

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

    -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-mov-
   ables 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 improv-
   ing loop optimizations.

   Please let us (<gcc@gcc.gnu.org> and <fortran@gnu.org>) know how
   use of these options affects the performance of your production
   code. We're very interested in code that runs slower when these
   options are enabled.

    -fno-peephole
    -fno-peephole2
   Disable any machine-specific peephole optimizations.  The differ-
   ence 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.

    -fbranch-probabilities
   After running a program compiled with -fprofile-arcs, you can com-
   pile 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.da 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_EXEC_COUNT note on the
   first instruction of each basic block, and a REG_BR_PROB note on
   each JUMP_INSN and CALL_INSN. These can be used to improve opti-
   mization. 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.

    -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 feed-
   back (-fprofile-arcs) or __builtin_expect. This means that differ-
   ent 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.

    -fstrict-aliasing
   Allows the compiler to assume the strictest aliasing rules applica-
   ble to the language being compiled. For C (and C++), this acti-
   vates optimizations based on the type of expressions. In particu-
   lar, an obj