Copyright © 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being “GNU General Public License” and “Funding Free Software”, the Front-Cover texts being (a) (see below), and with the Back-Cover Texts being (b) (see below). A copy of the license is included in the section entitled “GNU Free Documentation License”.
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development.
typeof
void- and Function-Pointers
asm Operands
enum Types
This manual documents how to use the GNU compilers, as well as their features and incompatibilities, and how to report bugs. It corresponds to GCC version 3.4.6. The internals of the GNU compilers, including how to port them to new targets and some information about how to write front ends for new languages, are documented in a separate manual. See Introduction (GNU Compiler Collection (GCC) Internals).
GCC stands for “GNU Compiler Collection”. GCC is an integrated distribution of compilers for several major programming languages. These languages currently include C, C++, Objective-C, Java, Fortran, and Ada.
The abbreviation GCC has multiple meanings in common use. The current official meaning is “GNU Compiler Collection”, which refers generically to the complete suite of tools. The name historically stood for “GNU C Compiler”, and this usage is still common when the emphasis is on compiling C programs. Finally, the name is also used when speaking of the language-independent component of GCC: code shared among the compilers for all supported languages.
The language-independent component of GCC includes the majority of the optimizers, as well as the “back ends” that generate machine code for various processors.
The part of a compiler that is specific to a particular language is called the “front end”. In addition to the front ends that are integrated components of GCC, there are several other front ends that are maintained separately. These support languages such as Pascal, Mercury, and COBOL. To use these, they must be built together with GCC proper.
Most of the compilers for languages other than C have their own names. The C++ compiler is G++, the Ada compiler is GNAT, and so on. When we talk about compiling one of those languages, we might refer to that compiler by its own name, or as GCC. Either is correct.
Historically, compilers for many languages, including C++ and Fortran, have been implemented as “preprocessors” which emit another high level language such as C. None of the compilers included in GCC are implemented this way; they all generate machine code directly. This sort of preprocessor should not be confused with the C preprocessor, which is an integral feature of the C, C++, and Objective-C languages.
For each language compiled by GCC for which there is a standard, GCC attempts to follow one or more versions of that standard, possibly with some exceptions, and possibly with some extensions.
GCC supports three versions of the C standard, although support for the most recent version is not yet complete.
The original ANSI C standard (X3.159-1989) was ratified in 1989 and published in 1990. This standard was ratified as an ISO standard (ISO/IEC 9899:1990) later in 1990. There were no technical differences between these publications, although the sections of the ANSI standard were renumbered and became clauses in the ISO standard. This standard, in both its forms, is commonly known as C89, or occasionally as C90, from the dates of ratification. The ANSI standard, but not the ISO standard, also came with a Rationale document. To select this standard in GCC, use one of the options -ansi, -std=c89 or -std=iso9899:1990; to obtain all the diagnostics required by the standard, you should also specify -pedantic (or -pedantic-errors if you want them to be errors rather than warnings). See Options Controlling C Dialect.
Errors in the 1990 ISO C standard were corrected in two Technical Corrigenda published in 1994 and 1996. GCC does not support the uncorrected version.
An amendment to the 1990 standard was published in 1995. This
amendment added digraphs and __STDC_VERSION__ to the language,
but otherwise concerned the library. This amendment is commonly known
as AMD1; the amended standard is sometimes known as C94 or
C95. To select this standard in GCC, use the option
-std=iso9899:199409 (with, as for other standard versions,
-pedantic to receive all required diagnostics).
A new edition of the ISO C standard was published in 1999 as ISO/IEC 9899:1999, and is commonly known as C99. GCC has incomplete support for this standard version; see http://gcc.gnu.org/gcc-3.4/c99status.html for details. To select this standard, use -std=c99 or -std=iso9899:1999. (While in development, drafts of this standard version were referred to as C9X.)
Errors in the 1999 ISO C standard were corrected in a Technical Corrigendum published in 2001. GCC does not support the uncorrected version.
By default, GCC provides some extensions to the C language that on rare occasions conflict with the C standard. See Extensions to the C Language Family. Use of the -std options listed above will disable these extensions where they conflict with the C standard version selected. You may also select an extended version of the C language explicitly with -std=gnu89 (for C89 with GNU extensions) or -std=gnu99 (for C99 with GNU extensions). The default, if no C language dialect options are given, is -std=gnu89; this will change to -std=gnu99 in some future release when the C99 support is complete. Some features that are part of the C99 standard are accepted as extensions in C89 mode.
The ISO C standard defines (in clause 4) two classes of conforming
implementation. A conforming hosted implementation supports the
whole standard including all the library facilities; a conforming
freestanding implementation is only required to provide certain
library facilities: those in <float.h>, <limits.h>,
<stdarg.h>, and <stddef.h>; since AMD1, also those in
<iso646.h>; and in C99, also those in <stdbool.h> and
<stdint.h>. In addition, complex types, added in C99, are not
required for freestanding implementations. The standard also defines
two environments for programs, a freestanding environment,
required of all implementations and which may not have library
facilities beyond those required of freestanding implementations,
where the handling of program startup and termination are
implementation-defined, and a hosted environment, which is not
required, in which all the library facilities are provided and startup
is through a function int main (void) or int main (int,
char *[]). An OS kernel would be a freestanding environment; a
program using the facilities of an operating system would normally be
in a hosted implementation.
GCC aims towards being usable as a conforming freestanding
implementation, or as the compiler for a conforming hosted
implementation. By default, it will act as the compiler for a hosted
implementation, defining __STDC_HOSTED__ as 1 and
presuming that when the names of ISO C functions are used, they have
the semantics defined in the standard. To make it act as a conforming
freestanding implementation for a freestanding environment, use the
option -ffreestanding; it will then define
__STDC_HOSTED__ to 0 and not make assumptions about the
meanings of function names from the standard library, with exceptions
noted below. To build an OS kernel, you may well still need to make
your own arrangements for linking and startup.
See Options Controlling C Dialect.
GCC does not provide the library facilities required only of hosted implementations, nor yet all the facilities required by C99 of freestanding implementations; to use the facilities of a hosted environment, you will need to find them elsewhere (for example, in the GNU C library). See Standard Libraries.
Most of the compiler support routines used by GCC are present in
libgcc, but there are a few exceptions. GCC requires the
freestanding environment provide memcpy, memmove,
memset and memcmp. Some older ports of GCC are
configured to use the BSD bcopy, bzero and bcmp
functions instead, but this is deprecated for new ports.
Finally, if __builtin_trap is used, and the target does
not implement the trap pattern, then GCC will emit a call
to abort.
For references to Technical Corrigenda, Rationale documents and information concerning the history of C that is available online, see http://gcc.gnu.org/readings.html
There is no formal written standard for Objective-C. The most authoritative manual is “Object-Oriented Programming and the Objective-C Language”, available at a number of web sites
There is no standard for treelang, which is a sample language front end for GCC. Its only purpose is as a sample for people wishing to write a new language for GCC. The language is documented in gcc/treelang/treelang.texi which can be turned into info or HTML format.
See GNAT Reference Manual (GNAT Reference Manual), for information on standard conformance and compatibility of the Ada compiler.
See The GNU Fortran Language (Using and Porting GNU Fortran), for details of the Fortran language supported by GCC.
See Compatibility with the Java Platform (GNU gcj), for details of compatibility between gcj and the Java Platform.
When you invoke GCC, it normally does preprocessing, compilation, assembly and linking. The “overall options” allow you to stop this process at an intermediate stage. For example, the -c option says not to run the linker. Then the output consists of object files output by the assembler.
Other options are passed on to one stage of processing. Some options control the preprocessor and others the compiler itself. Yet other options control the assembler and linker; most of these are not documented here, since you rarely need to use any of them.
Most of the command line options that you can use with GCC are useful for C programs; when an option is only useful with another language (usually C++), the explanation says so explicitly. If the description for a particular option does not mention a source language, you can use that option with all supported languages.
See Compiling C++ Programs, for a summary of special options for compiling C++ programs.
The gcc program accepts options and file names as operands. Many options have multi-letter names; therefore multiple single-letter options may not be grouped: -dr is very different from -d -r.
You can mix options and other arguments. For the most part, the order you use doesn't matter. Order does matter when you use several options of the same kind; for example, if you specify -L more than once, the directories are searched in the order specified.
Many options have long names starting with -f or with -W—for example, -fforce-mem, -fstrength-reduce, -Wformat and so on. Most of these have both positive and negative forms; the negative form of -ffoo would be -fno-foo. This manual documents only one of these two forms, whichever one is not the default.
See Option Index, for an index to GCC's options.
Here is a summary of all the options, grouped by type. Explanations are in the following sections.
-c -S -E -o file -pipe -pass-exit-codes
-x language -v -### --help --target-help --version
-ansi -std=standard -aux-info filename
-fno-asm -fno-builtin -fno-builtin-function
-fhosted -ffreestanding -fms-extensions
-trigraphs -no-integrated-cpp -traditional -traditional-cpp
-fallow-single-precision -fcond-mismatch
-fsigned-bitfields -fsigned-char
-funsigned-bitfields -funsigned-char
-fwritable-strings
-fabi-version=n -fno-access-control -fcheck-new
-fconserve-space -fno-const-strings
-fno-elide-constructors
-fno-enforce-eh-specs
-ffor-scope -fno-for-scope -fno-gnu-keywords
-fno-implicit-templates
-fno-implicit-inline-templates
-fno-implement-inlines -fms-extensions
-fno-nonansi-builtins -fno-operator-names
-fno-optional-diags -fpermissive
-frepo -fno-rtti -fstats -ftemplate-depth-n
-fuse-cxa-atexit -fno-weak -nostdinc++
-fno-default-inline -Wabi -Wctor-dtor-privacy
-Wnon-virtual-dtor -Wreorder
-Weffc++ -Wno-deprecated
-Wno-non-template-friend -Wold-style-cast
-Woverloaded-virtual -Wno-pmf-conversions
-Wsign-promo
-fconstant-string-class=class-name
-fgnu-runtime -fnext-runtime
-fno-nil-receivers
-fobjc-exceptions
-freplace-objc-classes
-fzero-link
-gen-decls
-Wno-protocol -Wselector -Wundeclared-selector
-fmessage-length=n
-fdiagnostics-show-location=[once|every-line]
-fsyntax-only -pedantic -pedantic-errors
-w -Wextra -Wall -Waggregate-return
-Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment
-Wconversion -Wno-deprecated-declarations
-Wdisabled-optimization -Wno-div-by-zero -Wendif-labels
-Werror -Werror-implicit-function-declaration
-Wfloat-equal -Wformat -Wformat=2
-Wno-format-extra-args -Wformat-nonliteral
-Wformat-security -Wformat-y2k
-Wimplicit -Wimplicit-function-declaration -Wimplicit-int
-Wimport -Wno-import -Winit-self -Winline
-Wno-invalid-offsetof -Winvalid-pch
-Wlarger-than-len -Wlong-long
-Wmain -Wmissing-braces
-Wmissing-format-attribute -Wmissing-noreturn
-Wno-multichar -Wnonnull -Wpacked -Wpadded
-Wparentheses -Wpointer-arith -Wredundant-decls
-Wreturn-type -Wsequence-point -Wshadow
-Wsign-compare -Wstrict-aliasing
-Wswitch -Wswitch-default -Wswitch-enum
-Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized
-Wunknown-pragmas -Wunreachable-code
-Wunused -Wunused-function -Wunused-label -Wunused-parameter
-Wunused-value -Wunused-variable -Wwrite-strings
-Wbad-function-cast -Wmissing-declarations
-Wmissing-prototypes -Wnested-externs -Wold-style-definition
-Wstrict-prototypes -Wtraditional
-Wdeclaration-after-statement
-dletters -dumpspecs -dumpmachine -dumpversion
-fdump-unnumbered -fdump-translation-unit[-n]
-fdump-class-hierarchy[-n]
-fdump-tree-original[-n]
-fdump-tree-optimized[-n]
-fdump-tree-inlined[-n]
-feliminate-dwarf2-dups -feliminate-unused-debug-types
-feliminate-unused-debug-symbols -fmem-report -fprofile-arcs
-frandom-seed=string -fsched-verbose=n
-ftest-coverage -ftime-report
-g -glevel -gcoff -gdwarf-2
-ggdb -gstabs -gstabs+ -gvms -gxcoff -gxcoff+
-p -pg -print-file-name=library -print-libgcc-file-name
-print-multi-directory -print-multi-lib
-print-prog-name=program -print-search-dirs -Q
-save-temps -time
-falign-functions=n -falign-jumps=n
-falign-labels=n -falign-loops=n
-fbranch-probabilities -fprofile-values -fvpt -fbranch-target-load-optimize
-fbranch-target-load-optimize2 -fcaller-saves -fcprop-registers
-fcse-follow-jumps -fcse-skip-blocks -fdata-sections
-fdelayed-branch -fdelete-null-pointer-checks
-fexpensive-optimizations -ffast-math -ffloat-store
-fforce-addr -fforce-mem -ffunction-sections
-fgcse -fgcse-lm -fgcse-sm -fgcse-las -floop-optimize
-fcrossjumping -fif-conversion -fif-conversion2
-finline-functions -finline-limit=n -fkeep-inline-functions
-fkeep-static-consts -fmerge-constants -fmerge-all-constants
-fmove-all-movables -fnew-ra -fno-branch-count-reg
-fno-default-inline -fno-defer-pop
-fno-function-cse -fno-guess-branch-probability
-fno-inline -fno-math-errno -fno-peephole -fno-peephole2
-funsafe-math-optimizations -ffinite-math-only
-fno-trapping-math -fno-zero-initialized-in-bss
-fomit-frame-pointer -foptimize-register-move
-foptimize-sibling-calls -fprefetch-loop-arrays
-fprofile-generate -fprofile-use
-freduce-all-givs -fregmove -frename-registers
-freorder-blocks -freorder-functions
-frerun-cse-after-loop -frerun-loop-opt
-frounding-math -fschedule-insns -fschedule-insns2
-fno-sched-interblock -fno-sched-spec -fsched-spec-load
-fsched-spec-load-dangerous
-fsched-stalled-insns=n -sched-stalled-insns-dep=n
-fsched2-use-superblocks
-fsched2-use-traces -fsignaling-nans
-fsingle-precision-constant
-fstrength-reduce -fstrict-aliasing -ftracer -fthread-jumps
-funroll-all-loops -funroll-loops -fpeel-loops
-funswitch-loops -fold-unroll-loops -fold-unroll-all-loops
--param name=value
-O -O0 -O1 -O2 -O3 -Os
-Aquestion=answer
-A-question[=answer]
-C -dD -dI -dM -dN
-Dmacro[=defn] -E -H
-idirafter dir
-include file -imacros file
-iprefix file -iwithprefix dir
-iwithprefixbefore dir -isystem dir
-M -MM -MF -MG -MP -MQ -MT -nostdinc
-P -fworking-directory -remap
-trigraphs -undef -Umacro -Wp,option
-Xpreprocessor option
-Wa,option -Xassembler option
object-file-name -llibrary
-nostartfiles -nodefaultlibs -nostdlib -pie
-s -static -static-libgcc -shared -shared-libgcc -symbolic
-Wl,option -Xlinker option
-u symbol
-Bprefix -Idir -I- -Ldir -specs=file
-V version -b machine
M680x0 Options
-m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040
-m68060 -mcpu32 -m5200 -m68881 -mbitfield -mc68000 -mc68020
-mnobitfield -mrtd -mshort -msoft-float -mpcrel
-malign-int -mstrict-align -msep-data -mno-sep-data
-mshared-library-id=n -mid-shared-library -mno-id-shared-library
M68hc1x Options
-m6811 -m6812 -m68hc11 -m68hc12 -m68hcs12
-mauto-incdec -minmax -mlong-calls -mshort
-msoft-reg-count=count
VAX Options
-mg -mgnu -munix
SPARC Options
-mcpu=cpu-type
-mtune=cpu-type
-mcmodel=code-model
-m32 -m64 -mapp-regs -mno-app-regs
-mfaster-structs -mno-faster-structs
-mflat -mno-flat -mfpu -mno-fpu
-mhard-float -msoft-float
-mhard-quad-float -msoft-quad-float
-mimpure-text -mno-impure-text -mlittle-endian
-mstack-bias -mno-stack-bias
-munaligned-doubles -mno-unaligned-doubles
-mv8plus -mno-v8plus -mvis -mno-vis
-mcypress -mf930 -mf934
-msparclite -msupersparc -mv8
-threads -pthreads
ARM Options
-mapcs-frame -mno-apcs-frame
-mapcs-26 -mapcs-32
-mapcs-stack-check -mno-apcs-stack-check
-mapcs-float -mno-apcs-float
-mapcs-reentrant -mno-apcs-reentrant
-msched-prolog -mno-sched-prolog
-mlittle-endian -mbig-endian -mwords-little-endian
-malignment-traps -mno-alignment-traps
-msoft-float -mhard-float -mfpe
-mthumb-interwork -mno-thumb-interwork
-mcpu=name -march=name -mfpe=name
-mstructure-size-boundary=n
-mabort-on-noreturn
-mlong-calls -mno-long-calls
-msingle-pic-base -mno-single-pic-base
-mpic-register=reg
-mnop-fun-dllimport
-mcirrus-fix-invalid-insns -mno-cirrus-fix-invalid-insns
-mpoke-function-name
-mthumb -marm
-mtpcs-frame -mtpcs-leaf-frame
-mcaller-super-interworking -mcallee-super-interworking
MN10300 Options
-mmult-bug -mno-mult-bug
-mam33 -mno-am33
-mam33-2 -mno-am33-2
-mno-crt0 -mrelax
M32R/D Options
-m32r2 -m32rx -m32r
-mdebug
-malign-loops -mno-align-loops
-missue-rate=number
-mbranch-cost=number
-mmodel=code-size-model-type
-msdata=sdata-type
-mno-flush-func -mflush-func=name
-mno-flush-trap -mflush-trap=number
-G num
RS/6000 and PowerPC Options
-mcpu=cpu-type
-mtune=cpu-type
-mpower -mno-power -mpower2 -mno-power2
-mpowerpc -mpowerpc64 -mno-powerpc
-maltivec -mno-altivec
-mpowerpc-gpopt -mno-powerpc-gpopt
-mpowerpc-gfxopt -mno-powerpc-gfxopt
-mnew-mnemonics -mold-mnemonics
-mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc
-m64 -m32 -mxl-compat -mno-xl-compat -mpe
-malign-power -malign-natural
-msoft-float -mhard-float -mmultiple -mno-multiple
-mstring -mno-string -mupdate -mno-update
-mfused-madd -mno-fused-madd -mbit-align -mno-bit-align
-mstrict-align -mno-strict-align -mrelocatable
-mno-relocatable -mrelocatable-lib -mno-relocatable-lib
-mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian
-mdynamic-no-pic
-mprioritize-restricted-insns=priority
-msched-costly-dep=dependence_type
-minsert-sched-nops=scheme
-mcall-sysv -mcall-netbsd
-maix-struct-return -msvr4-struct-return
-mabi=altivec -mabi=no-altivec
-mabi=spe -mabi=no-spe
-misel=yes -misel=no
-mspe=yes -mspe=no
-mfloat-gprs=yes -mfloat-gprs=no
-mprototype -mno-prototype
-msim -mmvme -mads -myellowknife -memb -msdata
-msdata=opt -mvxworks -mwindiss -G num -pthread
Darwin Options
-all_load -allowable_client -arch -arch_errors_fatal
-arch_only -bind_at_load -bundle -bundle_loader
-client_name -compatibility_version -current_version
-dependency-file -dylib_file -dylinker_install_name
-dynamic -dynamiclib -exported_symbols_list
-filelist -flat_namespace -force_cpusubtype_ALL
-force_flat_namespace -headerpad_max_install_names
-image_base -init -install_name -keep_private_externs
-multi_module -multiply_defined -multiply_defined_unused
-noall_load -nofixprebinding -nomultidefs -noprebind -noseglinkedit
-pagezero_size -prebind -prebind_all_twolevel_modules
-private_bundle -read_only_relocs -sectalign
-sectobjectsymbols -whyload -seg1addr
-sectcreate -sectobjectsymbols -sectorder
-seg_addr_table -seg_addr_table_filename -seglinkedit
-segprot -segs_read_only_addr -segs_read_write_addr
-single_module -static -sub_library -sub_umbrella
-twolevel_namespace -umbrella -undefined
-unexported_symbols_list -weak_reference_mismatches
-whatsloaded
MIPS Options
-EL -EB -march=arch -mtune=arch
-mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips64
-mips16 -mno-mips16 -mabi=abi -mabicalls -mno-abicalls
-mxgot -mno-xgot -membedded-pic -mno-embedded-pic
-mgp32 -mgp64 -mfp32 -mfp64 -mhard-float -msoft-float
-msingle-float -mdouble-float -mint64 -mlong64 -mlong32
-Gnum -membedded-data -mno-embedded-data
-muninit-const-in-rodata -mno-uninit-const-in-rodata
-msplit-addresses -mno-split-addresses
-mexplicit-relocs -mno-explicit-relocs
-mrnames -mno-rnames
-mcheck-zero-division -mno-check-zero-division
-mmemcpy -mno-memcpy -mlong-calls -mno-long-calls
-mmad -mno-mad -mfused-madd -mno-fused-madd -nocpp
-mfix-sb1 -mno-fix-sb1 -mflush-func=func
-mno-flush-func -mbranch-likely -mno-branch-likely
i386 and x86-64 Options
-mtune=cpu-type -march=cpu-type
-mfpmath=unit
-masm=dialect -mno-fancy-math-387
-mno-fp-ret-in-387 -msoft-float -msvr3-shlib
-mno-wide-multiply -mrtd -malign-double
-mpreferred-stack-boundary=num
-mmmx -msse -msse2 -msse3 -m3dnow
-mthreads -mno-align-stringops -minline-all-stringops
-mpush-args -maccumulate-outgoing-args -m128bit-long-double
-m96bit-long-double -mregparm=num -momit-leaf-frame-pointer
-mno-red-zone -mno-tls-direct-seg-refs
-mcmodel=code-model
-m32 -m64
HPPA Options
-march=architecture-type
-mbig-switch -mdisable-fpregs -mdisable-indexing
-mfast-indirect-calls -mgas -mgnu-ld -mhp-ld
-mjump-in-delay -mlinker-opt -mlong-calls
-mlong-load-store -mno-big-switch -mno-disable-fpregs
-mno-disable-indexing -mno-fast-indirect-calls -mno-gas
-mno-jump-in-delay -mno-long-load-store
-mno-portable-runtime -mno-soft-float
-mno-space-regs -msoft-float -mpa-risc-1-0
-mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime
-mschedule=cpu-type -mspace-regs -msio -mwsio
-nolibdld -static -threads
Intel 960 Options
-mcpu-type -masm-compat -mclean-linkage
-mcode-align -mcomplex-addr -mleaf-procedures
-mic-compat -mic2.0-compat -mic3.0-compat
-mintel-asm -mno-clean-linkage -mno-code-align
-mno-complex-addr -mno-leaf-procedures
-mno-old-align -mno-strict-align -mno-tail-call
-mnumerics -mold-align -msoft-float -mstrict-align
-mtail-call
DEC Alpha Options
-mno-fp-regs -msoft-float -malpha-as -mgas
-mieee -mieee-with-inexact -mieee-conformant
-mfp-trap-mode=mode -mfp-rounding-mode=mode
-mtrap-precision=mode -mbuild-constants
-mcpu=cpu-type -mtune=cpu-type
-mbwx -mmax -mfix -mcix
-mfloat-vax -mfloat-ieee
-mexplicit-relocs -msmall-data -mlarge-data
-msmall-text -mlarge-text
-mmemory-latency=time
DEC Alpha/VMS Options
-mvms-return-codes
H8/300 Options
-mrelax -mh -ms -mn -mint32 -malign-300
SH Options
-m1 -m2 -m2e -m3 -m3e
-m4-nofpu -m4-single-only -m4-single -m4
-m5-64media -m5-64media-nofpu
-m5-32media -m5-32media-nofpu
-m5-compact -m5-compact-nofpu
-mb -ml -mdalign -mrelax
-mbigtable -mfmovd -mhitachi -mnomacsave
-mieee -misize -mpadstruct -mspace
-mprefergot -musermode
System V Options
-Qy -Qn -YP,paths -Ym,dir
ARC Options
-EB -EL
-mmangle-cpu -mcpu=cpu -mtext=text-section
-mdata=data-section -mrodata=readonly-data-section
TMS320C3x/C4x Options
-mcpu=cpu -mbig -msmall -mregparm -mmemparm
-mfast-fix -mmpyi -mbk -mti -mdp-isr-reload
-mrpts=count -mrptb -mdb -mloop-unsigned
-mparallel-insns -mparallel-mpy -mpreserve-float
V850 Options
-mlong-calls -mno-long-calls -mep -mno-ep
-mprolog-function -mno-prolog-function -mspace
-mtda=n -msda=n -mzda=n
-mapp-regs -mno-app-regs
-mdisable-callt -mno-disable-callt
-mv850e1
-mv850e
-mv850 -mbig-switch
NS32K Options
-m32032 -m32332 -m32532 -m32081 -m32381
-mmult-add -mnomult-add -msoft-float -mrtd -mnortd
-mregparam -mnoregparam -msb -mnosb
-mbitfield -mnobitfield -mhimem -mnohimem
AVR Options
-mmcu=mcu -msize -minit-stack=n -mno-interrupts
-mcall-prologues -mno-tablejump -mtiny-stack
MCore Options
-mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates
-mno-relax-immediates -mwide-bitfields -mno-wide-bitfields
-m4byte-functions -mno-4byte-functions -mcallgraph-data
-mno-callgraph-data -mslow-bytes -mno-slow-bytes -mno-lsim
-mlittle-endian -mbig-endian -m210 -m340 -mstack-increment
MMIX Options
-mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu
-mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols
-melf -mbranch-predict -mno-branch-predict -mbase-addresses
-mno-base-addresses -msingle-exit -mno-single-exit
IA-64 Options
-mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic
-mvolatile-asm-stop -mb-step -mregister-names -mno-sdata
-mconstant-gp -mauto-pic -minline-float-divide-min-latency
-minline-float-divide-max-throughput
-minline-int-divide-min-latency
-minline-int-divide-max-throughput
-minline-sqrt-min-latency -minline-sqrt-max-throughput
-mno-dwarf2-asm -mearly-stop-bits
-mfixed-range=register-range -mtls-size=tls-size
-mtune=cpu-type -mt -pthread -milp32 -mlp64
D30V Options
-mextmem -mextmemory -monchip -mno-asm-optimize
-masm-optimize -mbranch-cost=n -mcond-exec=n
S/390 and zSeries Options
-mtune=cpu-type -march=cpu-type
-mhard-float -msoft-float -mbackchain -mno-backchain
-msmall-exec -mno-small-exec -mmvcle -mno-mvcle
-m64 -m31 -mdebug -mno-debug -mesa -mzarch -mfused-madd -mno-fused-madd
CRIS Options
-mcpu=cpu -march=cpu -mtune=cpu
-mmax-stack-frame=n -melinux-stacksize=n
-metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects
-mstack-align -mdata-align -mconst-align
-m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -mno-gotplt
-melf -maout -melinux -mlinux -sim -sim2
-mmul-bug-workaround -mno-mul-bug-workaround
PDP-11 Options
-mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10
-mbcopy -mbcopy-builtin -mint32 -mno-int16
-mint16 -mno-int32 -mfloat32 -mno-float64
-mfloat64 -mno-float32 -mabshi -mno-abshi
-mbranch-expensive -mbranch-cheap
-msplit -mno-split -munix-asm -mdec-asm
Xstormy16 Options
-msim
Xtensa Options
-mconst16 -mno-const16
-mfused-madd -mno-fused-madd
-mtext-section-literals -mno-text-section-literals
-mtarget-align -mno-target-align
-mlongcalls -mno-longcalls
FRV Options
-mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64
-mhard-float -msoft-float
-malloc-cc -mfixed-cc -mdword -mno-dword
-mdouble -mno-double
-mmedia -mno-media -mmuladd -mno-muladd
-mlibrary-pic -macc-4 -macc-8
-mpack -mno-pack -mno-eflags -mcond-move -mno-cond-move
-mscc -mno-scc -mcond-exec -mno-cond-exec
-mvliw-branch -mno-vliw-branch
-mmulti-cond-exec -mno-multi-cond-exec -mnested-cond-exec
-mno-nested-cond-exec -mtomcat-stats
-mcpu=cpu
-fcall-saved-reg -fcall-used-reg
-ffixed-reg -fexceptions
-fnon-call-exceptions -funwind-tables
-fasynchronous-unwind-tables
-finhibit-size-directive -finstrument-functions
-fno-common -fno-ident
-fpcc-struct-return -fpic -fPIC -fpie -fPIE
-freg-struct-return -fshared-data -fshort-enums
-fshort-double -fshort-wchar
-fverbose-asm -fpack-struct -fstack-check
-fstack-limit-register=reg -fstack-limit-symbol=sym
-fargument-alias -fargument-noalias
-fargument-noalias-global -fleading-underscore
-ftls-model=model
-ftrapv -fwrapv -fbounds-check
Compilation can involve up to four stages: preprocessing, compilation proper, assembly and linking, always in that order. GCC is capable of preprocessing and compiling several files either into several assembler input files, or into one assembler input file; then each assembler input file produces an object file, and linking combines all the object files (those newly compiled, and those specified as input) into an executable file.
For any given input file, the file name suffix determines what kind of compilation is done:
.c.i.ii.m.mi.h.cc.cp.cxx.cpp.CPP.c++.C.hh.H.f.for.FOR.F.fpp.FPP.rSee Options Controlling the Kind of Output (Using and Porting GNU Fortran), for more details of the handling of
Fortran input files.
.ads.adb.s.SYou can specify the input language explicitly with the -x option:
-x language c c-header cpp-output
c++ c++-header c++-cpp-output
objective-c objective-c-header objc-cpp-output
assembler assembler-with-cpp
ada
f77 f77-cpp-input ratfor
java
treelang
-x none-pass-exit-codesIf 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.
-cBy 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.
-SBy 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.
-EInput files which don't require preprocessing are ignored.
-o fileIf you specify -o when compiling more than one input file, or you are producing an executable file as output, all the source files on the command line will be compiled at once.
If -o is not specified, the default is to put an executable file
in a.out, the object file for source.suffix in
source.o, its assembler file in source.s, and
all preprocessed C source on standard output.
-v-###-pipe--help--target-help--versionC++ source files conventionally use one of the suffixes .C, .cc, .cpp, .CPP, .c++, .cp, or .cxx; C++ header files often use .hh or .H; and preprocessed C++ files use the suffix .ii. GCC recognizes files with these names and compiles them as C++ programs even if you call the compiler the same way as for compiling C programs (usually with the name gcc).
However, C++ programs often require class libraries as well as a compiler that understands the C++ language—and under some circumstances, you might want to compile programs or header files from standard input, or otherwise without a suffix that flags them as C++ programs. You might also like to precompile a C header file with a .h extension to be used in C++ compilations. g++ is a program that calls GCC with the default language set to C++, and automatically specifies linking against the C++ library. On many systems, g++ is also installed with the name c++.
When you compile C++ programs, you may specify many of the same command-line options that you use for compiling programs in any language; or command-line options meaningful for C and related languages; or options that are meaningful only for C++ programs. See Options Controlling C Dialect, for explanations of options for languages related to C. See Options Controlling C++ Dialect, for explanations of options that are meaningful only for C++ programs.
The following options control the dialect of C (or languages derived from C, such as C++ and Objective-C) that the compiler accepts:
-ansiThis turns off certain features of GCC that are incompatible with ISO
C90 (when compiling C code), or of standard C++ (when compiling C++ code),
such as the asm and typeof keywords, and
predefined macros such as unix and vax that identify the
type of system you are using. It also enables the undesirable and
rarely used ISO trigraph feature. For the C compiler,
it disables recognition of C++ style // comments as well as
the inline keyword.
The alternate keywords __asm__, __extension__,
__inline__ and __typeof__ continue to work despite
-ansi. You would not want to use them in an ISO C program, of
course, but it is useful to put them in header files that might be included
in compilations done with -ansi. Alternate predefined macros
such as __unix__ and __vax__ are also available, with or
without -ansi.
The -ansi option does not cause non-ISO programs to be rejected gratuitously. For that, -pedantic is required in addition to -ansi. See Warning Options.
The macro __STRICT_ANSI__ is predefined when the -ansi
option is used. Some header files may notice this macro and refrain
from declaring certain functions or defining certain macros that the
ISO standard doesn't call for; this is to avoid interfering with any
programs that might use these names for other things.
Functions which would normally be built in but do not have semantics
defined by ISO C (such as alloca and ffs) are not built-in
functions with -ansi is used. See Other built-in functions provided by GCC, for details of the functions
affected.
-std=Even when this option is not specified, you can still use some of the
features of newer standards in so far as they do not conflict with
previous C standards. For example, you may use __restrict__ even
when -std=c99 is not specified.
The -std options specifying some version of ISO C have the same
effects as -ansi, except that features that were not in ISO C90
but are in the specified version (for example, // comments and
the inline keyword in ISO C99) are not disabled.
See Language Standards Supported by GCC, for details of
these standard versions.
-aux-info filenameBesides 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-asmasm, 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-functionGCC normally generates special code to handle certain built-in functions
more efficiently; for instance, calls to alloca may become single
instructions that adjust the stack directly, and calls to memcpy
may become inline copy loops. The resulting code is often both smaller
and faster, but since the function calls no longer appear as such, you
cannot set a breakpoint on those calls, nor can you change the behavior
of the functions by linking with a different library.
With the -fno-builtin-function option only the built-in function function is disabled. function must not begin with __builtin_. If a function is named this is not built-in in this version of GCC, this option is ignored. There is no corresponding -fbuiltin-function option; if you wish to enable built-in functions selectively when using -fno-builtin or -ffreestanding, you may define macros such as:
#define abs(n) __builtin_abs ((n))
#define strcpy(d, s) __builtin_strcpy ((d), (s))
-fhostedmain has a return
type of int. Examples are nearly everything except a kernel.
This is equivalent to -fno-freestanding.
-ffreestandingmain. The most obvious example is an OS kernel.
This is equivalent to -fno-hosted.
See Language Standards Supported by GCC, for details of
freestanding and hosted environments.
-fms-extensions-trigraphs-no-integrated-cppThe semantics of this option will change if "cc1", "cc1plus", and "cc1obj" are merged.
-traditional-traditional-cpp-fcond-mismatch-funsigned-charchar 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-charchar 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-bitfieldssigned or unsigned. By
default, such a bit-field is signed, because this is consistent: the
basic integer types such as int are signed types.
-fwritable-stringsWriting into string constants is a very bad idea; “constants” should be constant.
This option is deprecated.
This section describes the command-line options that are only meaningful
for C++ programs; but you can also use most of the GNU compiler options
regardless of what language your program is in. For example, you
might compile a file firstClass.C like this:
g++ -g -frepo -O -c firstClass.C
In this example, only -frepo is an option meant only for C++ programs; you can use the other options with any language supported by GCC.
Here is a list of options that are only for compiling C++ programs:
-fabi-version=nThe default is version 2.
-fno-access-control-fcheck-newoperator new is non-null
before attempting to modify the storage allocated. This check is
normally unnecessary because the C++ standard specifies that
operator new will only return 0 if it is declared
throw(), in which case the compiler will always check the
return value even without this option. In all other cases, when
operator new has a non-empty exception specification, memory
exhaustion is signalled by throwing std::bad_alloc. See also
new (nothrow).
-fconserve-spacemain() 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-stringschar * instead of type const
char *. By default, G++ uses type const char * as required by
the standard. Even if you use -fno-const-strings, you cannot
actually modify the value of a string constant, unless you also use
-fwritable-strings.
This option might be removed in a future release of G++. For maximum
portability, you should structure your code so that it works with
string constants that have type const char *.
-fno-elide-constructors-fno-enforce-eh-specs-ffor-scope-fno-for-scopeThe 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-keywordstypeof 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-fno-implicit-inline-templates-fno-implement-inlines-fms-extensions-fno-nonansi-builtinsffs, alloca, _exit,
index, bzero, conjf, and other related functions.
-fno-operator-namesand, bitand,
bitor, compl, not, or and xor as
synonyms as keywords.
-fno-optional-diags-fpermissive-frepo-fno-rtti-fstats-ftemplate-depth-n-fuse-cxa-atexit__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.
-fno-weak-nostdinc++In addition, these optimization, warning, and code generation options have meanings only for C++ programs:
-fno-default-inline-Wabi (C++ only)You should rewrite your code to avoid these warnings if you are concerned about the fact that code generated by G++ may not be binary compatible with code generated by other compilers.
The known incompatibilities at this point include:
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
asA::f1; other compilers will not. You can avoid this problem
by explicitly padding A so that its size is a multiple of the
byte size on your platform; that will cause G++ and other compilers to
layout B identically.
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.
union U { int i : 4096; };
Assuming that an int does not have 4096 bits, G++ will make the
union too small by the number of bits in an int.
struct A {};
struct B {
A a;
virtual void f ();
};
struct C : public B, public A {};
G++ will place the A base class of C at a nonzero offset;
it should be placed at offset zero. G++ mistakenly believes that the
A data member of B is already at offset zero.
typename or
template template parameters can be mangled incorrectly.
template <typename Q>
void f(typename Q::X) {}
template <template <typename> class Q>
void f(typename Q<int>::X) {}
Instantiations of these templates may be mangled incorrectly.
-Wctor-dtor-privacy (C++ only)-Wnon-virtual-dtor (C++ only)-Wreorder (C++ only) struct A {
int i;
int j;
A(): j (0), i (1) { }
};
The compiler will rearrange the member initializers for i and j to match the declaration order of the members, emitting a warning to that effect. This warning is enabled by -Wall.
The following -W... options are not affected by -Wall.
-Weffc++ (C++ only)operator= return a reference to *this.
Also warn about violations of the following style guidelines from Scott Meyers' More Effective C++ book:
&&, ||, or ,.
When selecting this option, be aware that the standard library
headers do not obey all of these guidelines; use grep -v
to filter out those warnings.
-Wno-deprecated (C++ only)-Wno-non-template-friend (C++ only)-Wold-style-cast (C++ only)-Woverloaded-virtual (C++ only) struct A {
virtual void f();
};
struct B: public A {
void f(int);
};
the A class version of f is hidden in B, and code
like:
B* b;
b->f();
will fail to compile.
-Wno-pmf-conversions (C++ only)-Wsign-promo (C++ only) 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 =.
(NOTE: This manual does not describe the Objective-C language itself. See http://gcc.gnu.org/readings.html for references.)
This section describes the command-line options that are only meaningful
for Objective-C programs, but you can also use most of the GNU compiler
options regardless of what language your program is in. For example,
you might compile a file some_class.m like this:
gcc -g -fgnu-runtime -O -c some_class.m
In this example, -fgnu-runtime is an option meant only for Objective-C programs; you can use the other options with any language supported by GCC.
Here is a list of options that are only for compiling Objective-C programs:
-fconstant-string-class=class-name@"...". The default
class name is NXConstantString if the GNU runtime is being used, and
NSConstantString if the NeXT runtime is being used (see below). The
-fconstant-cfstrings option, if also present, will override the
-fconstant-string-class setting and cause @"..." literals
to be laid out as constant CoreFoundation strings.
-fgnu-runtime-fnext-runtime__NEXT_RUNTIME__ is predefined if (and only if) this option is
used.
-fno-nil-receivers[receiver message:arg]) in this translation unit ensure that the receiver
is not nil. This allows for more efficient entry points in the runtime to be
used. Currently, this option is only available in conjunction with
the NeXT runtime on Mac OS X 10.3 and later.
-fobjc-exceptions @try {
...
@throw expr;
...
}
@catch (AnObjCClass *exc) {
...
@throw expr;
...
@throw;
...
}
@catch (AnotherClass *exc) {
...
}
@catch (id allOthers) {
...
}
@finally {
...
@throw expr;
...
}
The @throw statement may appear anywhere in an Objective-C or
Objective-C++ program; when used inside of a @catch block, the
@throw may appear without an argument (as shown above), in which case
the object caught by the @catch will be rethrown.
Note that only (pointers to) Objective-C objects may be thrown and
caught using this scheme. When an object is thrown, it will be caught
by the nearest @catch clause capable of handling objects of that type,
analogously to how catch blocks work in C++ and Java. A
@catch(id ...) clause (as shown above) may also be provided to catch
any and all Objective-C exceptions not caught by previous @catch
clauses (if any).
The @finally clause, if present, will be executed upon exit from the
immediately preceding @try ... @catch section. This will happen
regardless of whether any exceptions are thrown, caught or rethrown
inside the @try ... @catch section, analogously to the behavior
of the finally clause in Java.
There are several caveats to using the new exception mechanism:
NS_HANDLER-style
idioms provided by the NSException class, the new
exceptions can only be used on Mac OS X 10.3 (Panther) and later
systems, due to additional functionality needed in the (NeXT) Objective-C
runtime.
@throw an exception
from Objective-C and catch it in C++, or vice versa
(i.e., throw ... @catch).
The -fobjc-exceptions switch also enables the use of synchronization blocks for thread-safe execution:
@synchronized (ObjCClass *guard) {
...
}
Upon entering the @synchronized block, a thread of execution shall
first check whether a lock has been placed on the corresponding guard
object by another thread. If it has, the current thread shall wait until
the other thread relinquishes its lock. Once guard becomes available,
the current thread will place its own lock on it, execute the code contained in
the @synchronized block, and finally relinquish the lock (thereby
making guard available to other threads).
Unlike Java, Objective-C does not allow for entire methods to be marked
@synchronized. Note that throwing exceptions out of
@synchronized blocks is allowed, and will cause the guarding object
to be unlocked properly.
-freplace-objc-classes-fzero-linkobjc_getClass("...") (when the name of the class is known at
compile time) with static class references that get initialized at load time,
which improves run-time performance. Specifying the -fzero-link flag
suppresses this behavior and causes calls to objc_getClass("...")
to be retained. This is useful in Zero-Link debugging mode, since it allows
for individual class implementations to be modified during program execution.
-gen-decls-Wno-protocol-Wno-protocol option, then
methods inherited from the superclass are considered to be implemented,
and no warning is issued for them.
-Wselector@selector(...)
expression, and a corresponding method for that selector has been found
during compilation. Because these checks scan the method table only at
the end of compilation, these warnings are not produced if the final
stage of compilation is not reached, for example because an error is
found during compilation, or because the -fsyntax-only option is
being used.
-Wundeclared-selector@selector(...) expression referring to an
undeclared selector is found. A selector is considered undeclared if no
method with that name has been declared before the
@selector(...) expression, either explicitly in an
@interface or @protocol declaration, or implicitly in
an @implementation section. This option always performs its
checks as soon as a @selector(...) expression is found,
while -Wselector only performs its checks in the final stage of
compilation. This also enforces the coding style convention
that methods and selectors must be declared before being used.
-print-objc-runtime-infoTraditionally, diagnostic messages have been formatted irrespective of the output device's aspect (e.g. its width, ...). The options described below can be used to control the diagnostic messages formatting algorithm, e.g. how many characters per line, how often source location information should be reported. Right now, only the C++ front end can honor these options. However it is expected, in the near future, that the remaining front ends would be able to digest them correctly.
-fmessage-length=n-fdiagnostics-show-location=once-fdiagnostics-show-location=every-lineWarnings 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 C++ Dialect Options and Objective-C Dialect Options.
-fsyntax-only-pedanticValid ISO C and ISO C++ programs should compile properly with or without this option (though a rare few will require -ansi or a -std option specifying the required version of ISO C). However, without this option, certain GNU extensions and traditional C and C++ features are supported as well. With this option, they are rejected.
-pedantic does not cause warning messages for use of the
alternate keywords whose names begin and end with __. Pedantic
warnings are also disabled in the expression that follows
__extension__. However, only system header files should use
these escape routes; application programs should avoid them.
See Alternate Keywords.
Some users try to use -pedantic to check programs for strict ISO C conformance. They soon find that it does not do quite what they want: it finds some non-ISO practices, but not all—only those for which ISO C requires a diagnostic, and some others for which diagnostics have been added.
A feature to report any failure to conform to ISO C might be useful in some instances, but would require considerable additional work and would be quite different from -pedantic. We don't have plans to support such a feature in the near future.
Where the standard specified with -std represents a GNU
extended dialect of C, such as gnu89 or gnu99, there is a
corresponding base standard, the version of ISO C on which the GNU
extended dialect is based. Warnings from -pedantic are given
where they are required by the base standard. (It would not make sense
for such warnings to be given only for features not in the specified GNU
C dialect, since by definition the GNU dialects of C include all
features the compiler supports with the given option, and there would be
nothing to warn about.)
-pedantic-errors-w-Wno-import-Wchar-subscriptschar. This is a common cause
of error, as programmers often forget that this type is signed on some
machines.
-Wcomment-Wformatprintf 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 (see Function Attributes), in the printf,
scanf, strftime and strfmon (an X/Open extension,
not in the C standard) families.
The formats are checked against the format features supported by GNU
libc version 2.2. These include all ISO C90 and C99 features, as well
as features from the Single Unix Specification and some BSD and GNU
extensions. Other library implementations may not support all these
features; GCC does not support warning about features that go beyond a
particular library's limitations. However, if -pedantic is used
with -Wformat, warnings will be given about format features not
in the selected standard version (but not for strfmon formats,
since those are not in any version of the C standard). See Options Controlling C Dialect.
Since -Wformat also checks for null format arguments for several functions, -Wformat also implies -Wnonnull.
-Wformat is included in -Wall. For more control over some
aspects of format checking, the options -Wformat-y2k,
-Wno-format-extra-args, -Wno-format-zero-length,
-Wformat-nonliteral, -Wformat-security, and
-Wformat=2 are available, but are not included in -Wall.
-Wformat-y2kstrftime
formats which may yield only a two-digit year.
-Wno-format-extra-argsprintf or scanf format function. The C standard specifies
that such arguments are ignored.
Where the unused arguments lie between used arguments that are
specified with $ operand number specifications, normally
warnings are still given, since the implementation could not know what
type to pass to va_arg to skip the unused arguments. However,
in the case of scanf formats, this option will suppress the
warning if the unused arguments are all pointers, since the Single
Unix Specification says that such unused arguments are allowed.
-Wno-format-zero-length-Wformat-nonliteralva_list.
-Wformat-securityprintf and scanf functions where the
format string is not a string literal and there are no format arguments,
as in printf (foo);. This may be a security hole if the format
string came from untrusted input and contains %n. (This is
currently a subset of what -Wformat-nonliteral warns about, but
in future warnings may be added to -Wformat-security that are not
included in -Wformat-nonliteral.)
-Wformat=2-Wnonnullnonnull function attribute.
-Wnonnull is included in -Wall and -Wformat. It
can be disabled with the -Wno-nonnull option.
-Winit-self (C, C++, and Objective-C only)For example, GCC will warn about i being uninitialized in the
following snippet only when -Winit-self has been specified:
int f()
{
int i = i;
return i;
}
-Wimplicit-int-Wimplicit-function-declaration-Werror-implicit-function-declaration-Wimplicit-Wmain-Wmissing-braces int a[2][2] = { 0, 1, 2, 3 };
int b[2][2] = { { 0, 1 }, { 2, 3 } };
-WparenthesesAlso 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-pointThe C standard defines the order in which expressions in a C program are
evaluated in terms of sequence points, which represent a partial
ordering between the execution of parts of the program: those executed
before the sequence point, and those executed after it. These occur
after the evaluation of a full expression (one which is not part of a
larger expression), after the evaluation of the first operand of a
&&, ||, ? : or , (comma) operator, before a
function is called (but after the evaluation of its arguments and the
expression denoting the called function), and in certain other places.
Other than as expressed by the sequence point rules, the order of
evaluation of subexpressions of an expression is not specified. All
these rules describe only a partial order rather than a total order,
since, for example, if two functions are called within one expression
with no sequence point between them, the order in which the functions
are called is not specified. However, the standards committee have
ruled that function calls do not overlap.
It is not specified when between sequence points modifications to the values of objects take effect. Programs whose behavior depends on this have undefined behavior; the C standard specifies that “Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.”. If a program breaks these rules, the results on any particular implementation are entirely unpredictable.
Examples of code with undefined behavior are a = a++;, a[n]
= b[n++] and a[i++] = i;. Some more complicated cases are not
diagnosed by this option, and it may give an occasional false positive
result, but in general it has been found fairly effective at detecting
this sort of problem in programs.
The present implementation of this option only works for C programs. A future implementation may also work for C++ programs.
The C standard is worded confusingly, therefore there is some debate
over the precise meaning of the sequence point rules in subtle cases.
Links to discussions of the problem, including proposed formal
definitions, may be found on the GCC readings page, at
http://gcc.gnu.org/readings.html.
-Wreturn-typeint. Also warn about any return statement with no
return-value in a function whose return-type is not void.
For C++, a function without return type always produces a diagnostic
message, even when -Wno-return-type is specified. The only
exceptions are main and functions defined in system headers.
-Wswitchswitch statement has an index of enumerated type
and lacks a case for one or more of the named codes of that
enumeration. (The presence of a default label prevents this
warning.) case labels outside the enumeration range also
provoke warnings when this option is used.
-Wswitch-defaultswitch statement does not have a default
case.
-Wswitch-enumswitch statement has an index of enumerated type
and lacks a case for one or more of the named codes of that
enumeration. case labels outside the enumeration range also
provoke warnings when this option is used.
-Wtrigraphs-Wunused-function-Wunused-labelTo suppress this warning use the unused attribute
(see Variable Attributes).
-Wunused-parameterTo suppress this warning use the unused attribute
(see Variable Attributes).
-Wunused-variableTo suppress this warning use the unused attribute
(see Variable Attributes).
-Wunused-valueTo suppress this warning cast the expression to void.
-WunusedIn order to get a warning about an unused function parameter, you must
either specify -Wextra -Wunused (note that -Wall implies
-Wunused), or separately specify -Wunused-parameter.
-Wuninitializedsetjmp call.
These warnings are possible only in optimizing compilation, because they require data flow information that is computed only when optimizing. If you don't specify -O, you simply won't get these warnings.
If you want to warn about code which uses the uninitialized value of the variable in its own initializer, use the -Winit-self option.
These warnings occur only for variables that are candidates for
register allocation. Therefore, they do not occur for a variable that
is declared volatile, or whose address is taken, or whose size
is other than 1, 2, 4 or 8 bytes. Also, they do not occur for
structures, unions or arrays, even when they are in registers.
Note that there may be no warning about a variable that is used only to compute a value that itself is never used, because such computations may be deleted by data flow analysis before the warnings are printed.
These warnings are made optional because GCC is not smart enough to see all the reasons why the code might be correct despite appearing to have an error. Here is one example of how this can happen:
{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}
If the value of y is always 1, 2 or 3, then x is
always initialized, but GCC doesn't know this. Here is
another common case:
{
int save_y;
if (change_y) save_y = y, y = new_y;
...
if (change_y) y = save_y;
}
This has no bug because save_y is used only if it is set.
This option also warns when a non-volatile automatic variable might be
changed by a call to longjmp. These warnings as well are possible
only in optimizing compilation.
The compiler sees only the calls to setjmp. It cannot know
where longjmp will be called; in fact, a signal handler could
call it at any point in the code. As a result, you may get a warning
even when there is in fact no problem because longjmp cannot
in fact be called at the place which would cause a problem.
Some spurious warnings can be avoided if you declare all the functions
you use that never return as noreturn. See Function Attributes.
-Wunknown-pragmas-Wstrict-aliasing-WallThe following -W... options are not implied by -Wall. Some of them warn about constructions that users generally do not consider questionable, but which occasionally you might wish to check for; others warn about constructions that are necessary or hard to avoid in some cases, and there is no simple way to modify the code to suppress the warning.
-Wextra foo (a)
{
if (a > 0)
return a;
}
static are not the first things in
a declaration. According to the C Standard, this usage is obsolescent.
const.
Such a type qualifier has no effect, since the value returned by a
function is not an lvalue. (But don't warn about the GNU extension of
volatile void return types. That extension will be warned about
if -pedantic is specified.)
x.h would be implicitly initialized to zero:
struct s { int f, g, h; };
struct s x = { 3, 4 };
void foo(bar) { }
-Wno-div-by-zero-Wsystem-headers-Wfloat-equalThe idea behind this is that sometimes it is convenient (for the
programmer) to consider floating-point values as approximations to
infinitely precise real numbers. If you are doing this, then you need
to compute (by analyzing the code, or in some other way) the maximum or
likely maximum error that the computation introduces, and allow for it
when performing comparisons (and when producing output, but that's a
different problem). In particular, instead of testing for equality, you
would check to see whether the two values have ranges that overlap; and
this is done with the relational operators, so equality comparisons are
probably mistaken.
-Wtraditional (C only)<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.
switch statement has an operand of type long.
static function declaration follows a static one.
This construct is not accepted by some traditional C compilers.
__STDC__ to avoid missing
initializer warnings and relies on default initialization to zero in the
traditional C case.
PARAMS and
VPARAMS. This warning is also bypassed for nested functions
because that feature is already a GCC extension and thus not relevant to
traditional C compatibility.
-Wdeclaration-after-statement (C only)-Wundef-Wendif-labels-Wshadow-Wlarger-than-len-Wpointer-arithvoid. GNU C assigns these types a size of 1, for
convenience in calculations with void * pointers and pointers
to functions.
-Wbad-function-cast (C only)int malloc() is cast to anything *.
-Wcast-qualconst char * is cast
to an ordinary char *.
-Wcast-alignchar * is cast to
an int * on machines where integers can only be accessed at
two- or four-byte boundaries.
-Wwrite-stringsconst
char[length] so that
copying the address of one into a non-const char *
pointer will get a warning; when compiling C++, warn about the
deprecated conversion from string constants to char *.
These warnings will help you find at
compile time code that can try to write into a string constant, but
only if you have been very careful about using const in
declarations and prototypes. Otherwise, it will just be a nuisance;
this is why we did not make -Wall request these warnings.
-WconversionAlso, warn if a negative integer constant expression is implicitly
converted to an unsigned type. For example, warn about the assignment
x = -1 if x is unsigned. But do not warn about explicit
casts like (unsigned) -1.
-Wsign-compare-Waggregate-return-Wstrict-prototypes (C only)-Wold-style-definition (C only)-Wmissing-prototypes (C only)-Wmissing-declarations (C only)-Wmissing-noreturnnoreturn.
Note these are only possible candidates, not absolute ones. Care should
be taken to manually verify functions actually do not ever return before
adding the noreturn attribute, otherwise subtle code generation
bugs could be introduced. You will not get a warning for main in
hosted C environments.
-Wmissing-format-attributeformat attributes. Note these are only possible
candidates, not absolute ones. GCC will guess that format
attributes might be appropriate for any function that calls a function
like vprintf or vscanf, but this might not always be the
case, and some functions for which format attributes are
appropriate may not be detected. This option has no effect unless
-Wformat is enabled (possibly by -Wall).
-Wno-multichar-Wno-deprecated-declarationsdeprecated attribute.
(see Function Attributes, see Variable Attributes,
see Type Attributes.)
-Wpackedf.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-Wredundant-decls-Wnested-externs (C only)extern declaration is encountered within a function.
-Wunreachable-codeThis option is intended to warn when the compiler detects that at least a whole line of source code will never be executed, because some condition is never satisfied or because it is after a procedure that never returns.
It is possible for this option to produce a warning even though there are circumstances under which part of the affected line can be executed, so care should be taken when removing apparently-unreachable code.
For instance, when a function is inlined, a warning may mean that the line is unreachable in only one inlined copy of the function.
This option is not made part of -Wall because in a debugging
version of a program there is often substantial code which checks
correct functioning of the program and is, hopefully, unreachable
because the program does work. Another common use of unreachable
code is to provide behavior which is selectable at compile-time.
-WinlineThe compiler uses a variety of heuristics to determine whether or not
to inline a function. For example, the compiler takes into account
the size of the function being inlined and the the amount of inlining
that has already been done in the current function. Therefore,
seemingly insignificant changes in the source program can cause the
warnings produced by -Winline to appear or disappear.
-Wno-invalid-offsetof (C++ only)The restrictions on offsetof may be relaxed in a future version
of the C++ standard.
-Winvalid-pch-Wlong-long-Wdisabled-optimization-WerrorGCC has various special options that are used for debugging either your program or GCC:
-gOn most systems that use stabs format, -g enables use of extra debugging information that only GDB can use; this extra information makes debugging work better in GDB but will probably make other debuggers crash or refuse to read the program. If you want to control for certain whether to generate the extra information, use -gstabs+, -gstabs, -gxcoff+, -gxcoff, or -gvms (see below).
Unlike most other C compilers, GCC allows you to use -g with -O. The shortcuts taken by optimized code may occasionally produce surprising results: some variables you declared may not exist at all; flow of control may briefly move where you did not expect it; some statements may not be executed because they compute constant results or their values were already at hand; some statements may execute in different places because they were moved out of loops.
Nevertheless it proves possible to debug optimized output. This makes it reasonable to use the optimizer for programs that might have bugs.
The following options are useful when GCC is generated with the
capability for more than one debugging format.
-ggdb-gstabs-feliminate-unused-debug-symbols-gstabs+-gcoff-gxcoff-gxcoff+-gdwarf-2-gvms-glevel-ggdblevel-gstabslevel-gcofflevel-gxcofflevel-gvmslevelLevel 1 produces minimal information, enough for making backtraces in parts of the program that you don't plan to debug. This includes descriptions of functions and external variables, but no information about local variables and no line numbers.
Level 3 includes extra information, such as all the macro definitions present in the program. Some debuggers support macro expansion when you use -g3.
Note that in order to avoid confusion between DWARF1 debug level 2,
and DWARF2 -gdwarf-2 does not accept a concatenated debug
level. Instead use an additional -glevel option to
change the debug level for DWARF2.
-feliminate-dwarf2-dups-p-pg-Q-ftime-report-fmem-report-fprofile-arcsfork calls are detected and correctly handled (double counting
will not happen).
With -fprofile-arcs, for each function of your program GCC
creates a program flow graph, then finds a spanning tree for the graph.
Only arcs that are not on the spanning tree have to be instrumented: the
compiler adds code to count the number of times that these arcs are
executed. When an arc is the only exit or only entrance to a block, the
instrumentation code can be added to the block; otherwise, a new basic
block must be created to hold the instrumentation code.
-ftest-coverage-dlettersADDRESSOF codes, to file.07.addressof.
-fdump-unnumbered-fdump-translation-unit (C and C++ only)-fdump-translation-unit-options (C and C++ only)-fdump-class-hierarchy (C++ only)-fdump-class-hierarchy-options (C++ only)-fdump-tree-switch (C++ only)-fdump-tree-switch-options (C++ only)The following tree dumps are possible:
-frandom-seed=stringThe string should be different for every file you compile.
-fsched-verbose=nFor n greater than zero, -fsched-verbose outputs the
same information as -dRS. For n greater than one, it
also output basic block probabilities, detailed ready list information
and unit/insn info. For n greater than two, it includes RTL
at abort point, control-flow and regions info. And for n over
four, -fsched-verbose also includes dependence info.
-save-temps-time # 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-multi-directory-print-multi-lib-print-prog-name=program-print-libgcc-file-nameThis 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-dirsThis is useful when gcc prints the error message
installation problem, cannot exec cpp0: No such file or directory.
To resolve this you either need to put cpp0 and the other compiler
components where gcc expects to find them, or you can set the environment
variable GCC_EXEC_PREFIX to the directory where you installed them.
Don't forget the trailing '/'.
See Environment Variables.
-dumpmachine-dumpversion-dumpspecs-feliminate-unused-debug-typesThese options control various sorts of optimizations.
Without any optimization option, the compiler's goal is to reduce the cost of compilation and to make debugging produce the expected results. Statements are independent: if you stop the program with a breakpoint between statements, you can then assign a new value to any variable or change the program counter to any other statement in the function and get exactly the results you would expect from the source code.
Turning on optimization flags makes the compiler attempt to improve the performance and/or code size at the expense of compilation time and possibly the ability to debug the program.
The compiler performs optimization based on the knowledge it has of the program. Using the -funit-at-a-time flag will allow the compiler to consider information gained from later functions in the file when compiling a function. Compiling multiple files at once to a single output file (and using -funit-at-a-time) will allow the compiler to use information gained from all of the files when compiling each of them.
Not all optimizations are controlled directly by a flag. Only optimizations that have a flag are listed.
-O-O1With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time.
-O turns on the following optimization flags:
-fdefer-pop
-fmerge-constants
-fthread-jumps
-floop-optimize
-fif-conversion
-fif-conversion2
-fdelayed-branch
-fguess-branch-probability
-fcprop-registers
-O also turns on -fomit-frame-pointer on machines
where doing so does not interfere with debugging.
-O2-O2 turns on all optimization flags specified by -O. It also turns on the following optimization flags:
-fforce-mem
-foptimize-sibling-calls
-fstrength-reduce
-fcse-follow-jumps -fcse-skip-blocks
-frerun-cse-after-loop -frerun-loop-opt
-fgcse -fgcse-lm -fgcse-sm -fgcse-las
-fdelete-null-pointer-checks
-fexpensive-optimizations
-fregmove
-fschedule-insns -fschedule-insns2
-fsched-interblock -fsched-spec
-fcaller-saves
-fpeephole2
-freorder-blocks -freorder-functions
-fstrict-aliasing
-funit-at-a-time
-falign-functions -falign-jumps
-falign-loops -falign-labels
-fcrossjumping
Please note the warning under -fgcse about
invoking -O2 on programs that use computed gotos.
-O3-O0-Os-Os disables the following optimization flags:
-falign-functions -falign-jumps -falign-loops
-falign-labels -freorder-blocks -fprefetch-loop-arrays
If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.
Options of the form -fflag specify machine-independent flags. Most flags have both positive and negative forms; the negative form of -ffoo would be -fno-foo. In the table below, only one of the forms is listed—the one you typically will use. You can figure out the other form by either removing no- or adding it.
The following options control specific optimizations. They are either activated by -O options or are related to ones that are. You can use the following flags in the rare cases when “fine-tuning” of optimizations to be performed is desired.
-fno-default-inline-fno-defer-popDisabled at levels -O, -O2, -O3, -Os.
-fforce-memEnabled at levels -O2, -O3, -Os.
-fforce-addr-fomit-frame-pointerOn 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. See Register Usage (GNU Compiler Collection (GCC) Internals).
Enabled at levels -O, -O2, -O3, -Os.
-foptimize-sibling-callsEnabled at levels -O2, -O3, -Os.
-fno-inlineinline 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-functionsIf all calls to a given function are integrated, and the function is
declared static, then the function is normally not output as
assembler code in its own right.
Enabled at level -O3.
-finline-limit=nInlining is actually controlled by a number of parameters, which may be specified individually by using --param name=value. The -finline-limit=n option sets some of these parameters as follows:
max-inline-insns-singlemax-inline-insns-automin-inline-insnsmax-inline-insns-rtlSee below for a documentation of the individual parameters controlling inlining.
Note: pseudo instruction represents, in this particular context, an
abstract measurement of function's size. In no way, it represents a count
of assembly instructions and as such its exact meaning might change from one
release to an another.
-fkeep-inline-functionsstatic, nevertheless output a separate run-time
callable version of the function. This switch does not affect
extern inline functions.
-fkeep-static-constsstatic const when optimization isn't turned
on, even if the variables aren't referenced.
GCC enables this option by default. If you want to force the compiler to
check if the variable was referenced, regardless of whether or not
optimization is turned on, use the -fno-keep-static-consts option.
-fmerge-constantsThis option is the default for optimized compilation if the assembler and linker support it. Use -fno-merge-constants to inhibit this behavior.
Enabled at levels -O, -O2, -O3, -Os.
-fmerge-all-constantsThis option implies -fmerge-constants. In addition to
-fmerge-constants this considers e.g. even constant initialized
arrays or initialized constant variables with integral or floating point
types. Languages like C or C++ require each non-automatic variable to
have distinct location, so using this option will result in non-conforming
behavior.
-fnew-ra-fno-branch-count-regThe default is -fbranch-count-reg, enabled when
-fstrength-reduce is enabled.
-fno-function-cseThis option results in less efficient code, but some strange hacks that alter the assembler output may be confused by the optimizations performed when this option is not used.
The default is -ffunction-cse
-fno-zero-initialized-in-bssThis option turns off this behavior because some programs explicitly rely on variables going to the data section. E.g., so that the resulting executable can find the beginning of that section and/or make assumptions based on that.
The default is -fzero-initialized-in-bss.
-fstrength-reduceEnabled at levels -O2, -O3, -Os.
-fthread-jumpsEnabled at levels -O, -O2, -O3, -Os.
-fcse-follow-jumpsif statement with an
else clause, CSE will follow the jump when the condition
tested is false.
Enabled at levels -O2, -O3, -Os.
-fcse-skip-blocksif statement with no else clause,
-fcse-skip-blocks causes CSE to follow the jump around the
body of the if.
Enabled at levels -O2, -O3, -Os.
-frerun-cse-after-loopEnabled at levels -O2, -O3, -Os.
-frerun-loop-optEnabled at levels -O2, -O3, -Os.
-fgcseNote: When compiling a program using computed gotos, a GCC extension, you may get better runtime performance if you disable the global common subexpression elimination pass by adding -fno-gcse to the command line.
Enabled at levels -O2, -O3, -Os.
-fgcse-lmEnabled by default when gcse is enabled.
-fgcse-smEnabled by default when gcse is enabled.
-fgcse-lasEnabled by default when gcse is enabled.
-floop-optimizeEnabled at levels -O, -O2, -O3, -Os.
-fcrossjumpingEnabled at levels -O, -O2, -O3, -Os.
-fif-conversionif-conversion2.
Enabled at levels -O, -O2, -O3, -Os.
-fif-conversion2Enabled at levels -O, -O2, -O3, -Os.
-fdelete-null-pointer-checksIn some environments, this assumption is not true, and programs can safely dereference null pointers. Use -fno-delete-null-pointer-checks to disable this optimization for programs which depend on that behavior.
Enabled at levels -O2, -O3, -Os.
-fexpensive-optimizationsEnabled at levels -O2, -O3, -Os.
-foptimize-register-move-fregmoveNote -fregmove and -foptimize-register-move are the same optimization.
Enabled at levels -O2, -O3, -Os.
-fdelayed-branchEnabled at levels -O, -O2, -O3, -Os.
-fschedule-insnsEnabled at levels -O2, -O3, -Os.
-fschedule-insns2Enabled at levels -O2, -O3, -Os.
-fno-sched-interblock-fno-sched-spec-fsched-spec-load-fsched-spec-load-dangerous-fsched-stalled-insns=n-fsched-stalled-insns-dep=n-fsched2-use-superblocksThis only makes sense when scheduling after register allocation, i.e. with
-fschedule-insns2 or at -O2 or higher.
-fsched2-use-tracesThis mode should produce faster but significantly longer programs. Also
without -fbranch-probabilities the traces constructed may not match the
reality and hurt the performance. This only makes
sense when scheduling after register allocation, i.e. with
-fschedule-insns2 or at -O2 or higher.
-fcaller-savesThis option is always enabled by default on certain machines, usually those which have no call-preserved registers to use instead.
Enabled at levels -O2, -O3, -Os.
-fmove-all-movables-freduce-all-givsNote: When compiling programs written in Fortran, -fmove-all-movables and -freduce-all-givs are enabled by default when you use the optimizer.
These options may generate better or worse code; results are highly dependent on the structure of loops within the source code.
These two options are intended to be removed someday, once they have helped determine the efficacy of various approaches to improving loop optimizations.
Please contact gcc@gcc.gnu.org, and describe how use of
these options affects the performance of your production code.
Examples of code that runs slower when these options are
enabled are very valuable.
-fno-peephole-fno-peephole2-fpeephole is enabled by default.
-fpeephole2 enabled at levels -O2, -O3, -Os.
-fno-guess-branch-probabilitySometimes GCC will opt to use a randomized model to guess branch probabilities, when none are available from either profiling feedback (-fprofile-arcs) or __builtin_expect. This means that different runs of the compiler on the same program may produce different object code.
In a hard real-time system, people don't want different runs of the compiler to produce code that has different behavior; minimizing non-determinism is of paramount import. This switch allows users to reduce non-determinism, possibly at the expense of inferior optimization.
The default is -fguess-branch-probability at levels
-O, -O2, -O3, -Os.
-freorder-blocksEnabled at levels -O2, -O3.
-freorder-functions.text.hot for most frequently executed functions and
.text.unlikely for unlikely executed functions. Reordering is done by
the linker so object file format must support named sections and linker must
place them in a reasonable way.
Also profile feedback must be available in to make this option effective. See -fprofile-arcs for details.
Enabled at levels -O2, -O3, -Os.
-fstrict-aliasingunsigned int can alias an int, but not a
void* or a double. A character type may alias any other
type.
Pay special attention to code like this:
union a_union {
int i;
double d;
};
int f() {
a_union t;
t.d = 3.0;
return t.i;
}
The practice of reading from a different union member than the one most recently written to (called “type-punning”) is common. Even with -fstrict-aliasing, type-punning is allowed, provided the memory is accessed through the union type. So, the code above will work as expected. However, this code might not:
int f() {
a_union t;
int* ip;
t.d = 3.0;
ip = &t.i;
return *ip;
}
Every language that wishes to perform language-specific alias analysis
should define a function that computes, given an tree
node, an alias set for the node. Nodes in different alias sets are not
allowed to alias. For an example, see the C front-end function
c_get_alias_set.
Enabled at levels -O2, -O3, -Os.
-falign-functions-falign-functions=n-fno-align-functions and -falign-functions=1 are equivalent and mean that functions will not be aligned.
Some assemblers only support this flag when n is a power of two; in that case, it is rounded up.
If n is not specified or is zero, use a machine-dependent default.
Enabled at levels -O2, -O3.
-falign-labels-falign-labels=n-fno-align-labels and -falign-labels=1 are equivalent and mean that labels will not be aligned.
If -falign-loops or -falign-jumps are applicable and are greater than this value, then their values are used instead.
If n is not specified or is zero, use a machine-dependent default which is very likely to be 1, meaning no alignment.
Enabled at levels -O2, -O3.
-falign-loops-falign-loops=n-fno-align-loops and -falign-loops=1 are equivalent and mean that loops will not be aligned.
If n is not specified or is zero, use a machine-dependent default.
Enabled at levels -O2, -O3.
-falign-jumps-falign-jumps=n-fno-align-jumps and -falign-jumps=1 are equivalent and mean that loops will not be aligned.
If n is not specified or is zero, use a machine-dependent default.
Enabled at levels -O2, -O3.
-frename-registers-fwebEnabled at levels -O3.
-fno-cprop-registersDisabled at levels -O, -O2, -O3, -Os.
-fprofile-generate-fprofile-generate both when
compiling and when linking your program.
The following options are enabled: -fprofile-arcs, -fprofile-values, -fvpt.
-fprofile-useThe following options are enabled: -fbranch-probabilities,
-fvpt, -funroll-loops, -fpeel-loops, -ftracer.
The following options control compiler behavior regarding floating point arithmetic. These options trade off between speed and correctness. All must be specifically enabled.
-ffloat-storeThis option prevents undesirable excess precision on machines such as
the 68000 where the floating registers (of the 68881) keep more
precision than a double is supposed to have. Similarly for the
x86 architecture. For most programs, the excess precision does only
good, but a few programs rely on the precise definition of IEEE floating
point. Use -ffloat-store for such programs, after modifying
them to store all pertinent intermediate computations into variables.
-ffast-mathThis option causes the preprocessor macro __FAST_MATH__ to be defined.
This option should never be turned on by any -O option since
it can result in incorrect output for programs which depend on
an exact implementation of IEEE or ISO rules/specifications for
math functions.
-fno-math-errnoThis option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions.
The default is -fmath-errno.
-funsafe-math-optimizationsThis option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions.
The default is -fno-unsafe-math-optimizations.
-ffinite-math-onlyThis option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications.
The default is -fno-finite-math-only.
-fno-trapping-mathThis option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions.
The default is -ftrapping-math.
-frounding-mathThe default is -fno-rounding-math.
This option is experimental and does not currently guarantee to
disable all GCC optimizations that are affected by rounding mode.
Future versions of GCC may provide finer control of this setting
using C99's FENV_ACCESS pragma. This command line option
will be used to specify the default state for FENV_ACCESS.
-fsignaling-nansThis option causes the preprocessor macro __SUPPORT_SNAN__ to
be defined.
The default is -fno-signaling-nans.
This option is experimental and does not currently guarantee to
disable all GCC optimizations that affect signaling NaN behavior.
-fsingle-precision-constantThe following options control optimizations that may improve performance, but are not enabled by any -O options. This section includes experimental options that may produce broken code.
-fbranch-probabilitiesWith -fbranch-probabilities, GCC puts a
REG_BR_PROB note on each JUMP_INSN and CALL_INSN.
These can be used to improve optimization. Currently, they are only
used in one place: in reorg.c, instead of guessing which path a
branch is mostly to take, the REG_BR_PROB values are used to
exactly determine which path is taken more often.
-fprofile-valuesWith -fbranch-probabilities, it reads back the data gathered
from profiling values of expressions and adds REG_VALUE_PROFILE
notes to instructions for their later usage in optimizations.
-fvptWith -fbranch-probabilities, it reads back the data gathered
and actually performs the optimizations based on them.
Currently the optimizations include specialization of division operation
using the knowledge about the value of the denominator.
-fnew-ra-ftracer-funit-at-a-time-funroll-loops-funroll-all-loops-fpeel-loops-funswitch-loops-fold-unroll-loops-fold-unroll-all-loops-funswitch-loops-funswitch-loops-fprefetch-loop-arraysDisabled at level -Os.
-ffunction-sections-fdata-sectionsUse these options on systems where the linker can perform optimizations to improve locality of reference in the instruction space. Most systems using the ELF object format and SPARC processors running Solaris 2 have linkers with such optimizations. AIX may have these optimizations in the future.
Only use these options when there are significant benefits from doing
so. When you specify these options, the assembler and linker will
create larger object and executable files and will also be slower.
You will not be able to use gprof on all systems if you
specify this option and you may have problems with debugging if
you specify both this option and -g.
-fbranch-target-load-optimize-fbranch-target-load-optimize2--param name=valueThe names of specific parameters, and the meaning of the values, are tied to the internals of the compiler, and are subject to change without notice in future releases.
In each case, the value is an integer. The allowable choices for name are given in the following table:
max-crossjump-edgesmax-delay-slot-insn-searchmax-delay-slot-live-searchmax-gcse-memorymax-gcse-passesmax-pending-list-lengthmax-inline-insns-singlemax-inline-insns-autolarge-function-insnslarge-function-growthinline-unit-growthmax-inline-insns-rtlmax-unrolled-insnsmax-average-unrolled-insnsmax-unroll-timesmax-peeled-insnsmax-peel-timesmax-completely-peeled-insnsmax-completely-peel-timesmax-unswitch-insnsmax-unswitch-levelhot-bb-count-fractionhot-bb-frequency-fractiontracer-dynamic-coveragetracer-dynamic-coverage-feedbackThe tracer-dynamic-coverage-feedback is used only when profile
feedback is available. The real profiles (as opposed to statically estimated
ones) are much less balanced allowing the threshold to be larger value.
tracer-max-code-growthtracer-min-branch-ratiotracer-min-branch-ratiotracer-min-branch-ratio-feedbackSimilarly to tracer-dynamic-coverage two values are present, one for
compilation for profile feedback and one for compilation without. The value
for compilation with profile feedback needs to be more conservative (higher) in
order to make tracer effective.
max-cse-path-lengthmax-last-value-rtlggc-min-expandThe default is 30% + 70% * (RAM/1GB) with an upper bound of 100% when
RAM >= 1GB. If getrlimit is available, the notion of "RAM" is
the smallest of actual RAM, RLIMIT_RSS, RLIMIT_DATA and RLIMIT_AS. If
GCC is not able to calculate RAM on a particular platform, the lower
bound of 30% is used. Setting this parameter and
ggc-min-heapsize to zero causes a full collection to occur at
every opportunity. This is extremely slow, but can be useful for
debugging.
ggc-min-heapsizeThe default is RAM/8, with a lower bound of 4096 (four megabytes) and an
upper bound of 131072 (128 megabytes). If getrlimit is
available, the notion of "RAM" is the smallest of actual RAM,
RLIMIT_RSS, RLIMIT_DATA and RLIMIT_AS. If GCC is not able to calculate
RAM on a particular platform, the lower bound is used. Setting this
parameter very large effectively disables garbage collection. Setting
this parameter and ggc-min-expand to zero causes a full
collection to occur at every opportunity.
max-reload-search-insnsmax-cselib-memory-locationreorder-blocks-duplicatereorder-blocks-duplicate-feedbackThe reorder-block-duplicate-feedback is used only when profile feedback is available and may be set to higher values than reorder-block-duplicate since information about the hot spots is more accurate.
These options control the C preprocessor, which is run on each C source file before actual compilation.
If you use the -E option, nothing is done except preprocessing. Some of these options make sense only together with -E because they cause the preprocessor output to be unsuitable for actual compilation.
-Xpreprocessor optionIf you want to pass an option that takes an argument, you must use -Xpreprocessor twice, once for the option and once for the argument.
-D name1.
-D name=definitionIf you are invoking the preprocessor from a shell or shell-like program you may need to use the shell's quoting syntax to protect characters such as spaces that have a meaning in the shell syntax.
If you wish to define a function-like macro on the command line, write its argument list with surrounding parentheses before the equals sign (if any). Parentheses are meaningful to most shells, so you will need to quote the option. With sh and csh, -D'name(args...)=definition' works.
-D and -U options are processed in the order they
are given on the command line. All -imacros file and
-include file options are processed after all
-D and -U options.
-U name-undef-I dir-o file-Wall#if expressions. Note that many of the
preprocessor's warnings are on by default and have no options to
control them.
-Wcomment-Wcomments-WtrigraphsThis option is implied by -Wall. If -Wall is not
given, this option is still enabled unless trigraphs are enabled. To
get trigraph conversion without warnings, but get the other
-Wall warnings, use -trigraphs -Wall -Wno-trigraphs.
-Wtraditional-Wimport-Wundef-Wunused-macrosBuilt-in macros, macros defined on the command line, and macros defined in include files are not warned about.
Note: If a macro is actually used, but only used in skipped conditional blocks, then CPP will report it as unused. To avoid the warning in such a case, you might improve the scope of the macro's definition by, for example, moving it into the first skipped block. Alternatively, you could provide a dummy use with something like:
#if defined the_macro_causing_the_warning
#endif
-Wendif-labels #if FOO
...
#else FOO
...
#endif FOO
The second and third FOO should be in comments, but often are not
in older programs. This warning is on by default.
-Werror-Wsystem-headers-w-pedantic-pedantic-errors-MUnless specified explicitly (with -MT or -MQ), the object file name consists of the basename of the source file with any suffix replaced with object file suffix. If there are many included files then the rule is split into several lines using \-newline. The rule has no commands.
This option does not suppress the preprocessor's debug output, such as -dM. To avoid mixing such debug output with the dependency rules you should explicitly specify the dependency output file with -MF, or use an environment variable like DEPENDENCIES_OUTPUT (see Environment Variables). Debug output will still be sent to the regular output stream as normal.
Passing -M to the driver implies -E, and suppresses
warnings with an implicit -w.
-MMThis implies that the choice of angle brackets or double quotes in an #include directive does not in itself determine whether that header will appear in -MM dependency output. This is a slight change in semantics from GCC versions 3.0 and earlier.
-MF fileWhen used with the driver options -MD or -MMD,
-MF overrides the default dependency output file.
-MG#include directive without prepending any path. -MG
also suppresses preprocessed output, as a missing header file renders
this useless.
This feature is used in automatic updating of makefiles.
-MPThis is typical output:
test.o: test.c test.h
test.h:
-MT targetAn -MT option will set the target to be exactly the string you specify. If you want multiple targets, you can specify them as a single argument to -MT, or use multiple -MT options.
For example, -MT '$(objpfx)foo.o' might give
$(objpfx)foo.o: foo.c
-MQ target $$(objpfx)foo.o: foo.c
The default target is automatically quoted, as if it were given with
-MQ.
-MDIf -MD is used in conjunction with -E, any -o switch is understood to specify the dependency output file (but see -MF), but if used without -E, each -o is understood to specify a target object file.
Since -E is not implied, -MD can be used to generate
a dependency output file as a side-effect of the compilation process.
-MMD-fpch-deps-x c-x c++-x objective-c-x assembler-with-cppNote: Previous versions of cpp accepted a -lang option
which selected both the language and the standards conformance level.
This option has been removed, because it conflicts with the -l
option.
-std=standard-ansistandard may be one of:
iso9899:1990c89The -ansi option is equivalent to -std=c89.
iso9899:199409iso9899:1999c99iso9899:199xc9xgnu89gnu99gnu9xc++98gnu++98-I-#include "file"; they are not searched for
#include <file>. If additional directories are
specified with -I options after the -I-, those
directories are searched for all #include directives.
In addition, -I- inhibits the use of the directory of the current
file directory as the first search directory for #include "file".
-nostdinc-nostdinc++-include file#include "file" appeared as the first
line of the primary source file. However, the first directory searched
for file is the preprocessor's working directory instead of
the directory containing the main source file. If not found there, it
is searched for in the remainder of the #include "..." search
chain as normal.
If multiple -include options are given, the files are included
in the order they appear on the command line.
-imacros fileAll files specified by -imacros are processed before all files
specified by -include.
-idirafter dir-iprefix prefix-iwithprefix dir-iwithprefixbefore dir-isystem dir-fdollars-in-identifiers-fpreprocessed-fpreprocessed is implicit if the input file has one of the
extensions .i, .ii or .mi. These are the
extensions that GCC uses for preprocessed files created by
-save-temps.
-ftabstop=width-fexec-charset=charseticonv library routine.
-fwide-exec-charset=charsetwchar_t. As with
-ftarget-charset, charset can be any encoding supported
by the system's iconv library routine; however, you will have
problems with encodings that do not fit exactly in wchar_t.
-finput-charset=charseticonv library routine.
-fworking-directory#line directives are emitted whatsoever.
-fno-show-column-A predicate=answer-A -predicate=answer-dCHARS touch foo.h; cpp -dM foo.h
will show all the predefined macros.
-P-CYou should be prepared for side effects when using -C; it
causes the preprocessor to treat comments as tokens in their own right.
For example, comments appearing at the start of what would be a
directive line have the effect of turning that line into an ordinary
source line, since the first token on the line is no longer a #.
-CCIn addition to the side-effects of the -C option, the -CC option causes all C++-style comments inside a macro to be converted to C-style comments. This is to prevent later use of that macro from inadvertently commenting out the remainder of the source line.
The -CC option is generally used to support lint comments.
-traditional-cpp-trigraphsThe nine trigraphs and their replacements are
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??-
Replacement: [ ] { } # \ ^ | ~
-remap--help--target-help-v-H-version--versionYou can pass options to the assembler.
-Wa,option-Xassembler optionIf you want to pass an option that takes an argument, you must use -Xassembler twice, once for the option and once for the argument.
These options come into play when the compiler links object files into an executable output file. They are meaningless if the compiler is not doing a link step.
-c-S-E-llibrary-l libraryIt makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.
The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified precisely by name.
The directories searched include several standard system directories plus any that you specify with -L.
Normally the files found this way are library files—archive files
whose members are object files. The linker handles an archive file by
scanning through it for members which define symbols that have so far
been referenced but not defined. But if the file that is found is an
ordinary object file, it is linked in the usual fashion. The only
difference between using an -l option and specifying a file name
is that -l surrounds library with lib and .a
and searches several directories.
-lobjc-nostartfiles-nodefaultlibs-nostdlibOne of the standard libraries bypassed by -nostdlib and
-nodefaultlibs is libgcc.a, a library of internal subroutines
that GCC uses to overcome shortcomings of particular machines, or special
needs for some languages.
(See Interfacing to GCC Output (GNU Compiler Collection (GCC) Internals),
for more discussion of libgcc.a.)
In most cases, you need libgcc.a even when you want to avoid
other standard libraries. In other words, when you specify -nostdlib
or -nodefaultlibs you should usually specify -lgcc as well.
This ensures that you have no unresolved references to internal GCC
library subroutines. (For example, __main, used to ensure C++
constructors will be called; see collect2 (GNU Compiler Collection (GCC) Internals).)
-pie-s-static-shared-shared-libgcc-static-libgccThere are several situations in which an application should use the shared libgcc instead of the static version. The most common of these is when the application wishes to throw and catch exceptions across different shared libraries. In that case, each of the libraries as well as the application itself should use the shared libgcc.
Therefore, the G++ and GCJ drivers automatically add -shared-libgcc whenever you build a shared library or a main executable, because C++ and Java programs typically use exceptions, so this is the right thing to do.
If, instead, you use the GCC driver to create shared libraries, you may find that they will not always be linked with the shared libgcc. If GCC finds, at its configuration time, that you have a non-GNU linker or a GNU linker that does not support option --eh-frame-hdr, it will link the shared version of libgcc into shared libraries by default. Otherwise, it will take advantage of the linker and optimize away the linking with the shared version of libgcc, linking with the static version of libgcc by default. This allows exceptions to propagate through such shared libraries, without incurring relocation costs at library load time.
However, if a library or main executable is supposed to throw or catch
exceptions, you must link it using the G++ or GCJ driver, as appropriate
for the languages used in the program, or using the option
-shared-libgcc, such that it is linked with the shared
libgcc.
-symbolic-Xlinker optionIf you want to pass an option that takes an argument, you must use
-Xlinker twice, once for the option and once for the argument.
For example, to pass -assert definitions, you must write
-Xlinker -assert -Xlinker definitions. It does not work to write
-Xlinker "-assert definitions", because this passes the entire
string as a single argument, which is not what the linker expects.
-Wl,option-u symbolThese options specify directories to search for header files, for libraries and for parts of the compiler:
-IdirIf a standard system include directory, or a directory specified with
-isystem, is also specified with -I, the -I
option will be ignored. The directory will still be searched but as a
system directory at its normal position in the system include chain.
This is to ensure that GCC's procedure to fix buggy system headers and
the ordering for the include_next directive are not inadvertently changed.
If you really need to change the search order for system directories,
use the -nostdinc and/or -isystem options.
-I-If additional directories are specified with -I options after the -I-, these directories are searched for all #include directives. (Ordinarily all -I directories are used this way.)
In addition, the -I- option inhibits the use of the current directory (where the current input file came from) as the first search directory for #include "file". There is no way to override this effect of -I-. With -I. you can specify searching the directory which was current when the compiler was invoked. That is not exactly the same as what the preprocessor does by default, but it is often satisfactory.
-I- does not inhibit the use of the standard system directories
for header files. Thus, -I- and -nostdinc are
independent.
-Ldir-BprefixThe compiler driver program runs one or more of the subprograms cpp, cc1, as and ld. It tries prefix as a prefix for each program it tries to run, both with and without machine/version/ (see Target Options).
For each subprogram to be run, the compiler driver first tries the -B prefix, if any. If that name is not found, or if -B was not specified, the driver tries two standard prefixes, which are /usr/lib/gcc/ and /usr/local/lib/gcc/. If neither of those results in a file name that is found, the unmodified program name is searched for using the directories specified in your PATH environment variable.
The compiler will check to see if the path provided by the -B refers to a directory, and if necessary it will add a directory separator character at the end of the path.
-B prefixes that effectively specify directory names also apply to libraries in the linker, because the compiler translates these options into -L options for the linker. They also apply to includes files in the preprocessor, because the compiler translates these options into -isystem options for the preprocessor. In this case, the compiler appends include to the prefix.
The run-time support file libgcc.a can also be searched for using the -B prefix, if needed. If it is not found there, the two standard prefixes above are tried, and that is all. The file is left out of the link if it is not found by those means.
Another way to specify a prefix much like the -B prefix is to use the environment variable GCC_EXEC_PREFIX. See Environment Variables.
As a special kludge, if the path provided by -B is
[dir/]stageN/, where N is a number in the range 0 to
9, then it will be replaced by [dir/]include. This is to help
with boot-strapping the compiler.
-specs=filegcc is a driver program. It performs its job by invoking a sequence of other programs to do the work of compiling, assembling and linking. GCC interprets its command-line parameters and uses these to deduce which programs it should invoke, and which command-line options it ought to place on their command lines. This behavior is controlled by spec strings. In most cases there is one spec string for each program that GCC can invoke, but a few programs have multiple spec strings to control their behavior. The spec strings built into GCC can be overridden by using the -specs= command-line switch to specify a spec file.
Spec files are plaintext files that are used to construct spec strings. They consist of a sequence of directives separated by blank lines. The type of directive is determined by the first non-whitespace character on the line and it can be one of the following:
%command%include <file>%include_noerr <file>%rename old_name new_name*[spec_name]:[suffix]: .ZZ:
z-compile -input %i
This says that any input file whose name ends in .ZZ should be passed to the program z-compile, which should be invoked with the command-line switch -input and with the result of performing the %i substitution. (See below.)
As an alternative to providing a spec string, the text that follows a suffix directive can be one of the following:
@language .ZZ:
@c++
Says that .ZZ files are, in fact, C++ source files.
#name name compiler not installed on this system.
GCC already has an extensive list of suffixes built into it. This directive will add an entry to the end of the list of suffixes, but since the list is searched from the end backwards, it is effectively possible to override earlier entries using this technique.
GCC has the following spec strings built into it. Spec files can override these strings or create their own. Note that individual targets can also add their own spec strings to this list.
asm Options to pass to the assembler
asm_final Options to pass to the assembler post-processor
cpp Options to pass to the C preprocessor
cc1 Options to pass to the C compiler
cc1plus Options to pass to the C++ compiler
endfile Object files to include at the end of the link
link Options to pass to the linker
lib Libraries to include on the command line to the linker
libgcc Decides which GCC support library to pass to the linker
linker Sets the name of the linker
predefines Defines to be passed to the C preprocessor
signed_char Defines to pass to CPP to say whether char is signed
by default
startfile Object files to include at the start of the link
Here is a small example of a spec file:
%rename lib old_lib
*lib:
--start-group -lgcc -lc -leval1 --end-group %(old_lib)
This example renames the spec called lib to old_lib and then overrides the previous definition of lib with a new one. The new definition adds in some extra command-line options before including the text of the old definition.
Spec strings are a list of command-line options to be passed to their corresponding program. In addition, the spec strings can contain %-prefixed sequences to substitute variable text or to conditionally insert text into the command line. Using these constructs it is possible to generate quite complex command lines.
Here is a table of all defined %-sequences for spec strings. Note that spaces are not generated automatically around the results of expanding these sequences. Therefore you can concatenate them together or combine them with constant text in a single argument.
%%%i%b%B%d%gsuffix%usuffix%Usuffix%jsuffixHOST_BIT_BUCKET, if any, and if it is
writable, and if save-temps is off; otherwise, substitute the name
of a temporary file, just like %u. This temporary file is not
meant for communication between processes, but rather as a junk
disposal mechanism.
%|suffix%msuffixX}
construct: see for example f/lang-specs.h.
%.SUFFIX%w%o%O%pcpp.
%P%I%s%estr%(name)%[name]%x{option}%X%Y%Z%aasm spec. This is used to compute the
switches to be passed to the assembler.
%Aasm_final spec. This is a spec string for
passing switches to an assembler post-processor, if such a program is
needed.
%llink spec. This is the spec for computing the
command line passed to the linker. Typically it will make use of the
%L %G %S %D and %E sequences.
%D%M%Llib spec. This is a spec string for deciding which
libraries should be included on the command line to the linker.
%Glibgcc spec. This is a spec string for deciding
which GCC support library should be included on the command line to the linker.
%Sstartfile spec. This is a spec for deciding which
object files should be the first ones passed to the linker. Typically
this might be a file named crt0.o.
%Eendfile spec. This is a spec string that specifies
the last object files that will be passed to the linker.
%Ccpp spec. This is used to construct the arguments
to be passed to the C preprocessor.
%csigned_char spec. This is intended to be used
to tell cpp whether a char is signed. It typically has the definition:
%{funsigned-char:-D__CHAR_UNSIGNED__}
%1cc1 spec. This is used to construct the options to be
passed to the actual C compiler (cc1).
%2cc1plus spec. This is used to construct the options to be
passed to the actual C++ compiler (cc1plus).
%*%<S-S from the command line. Note—this
command is position dependent. % commands in the spec string
before this one will see -S, % commands in the spec string
after this one will not.
%:function(args)The following built-in spec functions are provided:
if-existsif-exists spec function takes one argument, an absolute
pathname to a file. If the file exists, if-exists returns the
pathname. Here is a small example of its usage:
*startfile:
crt0%O%s %:if-exists(crti%O%s) crtbegin%O%s
if-exists-elseif-exists-else spec function is similar to the if-exists
spec function, except that it takes two arguments. The first argument is
an absolute pathname to a file. If the file exists, if-exists-else
returns the pathname. If it does not exist, it returns the second argument.
This way, if-exists-else can be used to select one file or another,
based on the existence of the first. Here is a small example of its usage:
*startfile:
crt0%O%s %:if-exists(crti%O%s) \
%:if-exists-else(crtbeginT%O%s crtbegin%O%s)
%{S}-S switch, if that switch was given to GCC.
If that switch was not specified, this substitutes nothing. Note that
the leading dash is omitted when specifying this option, and it is
automatically inserted if the substitution is performed. Thus the spec
string %{foo} would match the command-line option -foo
and would output the command line option -foo.
%W{S}S} but mark last argument supplied within as a file to be
deleted on failure.
%{S*}-S, but which also take an argument. This is used for
switches like -o, -D, -I, etc.
GCC considers -o foo as being
one switch whose names starts with o. %{o*} would substitute this
text, including the space. Thus two arguments would be generated.
%{S*&T*}S*}, but preserve order of S and T options
(the order of S and T in the spec is not significant).
There can be any number of ampersand-separated variables; for each the
wild card is optional. Useful for CPP as %{D*&U*&A*}.
%{S:X}X, if the -S switch was given to GCC.
%{!S:X}X, if the -S switch was not given to GCC.
%{S*:X}X if one or more switches whose names start with
-S are specified to GCC. Normally X is substituted only
once, no matter how many such switches appeared. However, if %*
appears somewhere in X, then X will be substituted once
for each matching switch, with the %* replaced by the part of
that switch that matched the *.
%{.S:X}X, if processing a file with suffix S.
%{!.S:X}X, if not processing a file with suffix S.
%{S|P:X}X if either -S or -P was given to GCC.
This may be combined with !, ., and * sequences as well,
although they have a stronger binding than the |. If %*
appears in X, all of the alternatives must be starred, and only
the first matching alternative is substituted.
For example, a spec string like this:
%{.c:-foo} %{!.c:-bar} %{.c|d:-baz} %{!.c|d:-boggle}
will output the following command-line options from the following input command-line options:
fred.c -foo -baz
jim.d -bar -boggle
-d fred.c -foo -baz -boggle
-d jim.d -bar -baz -boggle
%{S:X; T:Y; :D}S was given to GCC, substitutes X; else if T was
given to GCC, substitutes Y; else substitutes D. There can
be as many clauses as you need. This may be combined with .,
!, |, and * as needed.
The conditional text X in a %{S:X} or similar
construct may contain other nested % constructs or spaces, or
even newlines. They are processed as usual, as described above.
Trailing white space in X is ignored. White space may also
appear anywhere on the left side of the colon in these constructs,
except between . or * and the corresponding word.
The -O, -f, -m, and -W switches are
handled specifically in these constructs. If another value of
-O or the negated form of a -f, -m, or
-W switch is found later in the command line, the earlier
switch value is ignored, except with {S*} where S is
just one letter, which passes all matching options.
The character | at the beginning of the predicate text is used to indicate that a command should be piped to the following command, but only if -pipe is specified.
It is built into GCC which switches take arguments and which do not. (You might think it would be useful to generalize this to allow each compiler's spec to say which switches take arguments. But this cannot be done in a consistent fashion. GCC cannot even decide which input files have been specified without knowing which switches take arguments, and it must know which input files to compile in order to tell which compilers to run).
GCC also knows implicitly that arguments starting in -l are to be treated as compiler output files, and passed to the linker in their proper position among the other output files.
The usual way to run GCC is to run the executable called gcc, or <machine>-gcc when cross-compiling, or <machine>-gcc-<version> to run a version other than the one that was installed last. Sometimes this is inconvenient, so GCC provides options that will switch to another cross-compiler or version.
-b machineThe value to use for machine is the same as was specified as the
machine type when configuring GCC as a cross-compiler. For
example, if a cross-compiler was configured with configure
i386v, meaning to compile for an 80386 running System V, then you
would specify -b i386v to run that cross compiler.
-V versionThe -V and -b options work by running the <machine>-gcc-<version> executable, so there's no real reason to use them if you can just run that directly.
Earlier we discussed the standard option -b which chooses among different installed compilers for completely different target machines, such as VAX vs. 68000 vs. 80386.
In addition, each of these target machine types can have its own special options, starting with -m, to choose among various hardware models or configurations—for example, 68010 vs 68020, floating coprocessor or none. A single installed version of the compiler can compile for any model or configuration, according to the options specified.
Some configurations of the compiler also support additional special options, usually for compatibility with other compilers on the same platform.
These options are defined by the macro TARGET_SWITCHES in the
machine description. The default for the options is also defined by
that macro, which enables you to change the defaults.
These are the -m options defined for the 68000 series. The default values for these options depends on which style of 68000 was selected when the compiler was configured; the defaults for the most common choices are given below.
-m68000-mc68000Use this option for microcontrollers with a 68000 or EC000 core,
including the 68008, 68302, 68306, 68307, 68322, 68328 and 68356.
-m68020-mc68020-m68881-m68030-m68040This option inhibits the use of 68881/68882 instructions that have to be
emulated by software on the 68040. Use this option if your 68040 does not
have code to emulate those instructions.
-m68060This option inhibits the use of 68020 and 68881/68882 instructions that
have to be emulated by software on the 68060. Use this option if your 68060
does not have code to emulate those instructions.
-mcpu32Use this option for microcontrollers with a
CPU32 or CPU32+ core, including the 68330, 68331, 68332, 68333, 68334,
68336, 68340, 68341, 68349 and 68360.
-m5200Use this option for microcontroller with a 5200 core, including
the MCF5202, MCF5203, MCF5204 and MCF5202.
-m68020-40-m68020-60-msoft-float-mshortint to be 16 bits wide, like short int.
-mnobitfield-mbitfield-mrtdrtd
instruction, which pops their arguments while returning. This
saves one instruction in the caller since there is no need to pop
the arguments there.
This calling convention is incompatible with the one normally used on Unix, so you cannot use it if you need to call libraries compiled with the Unix compiler.
Also, you must provide function prototypes for all functions that
take variable numbers of arguments (including printf);
otherwise incorrect code will be generated for calls to those
functions.
In addition, seriously incorrect code will result if you call a function with too many arguments. (Normally, extra arguments are harmlessly ignored.)
The rtd instruction is supported by the 68010, 68020, 68030,
68040, 68060 and CPU32 processors, but not by the 68000 or 5200.
-malign-int-mno-align-intint, long, long long,
float, double, and long double variables on a 32-bit
boundary (-malign-int) or a 16-bit boundary (-mno-align-int).
Aligning variables on 32-bit boundaries produces code that runs somewhat
faster on processors with 32-bit busses at the expense of more memory.
Warning: if you use the -malign-int switch, GCC will
align structures containing the above types differently than
most published application binary interface specifications for the m68k.
-mpcrel-mno-strict-align-mstrict-align-msep-data-mno-sep-data-mid-shared-library-mno-id-shared-library-mshared-library-id=nThese are the -m options defined for the 68hc11 and 68hc12 microcontrollers. The default values for these options depends on which style of microcontroller was selected when the compiler was configured; the defaults for the most common choices are given below.
-m6811-m68hc11-m6812-m68hc12-m68S12-m68hcs12-mauto-incdec-minmax-nominmax-mlong-calls-mno-long-callscall instruction to
call a function and the rtc instruction for returning.
-mshortint to be 16 bits wide, like short int.
-msoft-reg-count=countThese -m options are defined for the VAX:
-munixaobleq and so on)
that the Unix assembler for the VAX cannot handle across long
ranges.
-mgnu-mgThese -m options are supported on the SPARC:
-mno-app-regs-mapp-regsTo be fully SVR4 ABI compliant at the cost of some performance loss,
specify -mno-app-regs. You should compile libraries and system
software with this option.
-mfpu-mhard-float-mno-fpu-msoft-float-msoft-float changes the calling convention in the output file;
therefore, it is only useful if you compile all of a program with
this option. In particular, you need to compile libgcc.a, the
library that comes with GCC, with -msoft-float in order for
this to work.
-mhard-quad-float-msoft-quad-floatAs of this writing, there are no SPARC implementations that have hardware
support for the quad-word floating point instructions. They all invoke
a trap handler for one of these instructions, and then the trap handler
emulates the effect of the instruction. Because of the trap handler overhead,
this is much slower than calling the ABI library routines. Thus the
-msoft-quad-float option is the default.
-mno-flat-mflatWith -mno-flat (the default), the compiler emits save/restore instructions (except for leaf functions) and is the normal mode of operation.
These options are deprecated and will be deleted in a future GCC release.
-mno-unaligned-doubles-munaligned-doublesWith -munaligned-doubles, GCC assumes that doubles have 8 byte
alignment only if they are contained in another type, or if they have an
absolute address. Otherwise, it assumes they have 4 byte alignment.
Specifying this option avoids some rare compatibility problems with code
generated by other compilers. It is not the default because it results
in a performance loss, especially for floating point code.
-mno-faster-structs-mfaster-structsldd and std instructions for copies in structure
assignment, in place of twice as many ld and st pairs.
However, the use of this changed alignment directly violates the SPARC
ABI. Thus, it's intended only for use on targets where the developer
acknowledges that their resulting code will not be directly in line with
the rules of the ABI.
-mimpure-text-mimpure-text suppresses the “relocations remain against allocatable but non-writable sections” linker error message. However, the necessary relocations will trigger copy-on-write, and the shared object is not actually shared across processes. Instead of using -mimpure-text, you should compile all source code with -fpic or -fPIC.
This option is only available on SunOS and Solaris.
-mv8-msparclite-mcypress-msupersparc-mf930-mf934-mcpu=cpu_typeDefault instruction scheduling parameters are used for values that select an architecture and not an implementation. These are v7, v8, sparclite, sparclet, v9.
Here is a list of each supported architecture and their supported implementations.
v7: cypress
v8: supersparc, hypersparc
sparclite: f930, f934, sparclite86x
sparclet: tsc701
v9: ultrasparc, ultrasparc3
By default (unless configured otherwise), GCC generates code for the V7 variant of the SPARC architecture. With -mcpu=cypress, the compiler additionally optimizes it for the Cypress CY7C602 chip, as used in the SPARCStation/SPARCServer 3xx series. This is also appropriate for the older SPARCStation 1, 2, IPX etc.
With -mcpu=v8, GCC generates code for the V8 variant of the SPARC architecture. The only difference from V7 code is that the compiler emits the integer multiply and integer divide instructions which exist in SPARC-V8 but not in SPARC-V7. With -mcpu=supersparc, the compiler additionally optimizes it for the SuperSPARC chip, as used in the SPARCStation 10, 1000 and 2000 series.
With -mcpu=sparclite, GCC generates code for the SPARClite variant of
the SPARC architecture. This adds the integer multiply, integer divide step
and scan (ffs) instructions which exist in SPARClite but not in SPARC-V7.
With -mcpu=f930, the compiler additionally optimizes it for the
Fujitsu MB86930 chip, which is the original SPARClite, with no FPU. With
-mcpu=f934, the compiler additionally optimizes it for the Fujitsu
MB86934 chip, which is the more recent SPARClite with FPU.
With -mcpu=sparclet, GCC generates code for the SPARClet variant of
the SPARC architecture. This adds the integer multiply, multiply/accumulate,
integer divide step and scan (ffs) instructions which exist in SPARClet
but not in SPARC-V7. With -mcpu=tsc701, the compiler additionally
optimizes it for the TEMIC SPARClet chip.
With -mcpu=v9, GCC generates code for the V9 variant of the SPARC
architecture. This adds 64-bit integer and floating-point move instructions,
3 additional floating-point condition code registers and conditional move
instructions. With -mcpu=ultrasparc, the compiler additionally
optimizes it for the Sun UltraSPARC I/II chips. With
-mcpu=ultrasparc3, the compiler additionally optimizes it for the
Sun UltraSPARC III chip.
-mtune=cpu_typeThe same values for -mcpu=cpu_type can be used for
-mtune=cpu_type, but the only useful values are those
that select a particular cpu implementation. Those are cypress,
supersparc, hypersparc, f930, f934,
sparclite86x, tsc701, ultrasparc, and
ultrasparc3.
-mv8plus-mno-v8plus-mvis-mno-visThese -m options are supported in addition to the above on SPARC-V9 processors in 64-bit environments:
-mlittle-endian-m32-m64-mcmodel=medlow-mcmodel=medmid-mcmodel=medany-mcmodel=embmedany-mstack-bias-mno-stack-biasThese switches are supported in addition to the above on Solaris:
-threads-pthreadsThese -m options are defined for Advanced RISC Machines (ARM) architectures:
-mapcs-frame-mapcs-mapcs-26This option is deprecated. Future releases of the GCC will only support
generating code that runs in apcs-32 mode.
-mapcs-32This flag is deprecated. Future releases of GCC will make this flag
unconditional.
-mthumb-interwork-mno-sched-prolog-mhard-float-msoft-float-msoft-float changes the calling convention in the output file;
therefore, it is only useful if you compile all of a program with
this option. In particular, you need to compile libgcc.a, the
library that comes with GCC, with -msoft-float in order for
this to work.
-mlittle-endian-mbig-endian-mwords-little-endian-malignment-trapsThis option has no effect when compiling for ARM architecture 4 or later,
since these processors have instructions to directly access half-word
objects in memory.
-mno-alignment-trapsNote that you cannot use this option to access unaligned word objects, since the processor will only fetch one 32-bit aligned object from memory.
The default setting is -malignment-traps, since this produces code that will also run on processors implementing ARM architecture version 6 or later.
This option is deprecated and will be removed in the next release of GCC.
-mcpu=name-mtune=name-march=name-mfpe=number-mfp=number-mstructure-size-boundary=n-mabort-on-noreturnabort at the end of a
noreturn function. It will be executed if the function tries to
return.
-mlong-calls-mno-long-callsEven if this switch is enabled, not all function calls will be turned into long calls. The heuristic is that static functions, functions which have the short-call attribute, functions that are inside the scope of a #pragma no_long_calls directive and functions whose definitions have already been compiled within the current compilation unit, will not be turned into long calls. The exception to this rule is that weak function definitions, functions with the long-call attribute or the section attribute, and functions that are within the scope of a #pragma long_calls directive, will always be turned into long calls.
This feature is not enabled by default. Specifying
-mno-long-calls will restore the default behavior, as will
placing the function calls within the scope of a #pragma
long_calls_off directive. Note these switches have no effect on how
the compiler generates code to handle function calls via function
pointers.
-mnop-fun-dllimportdllimport attribute.
-msingle-pic-base-mpic-register=reg-mcirrus-fix-invalid-insns-mpoke-function-name t0
.ascii "arm_poke_function_name", 0
.align
t1
.word 0xff000000 + (t1 - t0)
arm_poke_function_name
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
When performing a stack backtrace, code can inspect the value of
pc stored at fp + 0. If the trace function then looks at
location pc - 12 and the top 8 bits are set, then we know that
there is a function name embedded immediately preceding this location
and has length ((pc[-3]) & 0xff000000).
-mthumb-mtpcs-frame-mtpcs-leaf-frame-mcallee-super-interworking-mcaller-super-interworkingThese -m options are defined for Matsushita MN10300 architectures:
-mmult-bug-mno-mult-bug-mam33-mno-am33-mno-crt0-mrelaxThis option makes symbolic debugging impossible.
These -m options are defined for Renesas M32R/D architectures:
-m32r2-m32rx-m32r-mmodel=smallld24 instruction), and assume all subroutines
are reachable with the bl instruction.
This is the default.
The addressability of a particular object can be set with the
model attribute.
-mmodel=mediumseth/add3 instructions to load their addresses), and
assume all subroutines are reachable with the bl instruction.
-mmodel=largeseth/add3 instructions to load their addresses), and
assume subroutines may not be reachable with the bl instruction
(the compiler will generate the much slower seth/add3/jl
instruction sequence).
-msdata=nonesection attribute has been specified).
This is the default.
The small data area consists of sections .sdata and .sbss.
Objects may be explicitly put in the small data area with the
section attribute using one of these sections.
-msdata=sdata-msdata=use-G numAll modules should be compiled with the same -G num value.
Compiling with different values of num may or may not work; if it
doesn't the linker will give an error message—incorrect code will not be
generated.
-mdebug-malign-loops-mno-align-loops-missue-rate=number-mbranch-cost=number-mflush-trap=number-mno-flush-trap-mflush-func=name-mno-flush-funcThese -m options are defined for the IBM RS/6000 and PowerPC:
-mpower-mno-power-mpower2-mno-power2-mpowerpc-mno-powerpc-mpowerpc-gpopt-mno-powerpc-gpopt-mpowerpc-gfxopt-mno-powerpc-gfxopt-mpowerpc64-mno-powerpc64Neither architecture is a subset of the other. However there is a large common subset of instructions supported by both. An MQ register is included in processors supporting the POWER architecture.
You use these options to specify which instructions are available on the processor you are using. The default value of these options is determined when configuring GCC. Specifying the -mcpu=cpu_type overrides the specification of these options. We recommend you use the -mcpu=cpu_type option rather than the options listed above.
The -mpower option allows GCC to generate instructions that are found only in the POWER architecture and to use the MQ register. Specifying -mpower2 implies -power and also allows GCC to generate instructions that are present in the POWER2 architecture but not the original POWER architecture.
The -mpowerpc option allows GCC to generate instructions that are found only in the 32-bit subset of the PowerPC architecture. Specifying -mpowerpc-gpopt implies -mpowerpc and also allows GCC to use the optional PowerPC architecture instructions in the General Purpose group, including floating-point square root. Specifying -mpowerpc-gfxopt implies -mpowerpc and also allows GCC to use the optional PowerPC architecture instructions in the Graphics group, including floating-point select.
The -mpowerpc64 option allows GCC to generate the additional 64-bit instructions that are found in the full PowerPC64 architecture and to treat GPRs as 64-bit, doubleword quantities. GCC defaults to -mno-powerpc64.
If you specify both -mno-power and -mno-powerpc, GCC
will use only the instructions in the common subset of both
architectures plus some special AIX common-mode calls, and will not use
the MQ register. Specifying both -mpower and -mpowerpc
permits GCC to use any instruction from either architecture and to
allow use of the MQ register; specify this for the Motorola MPC601.
-mnew-mnemonics-mold-mnemonicsGCC defaults to the mnemonics appropriate for the architecture in
use. Specifying -mcpu=cpu_type sometimes overrides the
value of these option. Unless you are building a cross-compiler, you
should normally not specify either -mnew-mnemonics or
-mold-mnemonics, but should instead accept the default.
-mcpu=cpu_type-mcpu=common selects a completely generic processor. Code generated under this option will run on any POWER or PowerPC processor. GCC will use only the instructions in the common subset of both architectures, and will not use the MQ register. GCC assumes a generic processor model for scheduling purposes.
-mcpu=power, -mcpu=power2, -mcpu=powerpc, and -mcpu=powerpc64 specify generic POWER, POWER2, pure 32-bit PowerPC (i.e., not MPC601), and 64-bit PowerPC architecture machine types, with an appropriate, generic processor model assumed for scheduling purposes.
The other options specify a specific processor. Code generated under those options will run best on that processor, and may not run at all on others.
The -mcpu options automatically enable or disable the following options: -maltivec, -mhard-float, -mmfcrf, -mmultiple, -mnew-mnemonics, -mpower, -mpower2, -mpowerpc64, -mpowerpc-gpopt, -mpowerpc-gfxopt, -mstring. The particular options set for any particular CPU will vary between compiler versions, depending on what setting seems to produce optimal code for that CPU; it doesn't necessarily reflect the actual hardware's capabilities. If you wish to set an individual option to a particular value, you may specify it after the -mcpu option, like -mcpu=970 -mno-altivec.
On AIX, the -maltivec and -mpowerpc64 options are
not enabled or disabled by the -mcpu option at present, since
AIX does not have full support for these options. You may still
enable or disable them individually if you're sure it'll work in your
environment.
-mtune=cpu_type-maltivec-mno-altivec-mabi=spe-mabi=no-spe-misel=yes/no-misel-mspe=yes/no-mspe-mfloat-gprs=yes/no-mfloat-gprs-mfull-toc-mno-fp-in-toc-mno-sum-in-toc-mminimal-tocIf you receive a linker error message that saying you have overflowed the available TOC space, you can reduce the amount of TOC space used with the -mno-fp-in-toc and -mno-sum-in-toc options. -mno-fp-in-toc prevents GCC from putting floating-point constants in the TOC and -mno-sum-in-toc forces GCC to generate code to calculate the sum of an address and a constant at run-time instead of putting that sum into the TOC. You may specify one or both of these options. Each causes GCC to produce very slightly slower and larger code at the expense of conserving TOC space.
If you still run out of space in the TOC even when you specify both of
these options, specify -mminimal-toc instead. This option causes
GCC to make only one TOC entry for every file. When you specify this
option, GCC will produce code that is slower and larger but which
uses extremely little TOC space. You may wish to use this option
only on files that contain less frequently executed code.
-maix64-maix32long type, and the infrastructure needed to support them.
Specifying -maix64 implies -mpowerpc64 and
-mpowerpc, while -maix32 disables the 64-bit ABI and
implies -mno-powerpc64. GCC defaults to -maix32.
-mxl-compat-mno-xl-compatThe AIX calling convention was extended but not initially documented to
handle an obscure K&R C case of calling a function that takes the
address of its arguments with fewer arguments than declared. AIX XL
compilers access floating point arguments which do not fit in the
RSA from the stack when a subroutine is compiled without
optimization. Because always storing floating-point arguments on the
stack is inefficient and rarely needed, this option is not enabled by
default and only is necessary when calling subroutines compiled by AIX
XL compilers without optimization.
-mpe-malign-natural-malign-power-msoft-float-mhard-float-mmultiple-mno-multiple-mstring-mno-string-mupdate-mno-update-mfused-madd-mno-fused-madd-mno-bit-align-mbit-alignFor example, by default a structure containing nothing but 8
unsigned bit-fields of length 1 would be aligned to a 4 byte
boundary and have a size of 4 bytes. By using -mno-bit-align,
the structure would be aligned to a 1 byte boundary and be one byte in
size.
-mno-strict-align-mstrict-align-mrelocatable-mno-relocatable-mrelocatable-lib-mno-relocatable-lib-mno-toc-mtoc-mlittle-mlittle-endian-mbig-mbig-endian-mdynamic-no-pic-mprioritize-restricted-insns=priority-msched-costly-dep=dependence_type-minsert-sched-nops=scheme-mcall-sysv-mcall-sysv-eabi-mcall-sysv-noeabi-mcall-solaris-mcall-linux-mcall-gnu-mcall-netbsd-maix-struct-return-msvr4-struct-return-mabi=altivec-mabi=no-altivec-mprototype-mno-prototype-msim-mmvme-mads-myellowknife-mvxworks-mwindiss-memb-meabi-mno-eabi__eabi is called to from main to set up the eabi
environment, and the -msdata option can use both r2 and
r13 to point to two separate small data areas. Selecting
-mno-eabi means that the stack is aligned to a 16 byte boundary,
do not call an initialization function from main, and the
-msdata option will only use r13 to point to a single
small data area. The -meabi option is on by default if you
configured GCC using one of the powerpc*-*-eabi* options.
-msdata=eabiconst global and static data in the .sdata2 section, which
is pointed to by register r2. Put small initialized
non-const global and static data in the .sdata section,
which is pointed to by register r13. Put small uninitialized
global and static data in the .sbss section, which is adjacent to
the .sdata section. The -msdata=eabi option is
incompatible with the -mrelocatable option. The
-msdata=eabi option also sets the -memb option.
-msdata=sysvr13. Put small uninitialized global and static data in the
.sbss section, which is adjacent to the .sdata section.
The -msdata=sysv option is incompatible with the
-mrelocatable option.
-msdata=default-msdata-msdata-datar13
to address small data however. This is the default behavior unless
other -msdata options are used.
-msdata=none-mno-sdata-G num-mregnames-mno-regnames-mlongcall-mno-longcallshortcall function attribute, or by #pragma longcall(0).
Some linkers are capable of detecting out-of-range calls and generating glue code on the fly. On these systems, long calls are unnecessary and generate slower code. As of this writing, the AIX linker can do this, as can the GNU linker for PowerPC/64. It is planned to add this feature to the GNU linker for 32-bit PowerPC systems as well.
On Mach-O (Darwin) systems, this option directs the compiler emit to the glue for every direct call, and the Darwin linker decides whether to use or discard it.
In the future, we may cause GCC to ignore all longcall specifications
when the linker is known to generate glue.
-pthreadThese options are defined for all architectures running the Darwin operating system. They are useful for compatibility with other Mac OS compilers.
-all_load-arch_errors_fatal-bind_at_load-bundle-bundle_loader executable-allowable_client client_name-arch_only
-client_name-compatibility_version-current_version-dependency-file-dylib_file-dylinker_install_name-dynamic-dynamiclib-exported_symbols_list-filelist-flat_namespace-force_cpusubtype_ALL-force_flat_namespace-headerpad_max_install_names-image_base-init-install_name-keep_private_externs-multi_module-multiply_defined-multiply_defined_unused-noall_load-nofixprebinding-nomultidefs-noprebind-noseglinkedit-pagezero_size-prebind-prebind_all_twolevel_modules-private_bundle-read_only_relocs-sectalign-sectobjectsymbols-whyload-seg1addr-sectcreate-sectobjectsymbols-sectorder-seg_addr_table-seg_addr_table_filename-seglinkedit-segprot-segs_read_only_addr-segs_read_write_addr-single_module-static-sub_library-sub_umbrella-twolevel_namespace-umbrella-undefined-unexported_symbols_list-weak_reference_mismatches-whatsloaded-EB-EL-march=archIn processor names, a final 000 can be abbreviated as k (for example, -march=r2k). Prefixes are optional, and vr may be written r.
GCC defines two macros based on the value of this option. The first is _MIPS_ARCH, which gives the name of target architecture, as a string. The second has the form _MIPS_ARCH_foo, where foo is the capitalized value of _MIPS_ARCH. For example, -march=r2000 will set _MIPS_ARCH to "r2000" and define the macro _MIPS_ARCH_R2000.
Note that the _MIPS_ARCH macro uses the processor names given
above. In other words, it will have the full prefix and will not
abbreviate 000 as k. In the case of from-abi,
the macro names the resolved architecture (either "mips1" or
"mips3"). It names the default architecture when no
-march option is given.
-mtune=archWhen this option is not used, GCC will optimize for the processor specified by -march. By using -march and -mtune together, it is possible to generate code that will run on a family of processors, but optimize the code for one particular member of that family.
-mtune defines the macros _MIPS_TUNE and
_MIPS_TUNE_foo, which work in the same way as the
-march ones described above.
-mips1-mips2-mips3-mips4-mips32-mips32r2-mips64-mips16-mno-mips16-mabi=32-mabi=o64-mabi=n32-mabi=64-mabi=eabiNote that the EABI has a 32-bit and a 64-bit variant. GCC normally
generates 64-bit code when you select a 64-bit architecture, but you
can use -mgp32 to get 32-bit code instead.
-mabicalls-mno-abicalls-mxgot-mno-xgotGCC normally uses a single instruction to load values from the GOT. While this is relatively efficient, it will only work if the GOT is smaller than about 64k. Anything larger will cause the linker to report an error such as:
relocation truncated to fit: R_MIPS_GOT16 foobar
If this happens, you should recompile your code with -mxgot. It should then work with very large GOTs, although it will also be less efficient, since it will take three instructions to fetch the value of a global symbol.
Note that some linkers can create multiple GOTs. If you have such a linker, you should only need to use -mxgot when a single object file accesses more than 64k's worth of GOT entries. Very few do.
These options have no effect unless GCC is generating position
independent code.
-membedded-pic-mno-embedded-pic-mgp32-mgp64-mfp32-mfp64-mhard-float-msoft-float-msingle-float-mdouble-float-mint64int and long types to be 64 bits wide. See
-mlong32 for an explanation of the default and the way
that the pointer size is determined.
-mlong64long types to be 64 bits wide. See -mlong32 for
an explanation of the default and the way that the pointer size is
determined.
-mlong32long, int, and pointer types to be 32 bits wide.
The default size of ints, longs and pointers depends on
the ABI. All the supported ABIs use 32-bit ints. The n64 ABI
uses 64-bit longs, as does the 64-bit EABI; the others use
32-bit longs. Pointers are the same size as longs,
or the same size as integer registers, whichever is smaller.
-G numAll modules should be compiled with the same -G num
value.
-membedded-data-mno-embedded-data-muninit-const-in-rodata-mno-uninit-const-in-rodataconst variables in the read-only data section.
This option is only meaningful in conjunction with -membedded-data.
-msplit-addresses-mno-split-addresses%hi() and %lo() assembler
relocation operators. This option has been superceded by
-mexplicit-relocs but is retained for backwards compatibility.
-mexplicit-relocs-mno-explicit-relocs-mexplicit-relocs is usually the default if GCC was configured to use an assembler that supports relocation operators. However, there are two exceptions:
-mrnames-mno-rnames-mcheck-zero-division-mno-check-zero-division-mmemcpy-mno-memcpymemcpy() for non-trivial block
moves. The default is -mno-memcpy, which allows GCC to inline
most constant-sized copies.
-mlong-calls-mno-long-callsjal instruction. Calling
functions using jal is more efficient but requires the caller
and callee to be in the same 256 megabyte segment.
This option has no effect on abicalls code. The default is
-mno-long-calls.
-mmad-mno-madmad, madu and mul
instructions, as provided by the R4650 ISA.
-mfused-madd-mno-fused-maddWhen multiply-accumulate instructions are used, the intermediate
product is calculated to infinite precision and is not subject to
the FCSR Flush to Zero bit. This may be undesirable in some
circumstances.
-nocpp-mfix-sb1-mno-fix-sb1-mflush-func=func-mno-flush-func_flush_func(), that is, the address of the
memory range for which the cache is being flushed, the size of the
memory range, and the number 3 (to flush both caches). The default
depends on the target GCC was configured for, but commonly is either
_flush_func or __cpu_flush.
-mbranch-likely-mno-branch-likelyThese -m options are defined for the i386 and x86-64 family of computers:
-mtune=cpu-typeWhile picking a specific cpu-type will schedule things appropriately
for that particular chip, the compiler will not generate any code that
does not run on the i386 without the -march=cpu-type option
being used.
-march=cpu-type-mcpu=cpu-type-m386-m486-mpentium-mpentiumpro-mfpmath=unitThis is the default choice for i386 compiler.
For i387 you need to use -march=cpu-type, -msse or -msse2 switches to enable SSE extensions and make this option effective. For x86-64 compiler, these extensions are enabled by default.
The resulting code should be considerably faster in the majority of cases and avoid the numerical instability problems of 387 code, but may break some existing code that expects temporaries to be 80bit.
This is the default choice for the x86-64 compiler.
-masm=dialect-mieee-fp-mno-ieee-fp-msoft-floatOn machines where a function returns floating point results in the 80387
register stack, some floating point opcodes may be emitted even if
-msoft-float is used.
-mno-fp-ret-in-387The usual calling convention has functions return values of types
float and double in an FPU register, even if there
is no FPU. The idea is that the operating system should emulate
an FPU.
The option -mno-fp-ret-in-387 causes such values to be returned
in ordinary CPU registers instead.
-mno-fancy-math-387sin, cos and
sqrt instructions for the 387. Specify this option to avoid
generating those instructions. This option is the default on FreeBSD,
OpenBSD and NetBSD. This option is overridden when -march
indicates that the target cpu will always have an FPU and so the
instruction will not need emulation. As of revision 2.6.1, these
instructions are not generated unless you also use the
-funsafe-math-optimizations switch.
-malign-double-mno-align-doubledouble, long double, and
long long variables on a two word boundary or a one word
boundary. Aligning double variables on a two word boundary will
produce code that runs somewhat faster on a Pentium at the
expense of more memory.
Warning: if you use the -malign-double switch,
structures containing the above types will be aligned differently than
the published application binary interface specifications for the 386
and will not be binary compatible with structures in code compiled
without that switch.
-m96bit-long-double-m128bit-long-doublelong double type. The i386
application binary interface specifies the size to be 96 bits,
so -m96bit-long-double is the default in 32 bit mode.
Modern architectures (Pentium and newer) would prefer long double
to be aligned to an 8 or 16 byte boundary. In arrays or structures
conforming to the ABI, this would not be possible. So specifying a
-m128bit-long-double will align long double
to a 16 byte boundary by padding the long double with an additional
32 bit zero.
In the x86-64 compiler, -m128bit-long-double is the default choice as
its ABI specifies that long double is to be aligned on 16 byte boundary.
Notice that neither of these options enable any extra precision over the x87
standard of 80 bits for a long double.
Warning: if you override the default value for your target ABI, the
structures and arrays containing long double variables will change
their size as well as function calling convention for function taking
long double will be modified. Hence they will not be binary
compatible with arrays or structures in code compiled without that switch.
-msvr3-shlib-mno-svr3-shlibbss or data segments. -msvr3-shlib places them
into bss. These options are meaningful only on System V Release 3.
-mrtdret num
instruction, which pops their arguments while returning. This saves one
instruction in the caller since there is no need to pop the arguments
there.
You can specify that an individual function is called with this calling sequence with the function attribute stdcall. You can also override the -mrtd option by using the function attribute cdecl. See Function Attributes.
Warning: this calling convention is incompatible with the one normally used on Unix, so you cannot use it if you need to call libraries compiled with the Unix compiler.
Also, you must provide function prototypes for all functions that
take variable numbers of arguments (including printf);
otherwise incorrect code will be generated for calls to those
functions.
In addition, seriously incorrect code will result if you call a
function with too many arguments. (Normally, extra arguments are
harmlessly ignored.)
-mregparm=numWarning: if you use this switch, and
num is nonzero, then you must build all modules with the same
value, including any libraries. This includes the system libraries and
startup modules.
-mpreferred-stack-boundary=numOn Pentium and PentiumPro, double and long double values
should be aligned to an 8 byte boundary (see -malign-double) or
suffer significant run time performance penalties. On Pentium III, the
Streaming SIMD Extension (SSE) data type __m128 suffers similar
penalties if it is not 16 byte aligned.
To ensure proper alignment of this values on the stack, the stack boundary must be as aligned as that required by any value stored on the stack. Further, every function must be generated such that it keeps the stack aligned. Thus calling a function compiled with a higher preferred stack boundary from a function compiled with a lower preferred stack boundary will most likely misalign the stack. It is recommended that libraries that use callbacks always use the default setting.
This extra alignment does consume extra stack space, and generally
increases code size. Code that is sensitive to stack space usage, such
as embedded systems and operating system kernels, may want to reduce the
preferred alignment to -mpreferred-stack-boundary=2.
-mmmx-mno-mmx-msse-mno-sse-msse2-mno-sse2-msse3-mno-sse3-m3dnow-mno-3dnowSee X86 Built-in Functions, for details of the functions enabled and disabled by these switches.
To have SSE/SSE2 instructions generated automatically from floating-point
code, see -mfpmath=sse.
-mpush-args-mno-push-args-maccumulate-outgoing-args-mthreads-mno-align-stringops-minline-all-stringops-momit-leaf-frame-pointer-mtls-direct-seg-refs-mno-tls-direct-seg-refs%gs for 32-bit, %fs for 64-bit),
or whether the thread base pointer must be added. Whether or not this
is legal depends on the operating system, and whether it maps the
segment to cover the entire TLS area.
For systems that use GNU libc, the default is on.
These -m switches are supported in addition to the above on AMD x86-64 processors in 64-bit environments.
-m32-m64-mno-red-zone-mcmodel=small-mcmodel=kernel-mcmodel=medium-mcmodel=largeThese -m options are defined for the HPPA family of computers:
-march=architecture-typePA 2.0 support currently requires gas snapshot 19990413 or later. The
next release of binutils (current is 2.9.1) will probably contain PA 2.0
support.
-mpa-risc-1-0-mpa-risc-1-1-mpa-risc-2-0-mbig-switch-mjump-in-delay-mdisable-fpregs-mdisable-indexing-mno-space-regsSuch code is suitable for level 0 PA systems and kernels.
-mfast-indirect-callsThis option will not work in the presence of shared libraries or nested
functions.
-mlong-load-store-mportable-runtime-mgas-mschedule=cpu-type-mlinker-opt-msoft-float-msoft-float changes the calling convention in the output file;
therefore, it is only useful if you compile all of a program with
this option. In particular, you need to compile libgcc.a, the
library that comes with GCC, with -msoft-float in order for
this to work.
-msio_SIO, for server IO. The default is
-mwsio. This generates the predefines, __hp9000s700,
__hp9000s700__ and _WSIO, for workstation IO. These
options are available under HP-UX and HI-UX.
-mgnu-ld-mhp-ld-mlong-callsDistances are measured from the beginning of functions when using the -ffunction-sections option, or when using the -mgas and -mno-portable-runtime options together under HP-UX with the SOM linker.
It is normally not desirable to use this option as it will degrade performance. However, it may be useful in large applications, particularly when partial linking is used to build the application.
The types of long calls used depends on the capabilities of the
assembler and linker, and the type of code being generated. The
impact on systems that support long absolute calls, and long pic
symbol-difference or pc-relative calls should be relatively small.
However, an indirect call is used on 32-bit ELF systems in pic code
and it is quite long.
-nolibdld-staticOn HP-UX 10 and later, the GCC driver adds the necessary options to
link with libdld.sl when the -static option is specified.
This causes the resulting binary to be dynamic. On the 64-bit port,
the linkers generate dynamic binaries by default in any case. The
-nolibdld option can be used to prevent the GCC driver from
adding these link options.
-threadsThese -m options are defined for the Intel 960 implementations:
-mcpu-type-mnumerics-msoft-float-mleaf-procedures-mno-leaf-proceduresbal instruction as well as call. This will result in more
efficient code for explicit calls when the bal instruction can be
substituted by the assembler or linker, but less efficient code in other
cases, such as calls via function pointers, or using a linker that doesn't
support this optimization.
-mtail-call-mno-tail-call-mcomplex-addr-mno-complex-addr-mcode-align-mno-code-align-mic-compat-mic2.0-compat-mic3.0-compat-masm-compat-mintel-asm-mstrict-align-mno-strict-align-mold-align-mlong-double-64These -m options are defined for the DEC Alpha implementations:
-mno-soft-float-msoft-floatNote that Alpha implementations without floating-point operations are
required to have floating-point registers.
-mfp-reg-mno-fp-regs$0 instead of $f0. This is a non-standard calling sequence,
so any function with a floating-point argument or return value called by code
compiled with -mno-fp-regs must also be compiled with that
option.
A typical use of this option is building a kernel that does not use,
and hence need not save and restore, any floating-point registers.
-mieee_IEEE_FP is
defined during compilation. The resulting code is less efficient but is
able to correctly support denormalized numbers and exceptional IEEE
values such as not-a-number and plus/minus infinity. Other Alpha
compilers call this option -ieee_with_no_inexact.
-mieee-with-inexact_IEEE_FP, _IEEE_FP_EXACT is defined as a preprocessor
macro. On some Alpha implementations the resulting code may execute
significantly slower than the code generated by default. Since there is
very little code that depends on the inexact-flag, you should
normally not specify this option. Other Alpha compilers call this
option -ieee_with_inexact.
-mfp-trap-mode=trap-mode-mfp-rounding-mode=rounding-mode-mtrap-precision=trap-precisionOther Alpha compilers provide the equivalent options called
-scope_safe and -resumption_safe.
-mieee-conformant-mbuild-constantsUse this option to require GCC to construct all integer constants using code, even if it takes more instructions (the maximum is six).
You would typically use this option to build a shared library dynamic
loader. Itself a shared library, it must relocate itself in memory
before it can find the variables and constants in its own data segment.
-malpha-as-mgas-mbwx-mno-bwx-mcix-mno-cix-mfix-mno-fix-mmax-mno-max-mfloat-vax-mfloat-ieee-mexplicit-relocs-mno-explicit-relocs-msmall-data-mlarge-data.sdata and .sbss sections) and are accessed via
16-bit relocations off of the $gp register. This limits the
size of the small data area to 64KB, but allows the variables to be
directly accessed via a single instruction.
The default is -mlarge-data. With this option the data area
is limited to just below 2GB. Programs that require more than 2GB of
data must use malloc or mmap to allocate the data in the
heap instead of in the program's data segment.
When generating code for shared libraries, -fpic implies
-msmall-data and -fPIC implies -mlarge-data.
-msmall-text-mlarge-text$gp value, and thus reduce the number of instructions
required for a function call from 4 to 1.
The default is -mlarge-text.
-mcpu=cpu_typeSupported values for cpu_type are
-mtune=cpu_type-mmemory-latency=timeValid options for time are
These -m options are defined for the DEC Alpha/VMS implementations:
-mvms-return-codes