6243 lines
241 KiB
Plaintext
6243 lines
241 KiB
Plaintext
@c Copyright (C) 1988,89,92,93,94,95,96,97,1998 Free Software Foundation, Inc.
|
|
@c This is part of the GCC manual.
|
|
@c For copying conditions, see the file gcc.texi.
|
|
|
|
@node Invoking GCC
|
|
@chapter GNU CC Command Options
|
|
@cindex GNU CC command options
|
|
@cindex command options
|
|
@cindex options, GNU CC command
|
|
|
|
When you invoke GNU CC, it normally does preprocessing, compilation,
|
|
assembly and linking. The ``overall options'' allow you to stop this
|
|
process at an intermediate stage. For example, the @samp{-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.
|
|
|
|
@cindex C compilation options
|
|
Most of the command line options that you can use with GNU CC 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.
|
|
|
|
@cindex C++ compilation options
|
|
@xref{Invoking G++,,Compiling C++ Programs}, for a summary of special
|
|
options for compiling C++ programs.
|
|
|
|
@cindex grouping options
|
|
@cindex options, grouping
|
|
The @code{gcc} program accepts options and file names as operands. Many
|
|
options have multiletter names; therefore multiple single-letter options
|
|
may @emph{not} be grouped: @samp{-dr} is very different from @w{@samp{-d
|
|
-r}}.
|
|
|
|
@cindex order of options
|
|
@cindex options, order
|
|
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 @samp{-L} more than once,
|
|
the directories are searched in the order specified.
|
|
|
|
Many options have long names starting with @samp{-f} or with
|
|
@samp{-W}---for example, @samp{-fforce-mem},
|
|
@samp{-fstrength-reduce}, @samp{-Wformat} and so on. Most of
|
|
these have both positive and negative forms; the negative form of
|
|
@samp{-ffoo} would be @samp{-fno-foo}. This manual documents
|
|
only one of these two forms, whichever one is not the default.
|
|
|
|
@menu
|
|
* Option Summary:: Brief list of all options, without explanations.
|
|
* Overall Options:: Controlling the kind of output:
|
|
an executable, object files, assembler files,
|
|
or preprocessed source.
|
|
* Invoking G++:: Compiling C++ programs.
|
|
* C Dialect Options:: Controlling the variant of C language compiled.
|
|
* C++ Dialect Options:: Variations on C++.
|
|
* Warning Options:: How picky should the compiler be?
|
|
* Debugging Options:: Symbol tables, measurements, and debugging dumps.
|
|
* Optimize Options:: How much optimization?
|
|
* Preprocessor Options:: Controlling header files and macro definitions.
|
|
Also, getting dependency information for Make.
|
|
* Assembler Options:: Passing options to the assembler.
|
|
* Link Options:: Specifying libraries and so on.
|
|
* Directory Options:: Where to find header files and libraries.
|
|
Where to find the compiler executable files.
|
|
* Target Options:: Running a cross-compiler, or an old version of GNU CC.
|
|
* Submodel Options:: Specifying minor hardware or convention variations,
|
|
such as 68010 vs 68020.
|
|
* Code Gen Options:: Specifying conventions for function calls, data layout
|
|
and register usage.
|
|
* Environment Variables:: Env vars that affect GNU CC.
|
|
* Running Protoize:: Automatically adding or removing function prototypes.
|
|
@end menu
|
|
|
|
@node Option Summary
|
|
@section Option Summary
|
|
|
|
Here is a summary of all the options, grouped by type. Explanations are
|
|
in the following sections.
|
|
|
|
@table @emph
|
|
@item Overall Options
|
|
@xref{Overall Options,,Options Controlling the Kind of Output}.
|
|
@smallexample
|
|
-c -S -E -o @var{file} -pipe -v -x @var{language}
|
|
@end smallexample
|
|
|
|
@item C Language Options
|
|
@xref{C Dialect Options,,Options Controlling C Dialect}.
|
|
@smallexample
|
|
-ansi -fallow-single-precision -fcond-mismatch -fno-asm
|
|
-fno-builtin -ffreestanding -fhosted -fsigned-bitfields -fsigned-char
|
|
-funsigned-bitfields -funsigned-char -fwritable-strings
|
|
-traditional -traditional-cpp -trigraphs
|
|
@end smallexample
|
|
|
|
@item C++ Language Options
|
|
@xref{C++ Dialect Options,,Options Controlling C++ Dialect}.
|
|
@smallexample
|
|
-fall-virtual -fdollars-in-identifiers -felide-constructors
|
|
-fenum-int-equiv -fexternal-templates -ffor-scope
|
|
-fno-for-scope -fhandle-signatures -fmemoize-lookups
|
|
-fname-mangling-version-@var{n} -fno-default-inline
|
|
-fno-gnu-keywords -fnonnull-objects -fguiding-decls
|
|
-foperator-names -fno-optional-diags -fstrict-prototype -fthis-is-variable
|
|
-ftemplate-depth-@var{n} -nostdinc++ -traditional +e@var{n}
|
|
@end smallexample
|
|
|
|
@item Warning Options
|
|
@xref{Warning Options,,Options to Request or Suppress Warnings}.
|
|
@smallexample
|
|
-fsyntax-only -pedantic -pedantic-errors
|
|
-w -W -Wall -Waggregate-return -Wbad-function-cast
|
|
-Wcast-align -Wcast-qual -Wchar-subscript -Wcomment
|
|
-Wconversion -Werror -Wformat
|
|
-Wid-clash-@var{len} -Wimplicit -Wimplicit-int
|
|
-Wimplicit-function-declaration -Wimport
|
|
-Werror-implicit-function-declaration -Winline
|
|
-Wlarger-than-@var{len} -Wlong-long
|
|
-Wmain -Wmissing-declarations
|
|
-Wmissing-prototypes -Wmultichar -Wnested-externs -Wno-import
|
|
-Wold-style-cast -Woverloaded-virtual -Wparentheses
|
|
-Wpointer-arith -Wredundant-decls -Wreorder -Wreturn-type
|
|
-Wshadow -Wsign-compare -Wstrict-prototypes -Wswitch
|
|
-Wsynth -Wtemplate-debugging -Wtraditional -Wtrigraphs
|
|
-Wundef -Wuninitialized -Wunused -Wwrite-strings
|
|
-Wunknown-pragmas
|
|
@end smallexample
|
|
|
|
@item Debugging Options
|
|
@xref{Debugging Options,,Options for Debugging Your Program or GCC}.
|
|
@smallexample
|
|
-a -ax -d@var{letters} -fpretend-float
|
|
-fprofile-arcs -ftest-coverage
|
|
-g -g@var{level} -gcoff -gdwarf -gdwarf-1 -gdwarf-1+ -gdwarf-2
|
|
-ggdb -gstabs -gstabs+ -gxcoff -gxcoff+
|
|
-p -pg -print-file-name=@var{library} -print-libgcc-file-name
|
|
-print-prog-name=@var{program} -print-search-dirs -save-temps
|
|
@end smallexample
|
|
|
|
@item Optimization Options
|
|
@xref{Optimize Options,,Options that Control Optimization}.
|
|
@smallexample
|
|
-fbranch-probabilities -foptimize-register-moves
|
|
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks
|
|
-fdelayed-branch -fexpensive-optimizations
|
|
-ffast-math -ffloat-store -fforce-addr -fforce-mem
|
|
-ffunction-sections -fgcse -finline-functions
|
|
-fkeep-inline-functions -fno-default-inline
|
|
-fno-defer-pop -fno-function-cse
|
|
-fno-inline -fno-peephole -fomit-frame-pointer -fregmove
|
|
-frerun-cse-after-loop -frerun-loop-opt -fschedule-insns
|
|
-fschedule-insns2 -fstrength-reduce -fthread-jumps
|
|
-funroll-all-loops -funroll-loops
|
|
-fmove-all-movables -freduce-all-givs -fstrict-aliasing
|
|
-fstructure-noalias
|
|
-O -O0 -O1 -O2 -O3 -Os
|
|
@end smallexample
|
|
|
|
@item Preprocessor Options
|
|
@xref{Preprocessor Options,,Options Controlling the Preprocessor}.
|
|
@smallexample
|
|
-A@var{question}(@var{answer}) -C -dD -dM -dN
|
|
-D@var{macro}@r{[}=@var{defn}@r{]} -E -H
|
|
-idirafter @var{dir}
|
|
-include @var{file} -imacros @var{file}
|
|
-iprefix @var{file} -iwithprefix @var{dir}
|
|
-iwithprefixbefore @var{dir} -isystem @var{dir}
|
|
-M -MD -MM -MMD -MG -nostdinc -P -trigraphs
|
|
-undef -U@var{macro} -Wp,@var{option}
|
|
@end smallexample
|
|
|
|
@item Assembler Option
|
|
@xref{Assembler Options,,Passing Options to the Assembler}.
|
|
@smallexample
|
|
-Wa,@var{option}
|
|
@end smallexample
|
|
|
|
@item Linker Options
|
|
@xref{Link Options,,Options for Linking}.
|
|
@smallexample
|
|
@var{object-file-name} -l@var{library}
|
|
-nostartfiles -nodefaultlibs -nostdlib
|
|
-s -static -shared -symbolic
|
|
-Wl,@var{option} -Xlinker @var{option}
|
|
-u @var{symbol}
|
|
@end smallexample
|
|
|
|
@item Directory Options
|
|
@xref{Directory Options,,Options for Directory Search}.
|
|
@smallexample
|
|
-B@var{prefix} -I@var{dir} -I- -L@var{dir} -specs=@var{file}
|
|
@end smallexample
|
|
|
|
@item Target Options
|
|
@c I wrote this xref this way to avoid overfull hbox. -- rms
|
|
@xref{Target Options}.
|
|
@smallexample
|
|
-b @var{machine} -V @var{version}
|
|
@end smallexample
|
|
|
|
@item Machine Dependent Options
|
|
@xref{Submodel Options,,Hardware Models and Configurations}.
|
|
@smallexample
|
|
@emph{M680x0 Options}
|
|
-m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040
|
|
-m68060 -mcpu32 -m5200 -m68881 -mbitfield -mc68000 -mc68020
|
|
-mfpa -mnobitfield -mrtd -mshort -msoft-float
|
|
-malign-int
|
|
|
|
@emph{VAX Options}
|
|
-mg -mgnu -munix
|
|
|
|
@emph{SPARC Options}
|
|
-mcpu=@var{cpu type}
|
|
-mtune=@var{cpu type}
|
|
-mcmodel=@var{code model}
|
|
-malign-jumps=@var{num} -malign-loops=@var{num}
|
|
-malign-functions=@var{num}
|
|
-m32 -m64
|
|
-mapp-regs -mbroken-saverestore -mcypress -mepilogue
|
|
-mflat -mfpu -mhard-float -mhard-quad-float
|
|
-mimpure-text -mlive-g0 -mno-app-regs -mno-epilogue
|
|
-mno-flat -mno-fpu -mno-impure-text
|
|
-mno-stack-bias -mno-unaligned-doubles
|
|
-msoft-float -msoft-quad-float -msparclite -mstack-bias
|
|
-msupersparc -munaligned-doubles -mv8
|
|
|
|
@emph{Convex Options}
|
|
-mc1 -mc2 -mc32 -mc34 -mc38
|
|
-margcount -mnoargcount
|
|
-mlong32 -mlong64
|
|
-mvolatile-cache -mvolatile-nocache
|
|
|
|
@emph{AMD29K Options}
|
|
-m29000 -m29050 -mbw -mnbw -mdw -mndw
|
|
-mlarge -mnormal -msmall
|
|
-mkernel-registers -mno-reuse-arg-regs
|
|
-mno-stack-check -mno-storem-bug
|
|
-mreuse-arg-regs -msoft-float -mstack-check
|
|
-mstorem-bug -muser-registers
|
|
|
|
@emph{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
|
|
-mshort-load-bytes -mno-short-load-bytes -mshort-load-words -mno-short-load-words
|
|
-msoft-float -mhard-float -mfpe
|
|
-mthumb-interwork -mno-thumb-interwork
|
|
-mcpu= -march= -mfpe=
|
|
-mstructure-size-boundary=
|
|
-mbsd -mxopen -mno-symrename
|
|
|
|
@emph{Thumb Options}
|
|
-mtpcs-frame -mno-tpcs-frame
|
|
-mtpcs-leaf-frame -mno-tpcs-leaf-frame
|
|
-mlittle-endian -mbig-endian
|
|
-mthumb-interwork -mno-thumb-interwork
|
|
-mstructure-size-boundary=
|
|
|
|
@emph{MN10200 Options}
|
|
-mrelax
|
|
|
|
@emph{MN10300 Options}
|
|
-mmult-bug
|
|
-mno-mult-bug
|
|
-mrelax
|
|
|
|
@emph{M32R/D Options}
|
|
-mcode-model=@var{model type} -msdata=@var{sdata type}
|
|
-G @var{num}
|
|
|
|
@emph{M88K Options}
|
|
-m88000 -m88100 -m88110 -mbig-pic
|
|
-mcheck-zero-division -mhandle-large-shift
|
|
-midentify-revision -mno-check-zero-division
|
|
-mno-ocs-debug-info -mno-ocs-frame-position
|
|
-mno-optimize-arg-area -mno-serialize-volatile
|
|
-mno-underscores -mocs-debug-info
|
|
-mocs-frame-position -moptimize-arg-area
|
|
-mserialize-volatile -mshort-data-@var{num} -msvr3
|
|
-msvr4 -mtrap-large-shift -muse-div-instruction
|
|
-mversion-03.00 -mwarn-passed-structs
|
|
|
|
@emph{RS/6000 and PowerPC Options}
|
|
-mcpu=@var{cpu type}
|
|
-mtune=@var{cpu type}
|
|
-mpower -mno-power -mpower2 -mno-power2
|
|
-mpowerpc -mno-powerpc
|
|
-mpowerpc-gpopt -mno-powerpc-gpopt
|
|
-mpowerpc-gfxopt -mno-powerpc-gfxopt
|
|
-mnew-mnemonics -mno-new-mnemonics
|
|
-mfull-toc -mminimal-toc -mno-fop-in-toc -mno-sum-in-toc
|
|
-maix64 -maix32 -mxl-call -mno-xl-call -mthreads -mpe
|
|
-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
|
|
-mcall-aix -mcall-sysv -mprototype -mno-prototype
|
|
-msim -mmvme -mads -myellowknife -memb -msdata
|
|
-msdata=@var{opt} -G @var{num}
|
|
|
|
@emph{RT Options}
|
|
-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs
|
|
-mfull-fp-blocks -mhc-struct-return -min-line-mul
|
|
-mminimum-fp-blocks -mnohc-struct-return
|
|
|
|
@emph{MIPS Options}
|
|
-mabicalls -mcpu=@var{cpu type} -membedded-data
|
|
-membedded-pic -mfp32 -mfp64 -mgas -mgp32 -mgp64
|
|
-mgpopt -mhalf-pic -mhard-float -mint64 -mips1
|
|
-mips2 -mips3 -mips4 -mlong64 -mlong-calls -mmemcpy
|
|
-mmips-as -mmips-tfile -mno-abicalls
|
|
-mno-embedded-data -mno-embedded-pic
|
|
-mno-gpopt -mno-long-calls
|
|
-mno-memcpy -mno-mips-tfile -mno-rnames -mno-stats
|
|
-mrnames -msoft-float
|
|
-m4650 -msingle-float -mmad
|
|
-mstats -EL -EB -G @var{num} -nocpp
|
|
-mabi=32 -mabi=n32 -mabi=64 -mabi=eabi
|
|
|
|
@emph{i386 Options}
|
|
-mcpu=@var{cpu type}
|
|
-march=@var{cpu type}
|
|
-m386 -m486 -malign-double
|
|
-mieee-fp -mno-fancy-math-387
|
|
-mno-fp-ret-in-387 -mno-ieee-fp
|
|
-mno-wide-multiply -mprofiler-epilogue -mrtd
|
|
-msoft-float -msvr3-shlib
|
|
-mreg-alloc=@var{list} -mregparm=@var{num}
|
|
-malign-jumps=@var{num} -malign-loops=@var{num}
|
|
-malign-functions=@var{num}
|
|
|
|
@emph{HPPA Options}
|
|
-mbig-switch -mdisable-fpregs -mdisable-indexing
|
|
-mfast-indirect-calls -mgas -mjump-in-delay
|
|
-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
|
|
-mno-space-regs -msoft-float -mpa-risc-1-0
|
|
-mpa-risc-1-1 -mportable-runtime
|
|
-mschedule=@var{list} -mspace -mspace-regs
|
|
|
|
@emph{Intel 960 Options}
|
|
-m@var{cpu 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
|
|
|
|
@emph{DEC Alpha Options}
|
|
-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float
|
|
-malpha-as -mgas
|
|
-mieee -mieee-with-inexact -mieee-conformant
|
|
-mfp-trap-mode=@var{mode} -mfp-rounding-mode=@var{mode}
|
|
-mtrap-precision=@var{mode} -mbuild-constants
|
|
-mcpu=@var{cpu type}
|
|
-mbwx -mno-bwx -mcix -mno-cix -mmax -mno-max
|
|
-mmemory-latency=@var{time}
|
|
|
|
@emph{Clipper Options}
|
|
-mc300 -mc400
|
|
|
|
@emph{H8/300 Options}
|
|
-mrelax -mh -ms -mint32 -malign-300
|
|
|
|
@emph{SH Options}
|
|
-m1 -m2 -m3 -m3e -mb -ml -mdalign -mrelax
|
|
|
|
@emph{System V Options}
|
|
-Qy -Qn -YP,@var{paths} -Ym,@var{dir}
|
|
|
|
@emph{ARC Options}
|
|
-EB -EL
|
|
-mmangle-cpu -mcpu=@var{cpu} -mtext=@var{text section}
|
|
-mdata=@var{data section} -mrodata=@var{readonly data section}
|
|
|
|
@emph{V850 Options}
|
|
-mlong-calls -mno-long-calls -mep -mno-ep
|
|
-mprolog-function -mno-prolog-function -mspace
|
|
-mtda=@var{n} -msda=@var{n} -mzda=@var{n}
|
|
-mv850 -mbig-switch
|
|
@end smallexample
|
|
|
|
@item Code Generation Options
|
|
@xref{Code Gen Options,,Options for Code Generation Conventions}.
|
|
@smallexample
|
|
-fcall-saved-@var{reg} -fcall-used-@var{reg}
|
|
-fexceptions -ffixed-@var{reg} -finhibit-size-directive
|
|
-fcheck-memory-usage -fprefix-function-name
|
|
-fno-common -fno-ident -fno-gnu-linker
|
|
-fpcc-struct-return -fpic -fPIC
|
|
-freg-struct-return -fshared-data -fshort-enums
|
|
-fshort-double -fvolatile -fvolatile-global
|
|
-fverbose-asm -fpack-struct -fstack-check +e0 +e1
|
|
-fargument-alias -fargument-noalias
|
|
-fargument-noalias-global
|
|
@end smallexample
|
|
@end table
|
|
|
|
@menu
|
|
* Overall Options:: Controlling the kind of output:
|
|
an executable, object files, assembler files,
|
|
or preprocessed source.
|
|
* C Dialect Options:: Controlling the variant of C language compiled.
|
|
* C++ Dialect Options:: Variations on C++.
|
|
* Warning Options:: How picky should the compiler be?
|
|
* Debugging Options:: Symbol tables, measurements, and debugging dumps.
|
|
* Optimize Options:: How much optimization?
|
|
* Preprocessor Options:: Controlling header files and macro definitions.
|
|
Also, getting dependency information for Make.
|
|
* Assembler Options:: Passing options to the assembler.
|
|
* Link Options:: Specifying libraries and so on.
|
|
* Directory Options:: Where to find header files and libraries.
|
|
Where to find the compiler executable files.
|
|
* Target Options:: Running a cross-compiler, or an old version of GNU CC.
|
|
@end menu
|
|
|
|
@node Overall Options
|
|
@section Options Controlling the Kind of Output
|
|
|
|
Compilation can involve up to four stages: preprocessing, compilation
|
|
proper, assembly and linking, always in that order. The first three
|
|
stages apply to an individual source file, and end by producing an
|
|
object file; linking combines all the object files (those newly
|
|
compiled, and those specified as input) into an executable file.
|
|
|
|
@cindex file name suffix
|
|
For any given input file, the file name suffix determines what kind of
|
|
compilation is done:
|
|
|
|
@table @code
|
|
@item @var{file}.c
|
|
C source code which must be preprocessed.
|
|
|
|
@item @var{file}.i
|
|
C source code which should not be preprocessed.
|
|
|
|
@item @var{file}.ii
|
|
C++ source code which should not be preprocessed.
|
|
|
|
@item @var{file}.m
|
|
Objective-C source code. Note that you must link with the library
|
|
@file{libobjc.a} to make an Objective-C program work.
|
|
|
|
@item @var{file}.h
|
|
C header file (not to be compiled or linked).
|
|
|
|
@item @var{file}.cc
|
|
@itemx @var{file}.cxx
|
|
@itemx @var{file}.cpp
|
|
@itemx @var{file}.C
|
|
C++ source code which must be preprocessed. Note that in @samp{.cxx},
|
|
the last two letters must both be literally @samp{x}. Likewise,
|
|
@samp{.C} refers to a literal capital C.
|
|
|
|
@item @var{file}.s
|
|
Assembler code.
|
|
|
|
@item @var{file}.S
|
|
Assembler code which must be preprocessed.
|
|
|
|
@item @var{other}
|
|
An object file to be fed straight into linking.
|
|
Any file name with no recognized suffix is treated this way.
|
|
@end table
|
|
|
|
You can specify the input language explicitly with the @samp{-x} option:
|
|
|
|
@table @code
|
|
@item -x @var{language}
|
|
Specify explicitly the @var{language} for the following input files
|
|
(rather than letting the compiler choose a default based on the file
|
|
name suffix). This option applies to all following input files until
|
|
the next @samp{-x} option. Possible values for @var{language} are:
|
|
@example
|
|
c objective-c c++
|
|
c-header cpp-output c++-cpp-output
|
|
assembler assembler-with-cpp
|
|
@end example
|
|
|
|
@item -x none
|
|
Turn off any specification of a language, so that subsequent files are
|
|
handled according to their file name suffixes (as they are if @samp{-x}
|
|
has not been used at all).
|
|
@end table
|
|
|
|
If you only want some of the stages of compilation, you can use
|
|
@samp{-x} (or filename suffixes) to tell @code{gcc} where to start, and
|
|
one of the options @samp{-c}, @samp{-S}, or @samp{-E} to say where
|
|
@code{gcc} is to stop. Note that some combinations (for example,
|
|
@samp{-x cpp-output -E} instruct @code{gcc} to do nothing at all.
|
|
|
|
@table @code
|
|
@item -c
|
|
Compile or assemble the source files, but do not link. The linking
|
|
stage simply is not done. The ultimate output is in the form of an
|
|
object file for each source file.
|
|
|
|
By default, the object file name for a source file is made by replacing
|
|
the suffix @samp{.c}, @samp{.i}, @samp{.s}, etc., with @samp{.o}.
|
|
|
|
Unrecognized input files, not requiring compilation or assembly, are
|
|
ignored.
|
|
|
|
@item -S
|
|
Stop after the stage of compilation proper; do not assemble. The output
|
|
is in the form of an assembler code file for each non-assembler input
|
|
file specified.
|
|
|
|
By default, the assembler file name for a source file is made by
|
|
replacing the suffix @samp{.c}, @samp{.i}, etc., with @samp{.s}.
|
|
|
|
Input files that don't require compilation are ignored.
|
|
|
|
@item -E
|
|
Stop after the preprocessing stage; do not run the compiler proper. The
|
|
output is in the form of preprocessed source code, which is sent to the
|
|
standard output.
|
|
|
|
Input files which don't require preprocessing are ignored.
|
|
|
|
@cindex output file option
|
|
@item -o @var{file}
|
|
Place output in file @var{file}. This applies regardless to whatever
|
|
sort of output is being produced, whether it be an executable file,
|
|
an object file, an assembler file or preprocessed C code.
|
|
|
|
Since only one output file can be specified, it does not make sense to
|
|
use @samp{-o} when compiling more than one input file, unless you are
|
|
producing an executable file as output.
|
|
|
|
If @samp{-o} is not specified, the default is to put an executable file
|
|
in @file{a.out}, the object file for @file{@var{source}.@var{suffix}} in
|
|
@file{@var{source}.o}, its assembler file in @file{@var{source}.s}, and
|
|
all preprocessed C source on standard output.@refill
|
|
|
|
@item -v
|
|
Print (on standard error output) the commands executed to run the stages
|
|
of compilation. Also print the version number of the compiler driver
|
|
program and of the preprocessor and the compiler proper.
|
|
|
|
@item -pipe
|
|
Use pipes rather than temporary files for communication between the
|
|
various stages of compilation. This fails to work on some systems where
|
|
the assembler is unable to read from a pipe; but the GNU assembler has
|
|
no trouble.
|
|
@end table
|
|
|
|
@node Invoking G++
|
|
@section Compiling C++ Programs
|
|
|
|
@cindex suffixes for C++ source
|
|
@cindex C++ source file suffixes
|
|
C++ source files conventionally use one of the suffixes @samp{.C},
|
|
@samp{.cc}, @samp{cpp}, or @samp{.cxx}; preprocessed C++ files use the
|
|
suffix @samp{.ii}. GNU CC 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 @code{gcc}).
|
|
|
|
@findex g++
|
|
@findex c++
|
|
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 from standard input,
|
|
or otherwise without a suffix that flags them as C++ programs.
|
|
@code{g++} is a program that calls GNU CC with the default language
|
|
set to C++, and automatically specifies linking against the C++
|
|
library.
|
|
@cindex @code{g++ 1.@var{xx}}
|
|
@cindex @code{g++}, separate compiler
|
|
@cindex @code{g++} older version
|
|
@footnote{Prior to release 2 of the compiler,
|
|
there was a separate @code{g++} compiler. That version was based on GNU
|
|
CC, but not integrated with it. Versions of @code{g++} with a
|
|
@samp{1.@var{xx}} version number---for example, @code{g++} version 1.37
|
|
or 1.42---are much less reliable than the versions integrated with GCC
|
|
2. Moreover, combining G++ @samp{1.@var{xx}} with a version 2 GCC will
|
|
simply not work.} On many systems, the script @code{g++} is also
|
|
installed with the name @code{c++}.
|
|
|
|
@cindex invoking @code{g++}
|
|
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.
|
|
@xref{C Dialect Options,,Options Controlling C Dialect}, for
|
|
explanations of options for languages related to C.
|
|
@xref{C++ Dialect Options,,Options Controlling C++ Dialect}, for
|
|
explanations of options that are meaningful only for C++ programs.
|
|
|
|
@node C Dialect Options
|
|
@section Options Controlling C Dialect
|
|
@cindex dialect options
|
|
@cindex language dialect options
|
|
@cindex options, dialect
|
|
|
|
The following options control the dialect of C (or languages derived
|
|
from C, such as C++ and Objective C) that the compiler accepts:
|
|
|
|
@table @code
|
|
@cindex ANSI support
|
|
@item -ansi
|
|
Support all ANSI standard C programs.
|
|
|
|
This turns off certain features of GNU C that are incompatible with ANSI
|
|
C, such as the @code{asm}, @code{inline} and @code{typeof} keywords, and
|
|
predefined macros such as @code{unix} and @code{vax} that identify the
|
|
type of system you are using. It also enables the undesirable and
|
|
rarely used ANSI trigraph feature, and it disables recognition of C++
|
|
style @samp{//} comments.
|
|
|
|
The alternate keywords @code{__asm__}, @code{__extension__},
|
|
@code{__inline__} and @code{__typeof__} continue to work despite
|
|
@samp{-ansi}. You would not want to use them in an ANSI C program, of
|
|
course, but it is useful to put them in header files that might be included
|
|
in compilations done with @samp{-ansi}. Alternate predefined macros
|
|
such as @code{__unix__} and @code{__vax__} are also available, with or
|
|
without @samp{-ansi}.
|
|
|
|
The @samp{-ansi} option does not cause non-ANSI programs to be
|
|
rejected gratuitously. For that, @samp{-pedantic} is required in
|
|
addition to @samp{-ansi}. @xref{Warning Options}.
|
|
|
|
The macro @code{__STRICT_ANSI__} is predefined when the @samp{-ansi}
|
|
option is used. Some header files may notice this macro and refrain
|
|
from declaring certain functions or defining certain macros that the
|
|
ANSI standard doesn't call for; this is to avoid interfering with any
|
|
programs that might use these names for other things.
|
|
|
|
The functions @code{alloca}, @code{abort}, @code{exit}, and
|
|
@code{_exit} are not builtin functions when @samp{-ansi} is used.
|
|
|
|
@item -fno-asm
|
|
Do not recognize @code{asm}, @code{inline} or @code{typeof} as a
|
|
keyword, so that code can use these words as identifiers. You can use
|
|
the keywords @code{__asm__}, @code{__inline__} and @code{__typeof__}
|
|
instead. @samp{-ansi} implies @samp{-fno-asm}.
|
|
|
|
In C++, this switch only affects the @code{typeof} keyword, since
|
|
@code{asm} and @code{inline} are standard keywords. You may want to
|
|
use the @samp{-fno-gnu-keywords} flag instead, as it also disables the
|
|
other, C++-specific, extension keywords such as @code{headof}.
|
|
|
|
@item -fno-builtin
|
|
@cindex builtin functions
|
|
@findex abort
|
|
@findex abs
|
|
@findex alloca
|
|
@findex cos
|
|
@findex exit
|
|
@findex fabs
|
|
@findex ffs
|
|
@findex labs
|
|
@findex memcmp
|
|
@findex memcpy
|
|
@findex sin
|
|
@findex sqrt
|
|
@findex strcmp
|
|
@findex strcpy
|
|
@findex strlen
|
|
Don't recognize builtin functions that do not begin with `__builtin_'
|
|
as prefix. Currently, the functions affected include @code{abort},
|
|
@code{abs}, @code{alloca}, @code{cos}, @code{exit}, @code{fabs},
|
|
@code{ffs}, @code{labs}, @code{memcmp}, @code{memcpy}, @code{sin},
|
|
@code{sqrt}, @code{strcmp}, @code{strcpy}, and @code{strlen}.
|
|
|
|
GCC normally generates special code to handle certain builtin functions
|
|
more efficiently; for instance, calls to @code{alloca} may become single
|
|
instructions that adjust the stack directly, and calls to @code{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.
|
|
|
|
The @samp{-ansi} option prevents @code{alloca} and @code{ffs} from being
|
|
builtin functions, since these functions do not have an ANSI standard
|
|
meaning.
|
|
|
|
@item -fhosted
|
|
@cindex hosted environment
|
|
|
|
Assert that compilation takes place in a hosted environment. This implies
|
|
@samp{-fbuiltin}. A hosted environment is one in which the
|
|
entire standard library is available, and in which @code{main} has a return
|
|
type of @code{int}. Examples are nearly everything except a kernel.
|
|
This is equivalent to @samp{-fno-freestanding}.
|
|
|
|
@item -ffreestanding
|
|
@cindex hosted environment
|
|
|
|
Assert that compilation takes place in a freestanding environment. This
|
|
implies @samp{-fno-builtin}. A freestanding environment
|
|
is one in which the standard library may not exist, and program startup may
|
|
not necessarily be at @code{main}. The most obvious example is an OS kernel.
|
|
This is equivalent to @samp{-fno-hosted}.
|
|
|
|
@item -trigraphs
|
|
Support ANSI C trigraphs. You don't want to know about this
|
|
brain-damage. The @samp{-ansi} option implies @samp{-trigraphs}.
|
|
|
|
@cindex traditional C language
|
|
@cindex C language, traditional
|
|
@item -traditional
|
|
Attempt to support some aspects of traditional C compilers.
|
|
Specifically:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
All @code{extern} declarations take effect globally even if they
|
|
are written inside of a function definition. This includes implicit
|
|
declarations of functions.
|
|
|
|
@item
|
|
The newer keywords @code{typeof}, @code{inline}, @code{signed}, @code{const}
|
|
and @code{volatile} are not recognized. (You can still use the
|
|
alternative keywords such as @code{__typeof__}, @code{__inline__}, and
|
|
so on.)
|
|
|
|
@item
|
|
Comparisons between pointers and integers are always allowed.
|
|
|
|
@item
|
|
Integer types @code{unsigned short} and @code{unsigned char} promote
|
|
to @code{unsigned int}.
|
|
|
|
@item
|
|
Out-of-range floating point literals are not an error.
|
|
|
|
@item
|
|
Certain constructs which ANSI regards as a single invalid preprocessing
|
|
number, such as @samp{0xe-0xd}, are treated as expressions instead.
|
|
|
|
@item
|
|
String ``constants'' are not necessarily constant; they are stored in
|
|
writable space, and identical looking constants are allocated
|
|
separately. (This is the same as the effect of
|
|
@samp{-fwritable-strings}.)
|
|
|
|
@cindex @code{longjmp} and automatic variables
|
|
@item
|
|
All automatic variables not declared @code{register} are preserved by
|
|
@code{longjmp}. Ordinarily, GNU C follows ANSI C: automatic variables
|
|
not declared @code{volatile} may be clobbered.
|
|
|
|
@item
|
|
@kindex \x
|
|
@kindex \a
|
|
@cindex escape sequences, traditional
|
|
The character escape sequences @samp{\x} and @samp{\a} evaluate as the
|
|
literal characters @samp{x} and @samp{a} respectively. Without
|
|
@w{@samp{-traditional}}, @samp{\x} is a prefix for the hexadecimal
|
|
representation of a character, and @samp{\a} produces a bell.
|
|
|
|
@item
|
|
In C++ programs, assignment to @code{this} is permitted with
|
|
@samp{-traditional}. (The option @samp{-fthis-is-variable} also has
|
|
this effect.)
|
|
@end itemize
|
|
|
|
You may wish to use @samp{-fno-builtin} as well as @samp{-traditional}
|
|
if your program uses names that are normally GNU C builtin functions for
|
|
other purposes of its own.
|
|
|
|
You cannot use @samp{-traditional} if you include any header files that
|
|
rely on ANSI C features. Some vendors are starting to ship systems with
|
|
ANSI C header files and you cannot use @samp{-traditional} on such
|
|
systems to compile files that include any system headers.
|
|
|
|
The @samp{-traditional} option also enables @samp{-traditional-cpp},
|
|
which is described next.
|
|
|
|
@item -traditional-cpp
|
|
Attempt to support some aspects of traditional C preprocessors.
|
|
Specifically:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Comments convert to nothing at all, rather than to a space. This allows
|
|
traditional token concatenation.
|
|
|
|
@item
|
|
In a preprocessing directive, the @samp{#} symbol must appear as the first
|
|
character of a line.
|
|
|
|
@item
|
|
Macro arguments are recognized within string constants in a macro
|
|
definition (and their values are stringified, though without additional
|
|
quote marks, when they appear in such a context). The preprocessor
|
|
always considers a string constant to end at a newline.
|
|
|
|
@item
|
|
@cindex detecting @w{@samp{-traditional}}
|
|
The predefined macro @code{__STDC__} is not defined when you use
|
|
@samp{-traditional}, but @code{__GNUC__} is (since the GNU extensions
|
|
which @code{__GNUC__} indicates are not affected by
|
|
@samp{-traditional}). If you need to write header files that work
|
|
differently depending on whether @samp{-traditional} is in use, by
|
|
testing both of these predefined macros you can distinguish four
|
|
situations: GNU C, traditional GNU C, other ANSI C compilers, and other
|
|
old C compilers. The predefined macro @code{__STDC_VERSION__} is also
|
|
not defined when you use @samp{-traditional}. @xref{Standard
|
|
Predefined,,Standard Predefined Macros,cpp.info,The C Preprocessor},
|
|
for more discussion of these and other predefined macros.
|
|
|
|
@item
|
|
@cindex string constants vs newline
|
|
@cindex newline vs string constants
|
|
The preprocessor considers a string constant to end at a newline (unless
|
|
the newline is escaped with @samp{\}). (Without @w{@samp{-traditional}},
|
|
string constants can contain the newline character as typed.)
|
|
@end itemize
|
|
|
|
@item -fcond-mismatch
|
|
Allow conditional expressions with mismatched types in the second and
|
|
third arguments. The value of such an expression is void.
|
|
|
|
@item -funsigned-char
|
|
Let the type @code{char} be unsigned, like @code{unsigned char}.
|
|
|
|
Each kind of machine has a default for what @code{char} should
|
|
be. It is either like @code{unsigned char} by default or like
|
|
@code{signed char} by default.
|
|
|
|
Ideally, a portable program should always use @code{signed char} or
|
|
@code{unsigned char} when it depends on the signedness of an object.
|
|
But many programs have been written to use plain @code{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 @code{char} is always a distinct type from each of
|
|
@code{signed char} or @code{unsigned char}, even though its behavior
|
|
is always just like one of those two.
|
|
|
|
@item -fsigned-char
|
|
Let the type @code{char} be signed, like @code{signed char}.
|
|
|
|
Note that this is equivalent to @samp{-fno-unsigned-char}, which is
|
|
the negative form of @samp{-funsigned-char}. Likewise, the option
|
|
@samp{-fno-signed-char} is equivalent to @samp{-funsigned-char}.
|
|
|
|
You may wish to use @samp{-fno-builtin} as well as @samp{-traditional}
|
|
if your program uses names that are normally GNU C builtin functions for
|
|
other purposes of its own.
|
|
|
|
You cannot use @samp{-traditional} if you include any header files that
|
|
rely on ANSI C features. Some vendors are starting to ship systems with
|
|
ANSI C header files and you cannot use @samp{-traditional} on such
|
|
systems to compile files that include any system headers.
|
|
|
|
@item -fsigned-bitfields
|
|
@itemx -funsigned-bitfields
|
|
@itemx -fno-signed-bitfields
|
|
@itemx -fno-unsigned-bitfields
|
|
These options control whether a bitfield is signed or unsigned, when the
|
|
declaration does not use either @code{signed} or @code{unsigned}. By
|
|
default, such a bitfield is signed, because this is consistent: the
|
|
basic integer types such as @code{int} are signed types.
|
|
|
|
However, when @samp{-traditional} is used, bitfields are all unsigned
|
|
no matter what.
|
|
|
|
@item -fwritable-strings
|
|
Store string constants in the writable data segment and don't uniquize
|
|
them. This is for compatibility with old programs which assume they can
|
|
write into string constants. The option @samp{-traditional} also has
|
|
this effect.
|
|
|
|
Writing into string constants is a very bad idea; ``constants'' should
|
|
be constant.
|
|
|
|
@item -fallow-single-precision
|
|
Do not promote single precision math operations to double precision,
|
|
even when compiling with @samp{-traditional}.
|
|
|
|
Traditional K&R C promotes all floating point operations to double
|
|
precision, regardless of the sizes of the operands. On the
|
|
architecture for which you are compiling, single precision may be faster
|
|
than double precision. If you must use @samp{-traditional}, but want
|
|
to use single precision operations when the operands are single
|
|
precision, use this option. This option has no effect when compiling
|
|
with ANSI or GNU C conventions (the default).
|
|
|
|
@end table
|
|
|
|
@node C++ Dialect Options
|
|
@section Options Controlling C++ Dialect
|
|
|
|
@cindex compiler options, C++
|
|
@cindex C++ options, command line
|
|
@cindex options, C++
|
|
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 @code{firstClass.C} like this:
|
|
|
|
@example
|
|
g++ -g -felide-constructors -O -c firstClass.C
|
|
@end example
|
|
|
|
@noindent
|
|
In this example, only @samp{-felide-constructors} is an option meant
|
|
only for C++ programs; you can use the other options with any
|
|
language supported by GNU CC.
|
|
|
|
Here is a list of options that are @emph{only} for compiling C++ programs:
|
|
|
|
@table @code
|
|
@item -fno-access-control
|
|
Turn off all access checking. This switch is mainly useful for working
|
|
around bugs in the access control code.
|
|
|
|
@item -fall-virtual
|
|
Treat all possible member functions as virtual, implicitly.
|
|
All member functions (except for constructor functions and @code{new} or
|
|
@code{delete} member operators) are treated as virtual functions of the
|
|
class where they appear.
|
|
|
|
This does not mean that all calls to these member functions will be made
|
|
through the internal table of virtual functions. Under some
|
|
circumstances, the compiler can determine that a call to a given virtual
|
|
function can be made directly; in these cases the calls are direct in
|
|
any case.
|
|
|
|
@item -fcheck-new
|
|
Check that the pointer returned by @code{operator new} is non-null
|
|
before attempting to modify the storage allocated. The current Working
|
|
Paper requires that @code{operator new} never return a null pointer, so
|
|
this check is normally unnecessary.
|
|
|
|
@item -fconserve-space
|
|
Put uninitialized or runtime-initialized global variables into the
|
|
common segment, as C does. This saves space in the executable at the
|
|
cost of not diagnosing duplicate definitions. If you compile with this
|
|
flag and your program mysteriously crashes after @code{main()} has
|
|
completed, you may have an object that is being destroyed twice because
|
|
two definitions were merged.
|
|
|
|
@item -fdollars-in-identifiers
|
|
Accept @samp{$} in identifiers. You can also explicitly prohibit use of
|
|
@samp{$} with the option @samp{-fno-dollars-in-identifiers}. (GNU C allows
|
|
@samp{$} by default on most target systems, but there are a few exceptions.)
|
|
Traditional C allowed the character @samp{$} to form part of
|
|
identifiers. However, ANSI C and C++ forbid @samp{$} in identifiers.
|
|
|
|
@item -fenum-int-equiv
|
|
Anachronistically permit implicit conversion of @code{int} to
|
|
enumeration types. Current C++ allows conversion of @code{enum} to
|
|
@code{int}, but not the other way around.
|
|
|
|
@item -fexternal-templates
|
|
Cause template instantiations to obey @samp{#pragma interface} and
|
|
@samp{implementation}; template instances are emitted or not according
|
|
to the location of the template definition. @xref{Template
|
|
Instantiation}, for more information.
|
|
|
|
This option is deprecated.
|
|
|
|
@item -falt-external-templates
|
|
Similar to -fexternal-templates, but template instances are emitted or
|
|
not according to the place where they are first instantiated.
|
|
@xref{Template Instantiation}, for more information.
|
|
|
|
This option is deprecated.
|
|
|
|
@item -ffor-scope
|
|
@itemx -fno-for-scope
|
|
If -ffor-scope is specified, the scope of variables declared in
|
|
a @i{for-init-statement} is limited to the @samp{for} loop itself,
|
|
as specified by the draft C++ standard.
|
|
If -fno-for-scope is specified, the scope of variables declared in
|
|
a @i{for-init-statement} extends to the end of the enclosing scope,
|
|
as was the case in old versions of gcc, and other (traditional)
|
|
implementations of C++.
|
|
|
|
The default if neither flag is given to follow the standard,
|
|
but to allow and give a warning for old-style code that would
|
|
otherwise be invalid, or have different behavior.
|
|
|
|
@item -fno-gnu-keywords
|
|
Do not recognize @code{classof}, @code{headof}, @code{signature},
|
|
@code{sigof} or @code{typeof} as a keyword, so that code can use these
|
|
words as identifiers. You can use the keywords @code{__classof__},
|
|
@code{__headof__}, @code{__signature__}, @code{__sigof__}, and
|
|
@code{__typeof__} instead. @samp{-ansi} implies
|
|
@samp{-fno-gnu-keywords}.
|
|
|
|
@item -fguiding-decls
|
|
Treat a function declaration with the same type as a potential function
|
|
template instantiation as though it declares that instantiation, not a
|
|
normal function. If a definition is given for the function later in the
|
|
translation unit (or another translation unit if the target supports
|
|
weak symbols), that definition will be used; otherwise the template will
|
|
be instantiated. This behavior reflects the C++ language prior to
|
|
September 1996, when guiding declarations were removed.
|
|
|
|
This option implies @samp{-fname-mangling-version-0}, and will not work
|
|
with other name mangling versions.
|
|
|
|
@item -fno-implicit-templates
|
|
Never emit code for templates which are instantiated implicitly (i.e. by
|
|
use); only emit code for explicit instantiations. @xref{Template
|
|
Instantiation}, for more information.
|
|
|
|
@item -fhandle-signatures
|
|
Recognize the @code{signature} and @code{sigof} keywords for specifying
|
|
abstract types. The default (@samp{-fno-handle-signatures}) is not to
|
|
recognize them. @xref{C++ Signatures, Type Abstraction using
|
|
Signatures}.
|
|
|
|
@item -fhuge-objects
|
|
Support virtual function calls for objects that exceed the size
|
|
representable by a @samp{short int}. Users should not use this flag by
|
|
default; if you need to use it, the compiler will tell you so. If you
|
|
compile any of your code with this flag, you must compile @emph{all} of
|
|
your code with this flag (including the C++ library, if you use it).
|
|
|
|
This flag is not useful when compiling with -fvtable-thunks.
|
|
|
|
@item -fno-implement-inlines
|
|
To save space, do not emit out-of-line copies of inline functions
|
|
controlled by @samp{#pragma implementation}. This will cause linker
|
|
errors if these functions are not inlined everywhere they are called.
|
|
|
|
@item -fmemoize-lookups
|
|
@itemx -fsave-memoized
|
|
Use heuristics to compile faster. These heuristics are not enabled by
|
|
default, since they are only effective for certain input files. Other
|
|
input files compile more slowly.
|
|
|
|
The first time the compiler must build a call to a member function (or
|
|
reference to a data member), it must (1) determine whether the class
|
|
implements member functions of that name; (2) resolve which member
|
|
function to call (which involves figuring out what sorts of type
|
|
conversions need to be made); and (3) check the visibility of the member
|
|
function to the caller. All of this adds up to slower compilation.
|
|
Normally, the second time a call is made to that member function (or
|
|
reference to that data member), it must go through the same lengthy
|
|
process again. This means that code like this:
|
|
|
|
@smallexample
|
|
cout << "This " << p << " has " << n << " legs.\n";
|
|
@end smallexample
|
|
|
|
@noindent
|
|
makes six passes through all three steps. By using a software cache, a
|
|
``hit'' significantly reduces this cost. Unfortunately, using the cache
|
|
introduces another layer of mechanisms which must be implemented, and so
|
|
incurs its own overhead. @samp{-fmemoize-lookups} enables the software
|
|
cache.
|
|
|
|
Because access privileges (visibility) to members and member functions
|
|
may differ from one function context to the next, G++ may need to flush
|
|
the cache. With the @samp{-fmemoize-lookups} flag, the cache is flushed
|
|
after every function that is compiled. The @samp{-fsave-memoized} flag
|
|
enables the same software cache, but when the compiler determines that
|
|
the context of the last function compiled would yield the same access
|
|
privileges of the next function to compile, it preserves the cache.
|
|
This is most helpful when defining many member functions for the same
|
|
class: with the exception of member functions which are friends of other
|
|
classes, each member function has exactly the same access privileges as
|
|
every other, and the cache need not be flushed.
|
|
|
|
The code that implements these flags has rotted; you should probably
|
|
avoid using them.
|
|
|
|
@item -fstrict-prototype
|
|
Within an @samp{extern "C"} linkage specification, treat a function
|
|
declaration with no arguments, such as @samp{int foo ();}, as declaring
|
|
the function to take no arguments. Normally, such a declaration means
|
|
that the function @code{foo} can take any combination of arguments, as
|
|
in C. @samp{-pedantic} implies @samp{-fstrict-prototype} unless
|
|
overridden with @samp{-fno-strict-prototype}.
|
|
|
|
This flag no longer affects declarations with C++ linkage.
|
|
|
|
@item -fname-mangling-version-@var{n}
|
|
Control the way in which names are mangled. Version 0 is compatible
|
|
with versions of g++ before 2.8. Version 1 is the default. Version 1
|
|
will allow correct mangling of function templates. For example,
|
|
version 0 mangling does not mangle foo<int, double> and foo<int, char>
|
|
given this declaration:
|
|
|
|
@example
|
|
template <class T, class U> void foo(T t);
|
|
@end example
|
|
|
|
@item -fno-nonnull-objects
|
|
Don't assume that a reference is initialized to refer to a valid object.
|
|
Although the current C++ Working Paper prohibits null references, some
|
|
old code may rely on them, and you can use @samp{-fno-nonnull-objects}
|
|
to turn on checking.
|
|
|
|
At the moment, the compiler only does this checking for conversions to
|
|
virtual base classes.
|
|
|
|
@item -foperator-names
|
|
Recognize the operator name keywords @code{and}, @code{bitand},
|
|
@code{bitor}, @code{compl}, @code{not}, @code{or} and @code{xor} as
|
|
synonyms for the symbols they refer to. @samp{-ansi} implies
|
|
@samp{-foperator-names}.
|
|
|
|
@item -fno-optional-diags
|
|
Disable diagnostics that the standard says a compiler does not need to
|
|
issue. Currently, this means the diagnostic for a name having multiple
|
|
meanings within a class.
|
|
|
|
@item -frepo
|
|
Enable automatic template instantiation. This option also implies
|
|
@samp{-fno-implicit-templates}. @xref{Template Instantiation}, for more
|
|
information.
|
|
|
|
@item -fsquangle
|
|
@itemx -fno-squangle
|
|
@samp{-fsquangle} will enable a compressed form of name mangling for
|
|
identifiers. In particular, it helps to shorten very long names by recognizing
|
|
types and class names which occur more than once, replacing them with special
|
|
short ID codes. This option also requires any C++ libraries being used to
|
|
be compiled with this option as well. The compiler has this disabled (the
|
|
equivalent of @samp{-fno-squangle}) by default.
|
|
|
|
@item -fthis-is-variable
|
|
Permit assignment to @code{this}. The incorporation of user-defined
|
|
free store management into C++ has made assignment to @samp{this} an
|
|
anachronism. Therefore, by default it is invalid to assign to
|
|
@code{this} within a class member function; that is, GNU C++ treats
|
|
@samp{this} in a member function of class @code{X} as a non-lvalue of
|
|
type @samp{X *}. However, for backwards compatibility, you can make it
|
|
valid with @samp{-fthis-is-variable}.
|
|
|
|
@item -fvtable-thunks
|
|
Use @samp{thunks} to implement the virtual function dispatch table
|
|
(@samp{vtable}). The traditional (cfront-style) approach to
|
|
implementing vtables was to store a pointer to the function and two
|
|
offsets for adjusting the @samp{this} pointer at the call site. Newer
|
|
implementations store a single pointer to a @samp{thunk} function which
|
|
does any necessary adjustment and then calls the target function.
|
|
|
|
This option also enables a heuristic for controlling emission of
|
|
vtables; if a class has any non-inline virtual functions, the vtable
|
|
will be emitted in the translation unit containing the first one of
|
|
those.
|
|
|
|
@item -ftemplate-depth-@var{n}
|
|
Set the maximum instantiation depth for template classes to @var{n}.
|
|
A limit on the template instantiation depth is needed to detect
|
|
endless recursions during template class instantiation. ANSI/ISO C++
|
|
conforming programs must not rely on a maximum depth greater than 17.
|
|
|
|
@item -nostdinc++
|
|
Do not search for header files in the standard directories specific to
|
|
C++, but do still search the other standard directories. (This option
|
|
is used when building the C++ library.)
|
|
|
|
@item -traditional
|
|
For C++ programs (in addition to the effects that apply to both C and
|
|
C++), this has the same effect as @samp{-fthis-is-variable}.
|
|
@xref{C Dialect Options,, Options Controlling C Dialect}.
|
|
@end table
|
|
|
|
In addition, these optimization, warning, and code generation options
|
|
have meanings only for C++ programs:
|
|
|
|
@table @code
|
|
@item -fno-default-inline
|
|
Do not assume @samp{inline} for functions defined inside a class scope.
|
|
@xref{Optimize Options,,Options That Control Optimization}.
|
|
|
|
@item -Wold-style-cast
|
|
@itemx -Woverloaded-virtual
|
|
@itemx -Wtemplate-debugging
|
|
Warnings that apply only to C++ programs. @xref{Warning
|
|
Options,,Options to Request or Suppress Warnings}.
|
|
|
|
@item -Weffc++
|
|
Warn about violation of some style rules from Effective C++ by Scott Myers.
|
|
|
|
@item +e@var{n}
|
|
Control how virtual function definitions are used, in a fashion
|
|
compatible with @code{cfront} 1.x. @xref{Code Gen Options,,Options for
|
|
Code Generation Conventions}.
|
|
@end table
|
|
|
|
@node Warning Options
|
|
@section Options to Request or Suppress Warnings
|
|
@cindex options to control warnings
|
|
@cindex warning messages
|
|
@cindex messages, warning
|
|
@cindex suppressing warnings
|
|
|
|
Warnings are diagnostic messages that report constructions which
|
|
are not inherently erroneous but which are risky or suggest there
|
|
may have been an error.
|
|
|
|
You can request many specific warnings with options beginning @samp{-W},
|
|
for example @samp{-Wimplicit} to request warnings on implicit
|
|
declarations. Each of these specific warning options also has a
|
|
negative form beginning @samp{-Wno-} to turn off warnings;
|
|
for example, @samp{-Wno-implicit}. This manual lists only one of the
|
|
two forms, whichever is not the default.
|
|
|
|
These options control the amount and kinds of warnings produced by GNU
|
|
CC:
|
|
|
|
@table @code
|
|
@cindex syntax checking
|
|
@item -fsyntax-only
|
|
Check the code for syntax errors, but don't do anything beyond that.
|
|
|
|
@item -pedantic
|
|
Issue all the warnings demanded by strict ANSI C and ISO C++;
|
|
reject all programs that use forbidden extensions.
|
|
|
|
Valid ANSI C and ISO C++ programs should compile properly with or without
|
|
this option (though a rare few will require @samp{-ansi}). However,
|
|
without this option, certain GNU extensions and traditional C and C++
|
|
features are supported as well. With this option, they are rejected.
|
|
|
|
@samp{-pedantic} does not cause warning messages for use of the
|
|
alternate keywords whose names begin and end with @samp{__}. Pedantic
|
|
warnings are also disabled in the expression that follows
|
|
@code{__extension__}. However, only system header files should use
|
|
these escape routes; application programs should avoid them.
|
|
@xref{Alternate Keywords}.
|
|
|
|
This option is not intended to be @i{useful}; it exists only to satisfy
|
|
pedants who would otherwise claim that GNU CC fails to support the ANSI
|
|
standard.
|
|
|
|
Some users try to use @samp{-pedantic} to check programs for strict ANSI
|
|
C conformance. They soon find that it does not do quite what they want:
|
|
it finds some non-ANSI practices, but not all---only those for which
|
|
ANSI C @emph{requires} a diagnostic.
|
|
|
|
A feature to report any failure to conform to ANSI C might be useful in
|
|
some instances, but would require considerable additional work and would
|
|
be quite different from @samp{-pedantic}. We recommend, rather, that
|
|
users take advantage of the extensions of GNU C and disregard the
|
|
limitations of other compilers. Aside from certain supercomputers and
|
|
obsolete small machines, there is less and less reason ever to use any
|
|
other C compiler other than for bootstrapping GNU CC.
|
|
|
|
@item -pedantic-errors
|
|
Like @samp{-pedantic}, except that errors are produced rather than
|
|
warnings.
|
|
|
|
@item -w
|
|
Inhibit all warning messages.
|
|
|
|
@item -Wno-import
|
|
Inhibit warning messages about the use of @samp{#import}.
|
|
|
|
@item -Wchar-subscripts
|
|
Warn if an array subscript has type @code{char}. This is a common cause
|
|
of error, as programmers often forget that this type is signed on some
|
|
machines.
|
|
|
|
@item -Wcomment
|
|
Warn whenever a comment-start sequence @samp{/*} appears in a @samp{/*}
|
|
comment, or whenever a Backslash-Newline appears in a @samp{//} comment.
|
|
|
|
@item -Wformat
|
|
Check calls to @code{printf} and @code{scanf}, etc., to make sure that
|
|
the arguments supplied have types appropriate to the format string
|
|
specified.
|
|
|
|
@item -Wimplicit-int
|
|
Warn when a declaration does not specify a type.
|
|
|
|
@item -Wimplicit-function-declaration
|
|
@itemx -Werror-implicit-function-declaration
|
|
Give a warning (or error) whenever a function is used before being
|
|
declared.
|
|
|
|
@item -Wimplicit
|
|
Same as @samp{-Wimplicit-int} and @samp{-Wimplicit-function-}@*
|
|
@samp{declaration}.
|
|
|
|
@item -Wmain
|
|
Warn if the type of @samp{main} is suspicious. @samp{main} should be a
|
|
function with external linkage, returning int, taking either zero
|
|
arguments, two, or three arguments of appropriate types.
|
|
|
|
@item -Wmultichar
|
|
Warn if a multicharacter constant (@samp{'FOOF'}) is used. Usually they
|
|
indicate a typo in the user's code, as they have implementation-defined
|
|
values, and should not be used in portable code.
|
|
|
|
@item -Wparentheses
|
|
Warn if parentheses are omitted in certain contexts, such
|
|
as when there is an assignment in a context where a truth value
|
|
is expected, or when operators are nested whose precedence people
|
|
often get confused about.
|
|
|
|
Also warn about constructions where there may be confusion to which
|
|
@code{if} statement an @code{else} branch belongs. Here is an example of
|
|
such a case:
|
|
|
|
@smallexample
|
|
@{
|
|
if (a)
|
|
if (b)
|
|
foo ();
|
|
else
|
|
bar ();
|
|
@}
|
|
@end smallexample
|
|
|
|
In C, every @code{else} branch belongs to the innermost possible @code{if}
|
|
statement, which in this example is @code{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, GNU C will issue a warning when this flag is specified.
|
|
To eliminate the warning, add explicit braces around the innermost
|
|
@code{if} statement so there is no way the @code{else} could belong to
|
|
the enclosing @code{if}. The resulting code would look like this:
|
|
|
|
@smallexample
|
|
@{
|
|
if (a)
|
|
@{
|
|
if (b)
|
|
foo ();
|
|
else
|
|
bar ();
|
|
@}
|
|
@}
|
|
@end smallexample
|
|
|
|
@item -Wreturn-type
|
|
Warn whenever a function is defined with a return-type that defaults
|
|
to @code{int}. Also warn about any @code{return} statement with no
|
|
return-value in a function whose return-type is not @code{void}.
|
|
|
|
@item -Wswitch
|
|
Warn whenever a @code{switch} statement has an index of enumeral type
|
|
and lacks a @code{case} for one or more of the named codes of that
|
|
enumeration. (The presence of a @code{default} label prevents this
|
|
warning.) @code{case} labels outside the enumeration range also
|
|
provoke warnings when this option is used.
|
|
|
|
@item -Wtrigraphs
|
|
Warn if any trigraphs are encountered (assuming they are enabled).
|
|
|
|
@item -Wunused
|
|
Warn whenever a variable is unused aside from its declaration,
|
|
whenever a function is declared static but never defined, whenever a
|
|
label is declared but not used, and whenever a statement computes a
|
|
result that is explicitly not used.
|
|
|
|
In order to get a warning about an unused function parameter, you must
|
|
specify both @samp{-W} and @samp{-Wunused}.
|
|
|
|
To suppress this warning for an expression, simply cast it to void. For
|
|
unused variables and parameters, use the @samp{unused} attribute
|
|
(@pxref{Variable Attributes}).
|
|
|
|
@item -Wuninitialized
|
|
An automatic variable is used without first being initialized.
|
|
|
|
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 @samp{-O}, you simply won't
|
|
get these warnings.
|
|
|
|
These warnings occur only for variables that are candidates for
|
|
register allocation. Therefore, they do not occur for a variable that
|
|
is declared @code{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 GNU CC 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:
|
|
|
|
@smallexample
|
|
@{
|
|
int x;
|
|
switch (y)
|
|
@{
|
|
case 1: x = 1;
|
|
break;
|
|
case 2: x = 4;
|
|
break;
|
|
case 3: x = 5;
|
|
@}
|
|
foo (x);
|
|
@}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
If the value of @code{y} is always 1, 2 or 3, then @code{x} is
|
|
always initialized, but GNU CC doesn't know this. Here is
|
|
another common case:
|
|
|
|
@smallexample
|
|
@{
|
|
int save_y;
|
|
if (change_y) save_y = y, y = new_y;
|
|
@dots{}
|
|
if (change_y) y = save_y;
|
|
@}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
This has no bug because @code{save_y} is used only if it is set.
|
|
|
|
Some spurious warnings can be avoided if you declare all the functions
|
|
you use that never return as @code{noreturn}. @xref{Function
|
|
Attributes}.
|
|
|
|
@item -Wreorder (C++ only)
|
|
@cindex reordering, warning
|
|
@cindex warning for reordering of member initializers
|
|
Warn when the order of member initializers given in the code does not
|
|
match the order in which they must be executed. For instance:
|
|
|
|
@smallexample
|
|
struct A @{
|
|
int i;
|
|
int j;
|
|
A(): j (0), i (1) @{ @}
|
|
@};
|
|
@end smallexample
|
|
|
|
Here the compiler will warn that the member initializers for @samp{i}
|
|
and @samp{j} will be rearranged to match the declaration order of the
|
|
members.
|
|
|
|
@item -Wtemplate-debugging
|
|
@cindex template debugging
|
|
When using templates in a C++ program, warn if debugging is not yet
|
|
fully available (C++ only).
|
|
|
|
@item -Wunknown-pragmas
|
|
@cindex warning for unknown pragmas
|
|
@cindex unknown pragmas, warning
|
|
@cindex pragmas, warning of unknown
|
|
Warn when a #pragma directive is encountered which is not understood by
|
|
GCC. If this command line option is used, warnings will even be issued
|
|
for unknown pragmas in system header files. This is not the case if
|
|
the warnings were only enabled by the @samp{-Wall} command line option.
|
|
|
|
@item -Wall
|
|
All of the above @samp{-W} options combined. This enables all the
|
|
warnings about constructions that some users consider questionable, and
|
|
that are easy to avoid (or modify to prevent the warning), even in
|
|
conjunction with macros.
|
|
@end table
|
|
|
|
The following @samp{-W@dots{}} options are not implied by @samp{-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.
|
|
|
|
@table @code
|
|
@item -W
|
|
Print extra warning messages for these events:
|
|
|
|
@itemize @bullet
|
|
@cindex @code{longjmp} warnings
|
|
@item
|
|
A nonvolatile automatic variable might be changed by a call to
|
|
@code{longjmp}. These warnings as well are possible only in
|
|
optimizing compilation.
|
|
|
|
The compiler sees only the calls to @code{setjmp}. It cannot know
|
|
where @code{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 @code{longjmp} cannot
|
|
in fact be called at the place which would cause a problem.
|
|
|
|
@item
|
|
A function can return either with or without a value. (Falling
|
|
off the end of the function body is considered returning without
|
|
a value.) For example, this function would evoke such a
|
|
warning:
|
|
|
|
@smallexample
|
|
@group
|
|
foo (a)
|
|
@{
|
|
if (a > 0)
|
|
return a;
|
|
@}
|
|
@end group
|
|
@end smallexample
|
|
|
|
@item
|
|
An expression-statement or the left-hand side of a comma expression
|
|
contains no side effects.
|
|
To suppress the warning, cast the unused expression to void.
|
|
For example, an expression such as @samp{x[i,j]} will cause a warning,
|
|
but @samp{x[(void)i,j]} will not.
|
|
|
|
@item
|
|
An unsigned value is compared against zero with @samp{<} or @samp{<=}.
|
|
|
|
@item
|
|
A comparison like @samp{x<=y<=z} appears; this is equivalent to
|
|
@samp{(x<=y ? 1 : 0) <= z}, which is a different interpretation from
|
|
that of ordinary mathematical notation.
|
|
|
|
@item
|
|
Storage-class specifiers like @code{static} are not the first things in
|
|
a declaration. According to the C Standard, this usage is obsolescent.
|
|
|
|
@item
|
|
If @samp{-Wall} or @samp{-Wunused} is also specified, warn about unused
|
|
arguments.
|
|
|
|
@item
|
|
A comparison between signed and unsigned values could produce an
|
|
incorrect result when the signed value is converted to unsigned.
|
|
(But don't warn if @samp{-Wno-sign-compare} is also specified.)
|
|
|
|
@item
|
|
An aggregate has a partly bracketed initializer.
|
|
For example, the following code would evoke such a warning,
|
|
because braces are missing around the initializer for @code{x.h}:
|
|
|
|
@smallexample
|
|
struct s @{ int f, g; @};
|
|
struct t @{ struct s h; int i; @};
|
|
struct t x = @{ 1, 2, 3 @};
|
|
@end smallexample
|
|
|
|
@item
|
|
An aggregate has an initializer which does not initialize all members.
|
|
For example, the following code would cause such a warning, because
|
|
@code{x.h} would be implicitly initialized to zero:
|
|
|
|
@smallexample
|
|
struct s @{ int f, g, h; @};
|
|
struct s x = @{ 3, 4 @};
|
|
@end smallexample
|
|
@end itemize
|
|
|
|
@item -Wtraditional
|
|
Warn about certain constructs that behave differently in traditional and
|
|
ANSI C.
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Macro arguments occurring within string constants in the macro body.
|
|
These would substitute the argument in traditional C, but are part of
|
|
the constant in ANSI C.
|
|
|
|
@item
|
|
A function declared external in one block and then used after the end of
|
|
the block.
|
|
|
|
@item
|
|
A @code{switch} statement has an operand of type @code{long}.
|
|
@end itemize
|
|
|
|
@item -Wundef
|
|
Warn if an undefined identifier is evaluated in an @samp{#if} directive.
|
|
|
|
@item -Wshadow
|
|
Warn whenever a local variable shadows another local variable.
|
|
|
|
@item -Wid-clash-@var{len}
|
|
Warn whenever two distinct identifiers match in the first @var{len}
|
|
characters. This may help you prepare a program that will compile
|
|
with certain obsolete, brain-damaged compilers.
|
|
|
|
@item -Wlarger-than-@var{len}
|
|
Warn whenever an object of larger than @var{len} bytes is defined.
|
|
|
|
@item -Wpointer-arith
|
|
Warn about anything that depends on the ``size of'' a function type or
|
|
of @code{void}. GNU C assigns these types a size of 1, for
|
|
convenience in calculations with @code{void *} pointers and pointers
|
|
to functions.
|
|
|
|
@item -Wbad-function-cast
|
|
Warn whenever a function call is cast to a non-matching type.
|
|
For example, warn if @code{int malloc()} is cast to @code{anything *}.
|
|
|
|
@item -Wcast-qual
|
|
Warn whenever a pointer is cast so as to remove a type qualifier from
|
|
the target type. For example, warn if a @code{const char *} is cast
|
|
to an ordinary @code{char *}.
|
|
|
|
@item -Wcast-align
|
|
Warn whenever a pointer is cast such that the required alignment of the
|
|
target is increased. For example, warn if a @code{char *} is cast to
|
|
an @code{int *} on machines where integers can only be accessed at
|
|
two- or four-byte boundaries.
|
|
|
|
@item -Wwrite-strings
|
|
Give string constants the type @code{const char[@var{length}]} so that
|
|
copying the address of one into a non-@code{const} @code{char *}
|
|
pointer will get a warning. 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 @code{const} in
|
|
declarations and prototypes. Otherwise, it will just be a nuisance;
|
|
this is why we did not make @samp{-Wall} request these warnings.
|
|
|
|
@item -Wconversion
|
|
Warn if a prototype causes a type conversion that is different from what
|
|
would happen to the same argument in the absence of a prototype. This
|
|
includes conversions of fixed point to floating and vice versa, and
|
|
conversions changing the width or signedness of a fixed point argument
|
|
except when the same as the default promotion.
|
|
|
|
Also, warn if a negative integer constant expression is implicitly
|
|
converted to an unsigned type. For example, warn about the assignment
|
|
@code{x = -1} if @code{x} is unsigned. But do not warn about explicit
|
|
casts like @code{(unsigned) -1}.
|
|
|
|
@item -Wsign-compare
|
|
@cindex warning for comparison of signed and unsigned values
|
|
@cindex comparison of signed and unsigned values, warning
|
|
@cindex signed and unsigned values, comparison warning
|
|
Warn when a comparison between signed and unsigned values could produce
|
|
an incorrect result when the signed value is converted to unsigned.
|
|
This warning is also enabled by @samp{-W}; to get the other warnings
|
|
of @samp{-W} without this warning, use @samp{-W -Wno-sign-compare}.
|
|
|
|
@item -Waggregate-return
|
|
Warn if any functions that return structures or unions are defined or
|
|
called. (In languages where you can return an array, this also elicits
|
|
a warning.)
|
|
|
|
@item -Wstrict-prototypes
|
|
Warn if a function is declared or defined without specifying the
|
|
argument types. (An old-style function definition is permitted without
|
|
a warning if preceded by a declaration which specifies the argument
|
|
types.)
|
|
|
|
@item -Wmissing-prototypes
|
|
Warn if a global function is defined without a previous prototype
|
|
declaration. This warning is issued even if the definition itself
|
|
provides a prototype. The aim is to detect global functions that fail
|
|
to be declared in header files.
|
|
|
|
@item -Wmissing-declarations
|
|
Warn if a global function is defined without a previous declaration.
|
|
Do so even if the definition itself provides a prototype.
|
|
Use this option to detect global functions that are not declared in
|
|
header files.
|
|
|
|
@item -Wredundant-decls
|
|
Warn if anything is declared more than once in the same scope, even in
|
|
cases where multiple declaration is valid and changes nothing.
|
|
|
|
@item -Wnested-externs
|
|
Warn if an @code{extern} declaration is encountered within an function.
|
|
|
|
@item -Winline
|
|
Warn if a function can not be inlined, and either it was declared as inline,
|
|
or else the @samp{-finline-functions} option was given.
|
|
|
|
@item -Wold-style-cast
|
|
Warn if an old-style (C-style) cast is used within a program.
|
|
|
|
@item -Woverloaded-virtual
|
|
@cindex overloaded virtual fn, warning
|
|
@cindex warning for overloaded virtual fn
|
|
Warn when a derived class function declaration may be an error in
|
|
defining a virtual function (C++ only). In a derived class, the
|
|
definitions of virtual functions must match the type signature of a
|
|
virtual function declared in the base class. With this option, the
|
|
compiler warns when you define a function with the same name as a
|
|
virtual function, but with a type signature that does not match any
|
|
declarations from the base class.
|
|
|
|
@item -Wsynth (C++ only)
|
|
@cindex warning for synthesized methods
|
|
@cindex synthesized methods, warning
|
|
Warn when g++'s synthesis behavior does not match that of cfront. For
|
|
instance:
|
|
|
|
@smallexample
|
|
struct A @{
|
|
operator int ();
|
|
A& operator = (int);
|
|
@};
|
|
|
|
main ()
|
|
@{
|
|
A a,b;
|
|
a = b;
|
|
@}
|
|
@end smallexample
|
|
|
|
In this example, g++ will synthesize a default @samp{A& operator =
|
|
(const A&);}, while cfront will use the user-defined @samp{operator =}.
|
|
|
|
@item -Wlong-long
|
|
Warn if @samp{long long} type is used. This is default. To inhibit
|
|
the warning messages, use @samp{-Wno-long-long}. Flags
|
|
@samp{-Wlong-long} and @samp{-Wno-long-long} are taken into account
|
|
only when @samp{-pedantic} flag is used.
|
|
|
|
@item -Werror
|
|
Make all warnings into errors.
|
|
@end table
|
|
|
|
@node Debugging Options
|
|
@section Options for Debugging Your Program or GNU CC
|
|
@cindex options, debugging
|
|
@cindex debugging information options
|
|
|
|
GNU CC has various special options that are used for debugging
|
|
either your program or GCC:
|
|
|
|
@table @code
|
|
@item -g
|
|
Produce debugging information in the operating system's native format
|
|
(stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging
|
|
information.
|
|
|
|
On most systems that use stabs format, @samp{-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 @samp{-gstabs+}, @samp{-gstabs},
|
|
@samp{-gxcoff+}, @samp{-gxcoff}, @samp{-gdwarf-1+}, or @samp{-gdwarf-1}
|
|
(see below).
|
|
|
|
Unlike most other C compilers, GNU CC allows you to use @samp{-g} with
|
|
@samp{-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 GNU CC is generated with the
|
|
capability for more than one debugging format.
|
|
|
|
@item -ggdb
|
|
Produce debugging information for use by GDB. This means to use the
|
|
most expressive format available (DWARF 2, stabs, or the native format
|
|
if neither of those are supported), including GDB extensions if at all
|
|
possible.
|
|
|
|
@item -gstabs
|
|
Produce debugging information in stabs format (if that is supported),
|
|
without GDB extensions. This is the format used by DBX on most BSD
|
|
systems. On MIPS, Alpha and System V Release 4 systems this option
|
|
produces stabs debugging output which is not understood by DBX or SDB.
|
|
On System V Release 4 systems this option requires the GNU assembler.
|
|
|
|
@item -gstabs+
|
|
Produce debugging information in stabs format (if that is supported),
|
|
using GNU extensions understood only by the GNU debugger (GDB). The
|
|
use of these extensions is likely to make other debuggers crash or
|
|
refuse to read the program.
|
|
|
|
@item -gcoff
|
|
Produce debugging information in COFF format (if that is supported).
|
|
This is the format used by SDB on most System V systems prior to
|
|
System V Release 4.
|
|
|
|
@item -gxcoff
|
|
Produce debugging information in XCOFF format (if that is supported).
|
|
This is the format used by the DBX debugger on IBM RS/6000 systems.
|
|
|
|
@item -gxcoff+
|
|
Produce debugging information in XCOFF format (if that is supported),
|
|
using GNU extensions understood only by the GNU debugger (GDB). The
|
|
use of these extensions is likely to make other debuggers crash or
|
|
refuse to read the program, and may cause assemblers other than the GNU
|
|
assembler (GAS) to fail with an error.
|
|
|
|
@item -gdwarf
|
|
Produce debugging information in DWARF version 1 format (if that is
|
|
supported). This is the format used by SDB on most System V Release 4
|
|
systems.
|
|
|
|
@item -gdwarf+
|
|
Produce debugging information in DWARF version 1 format (if that is
|
|
supported), using GNU extensions understood only by the GNU debugger
|
|
(GDB). The use of these extensions is likely to make other debuggers
|
|
crash or refuse to read the program.
|
|
|
|
@item -gdwarf-2
|
|
Produce debugging information in DWARF version 2 format (if that is
|
|
supported). This is the format used by DBX on IRIX 6.
|
|
|
|
@item -g@var{level}
|
|
@itemx -ggdb@var{level}
|
|
@itemx -gstabs@var{level}
|
|
@itemx -gcoff@var{level}
|
|
@itemx -gxcoff@var{level}
|
|
@itemx -gdwarf@var{level}
|
|
@itemx -gdwarf-2@var{level}
|
|
Request debugging information and also use @var{level} to specify how
|
|
much information. The default level is 2.
|
|
|
|
Level 1 produces minimal information, enough for making backtraces in
|
|
parts of the program that you don't plan to debug. This includes
|
|
descriptions of functions and external variables, but no information
|
|
about local variables and no line numbers.
|
|
|
|
Level 3 includes extra information, such as all the macro definitions
|
|
present in the program. Some debuggers support macro expansion when
|
|
you use @samp{-g3}.
|
|
|
|
@cindex @code{prof}
|
|
@item -p
|
|
Generate extra code to write profile information suitable for the
|
|
analysis program @code{prof}. You must use this option when compiling
|
|
the source files you want data about, and you must also use it when
|
|
linking.
|
|
|
|
@cindex @code{gprof}
|
|
@item -pg
|
|
Generate extra code to write profile information suitable for the
|
|
analysis program @code{gprof}. You must use this option when compiling
|
|
the source files you want data about, and you must also use it when
|
|
linking.
|
|
|
|
@cindex @code{tcov}
|
|
@item -a
|
|
Generate extra code to write profile information for basic blocks, which will
|
|
record the number of times each basic block is executed, the basic block start
|
|
address, and the function name containing the basic block. If @samp{-g} is
|
|
used, the line number and filename of the start of the basic block will also be
|
|
recorded. If not overridden by the machine description, the default action is
|
|
to append to the text file @file{bb.out}.
|
|
|
|
This data could be analyzed by a program like @code{tcov}. Note,
|
|
however, that the format of the data is not what @code{tcov} expects.
|
|
Eventually GNU @code{gprof} should be extended to process this data.
|
|
|
|
@item -Q
|
|
Makes the compiler print out each function name as it is compiled, and
|
|
print some statistics about each pass when it finishes.
|
|
|
|
@item -ax
|
|
Generate extra code to profile basic blocks. Your executable will
|
|
produce output that is a superset of that produced when @samp{-a} is
|
|
used. Additional output is the source and target address of the basic
|
|
blocks where a jump takes place, the number of times a jump is executed,
|
|
and (optionally) the complete sequence of basic blocks being executed.
|
|
The output is appended to file @file{bb.out}.
|
|
|
|
You can examine different profiling aspects without recompilation. Your
|
|
executable will read a list of function names from file @file{bb.in}.
|
|
Profiling starts when a function on the list is entered and stops when
|
|
that invocation is exited. To exclude a function from profiling, prefix
|
|
its name with `-'. If a function name is not unique, you can
|
|
disambiguate it by writing it in the form
|
|
@samp{/path/filename.d:functionname}. Your executable will write the
|
|
available paths and filenames in file @file{bb.out}.
|
|
|
|
Several function names have a special meaning:
|
|
@table @code
|
|
@item __bb_jumps__
|
|
Write source, target and frequency of jumps to file @file{bb.out}.
|
|
@item __bb_hidecall__
|
|
Exclude function calls from frequency count.
|
|
@item __bb_showret__
|
|
Include function returns in frequency count.
|
|
@item __bb_trace__
|
|
Write the sequence of basic blocks executed to file @file{bbtrace.gz}.
|
|
The file will be compressed using the program @samp{gzip}, which must
|
|
exist in your @code{PATH}. On systems without the @samp{popen}
|
|
function, the file will be named @file{bbtrace} and will not be
|
|
compressed. @strong{Profiling for even a few seconds on these systems
|
|
will produce a very large file.} Note: @code{__bb_hidecall__} and
|
|
@code{__bb_showret__} will not affect the sequence written to
|
|
@file{bbtrace.gz}.
|
|
@end table
|
|
|
|
Here's a short example using different profiling parameters
|
|
in file @file{bb.in}. Assume function @code{foo} consists of basic blocks
|
|
1 and 2 and is called twice from block 3 of function @code{main}. After
|
|
the calls, block 3 transfers control to block 4 of @code{main}.
|
|
|
|
With @code{__bb_trace__} and @code{main} contained in file @file{bb.in},
|
|
the following sequence of blocks is written to file @file{bbtrace.gz}:
|
|
0 3 1 2 1 2 4. The return from block 2 to block 3 is not shown, because
|
|
the return is to a point inside the block and not to the top. The
|
|
block address 0 always indicates, that control is transferred
|
|
to the trace from somewhere outside the observed functions. With
|
|
@samp{-foo} added to @file{bb.in}, the blocks of function
|
|
@code{foo} are removed from the trace, so only 0 3 4 remains.
|
|
|
|
With @code{__bb_jumps__} and @code{main} contained in file @file{bb.in},
|
|
jump frequencies will be written to file @file{bb.out}. The
|
|
frequencies are obtained by constructing a trace of blocks
|
|
and incrementing a counter for every neighbouring pair of blocks
|
|
in the trace. The trace 0 3 1 2 1 2 4 displays the following
|
|
frequencies:
|
|
|
|
@example
|
|
Jump from block 0x0 to block 0x3 executed 1 time(s)
|
|
Jump from block 0x3 to block 0x1 executed 1 time(s)
|
|
Jump from block 0x1 to block 0x2 executed 2 time(s)
|
|
Jump from block 0x2 to block 0x1 executed 1 time(s)
|
|
Jump from block 0x2 to block 0x4 executed 1 time(s)
|
|
@end example
|
|
|
|
With @code{__bb_hidecall__}, control transfer due to call instructions
|
|
is removed from the trace, that is the trace is cut into three parts: 0
|
|
3 4, 0 1 2 and 0 1 2. With @code{__bb_showret__}, control transfer due
|
|
to return instructions is added to the trace. The trace becomes: 0 3 1
|
|
2 3 1 2 3 4. Note, that this trace is not the same, as the sequence
|
|
written to @file{bbtrace.gz}. It is solely used for counting jump
|
|
frequencies.
|
|
|
|
@item -fprofile-arcs
|
|
Instrument @dfn{arcs} during compilation. For each function of your
|
|
program, GNU CC 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.
|
|
|
|
Since not every arc in the program must be instrumented, programs
|
|
compiled with this option run faster than programs compiled with
|
|
@samp{-a}, which adds instrumentation code to every basic block in the
|
|
program. The tradeoff: since @code{gcov} does not have
|
|
execution counts for all branches, it must start with the execution
|
|
counts for the instrumented branches, and then iterate over the program
|
|
flow graph until the entire graph has been solved. Hence, @code{gcov}
|
|
runs a little more slowly than a program which uses information from
|
|
@samp{-a}.
|
|
|
|
@samp{-fprofile-arcs} also makes it possible to estimate branch
|
|
probabilities, and to calculate basic block execution counts. In
|
|
general, basic block execution counts do not give enough information to
|
|
estimate all branch probabilities. When the compiled program exits, it
|
|
saves the arc execution counts to a file called
|
|
@file{@var{sourcename}.da}. Use the compiler option
|
|
@samp{-fbranch-probabilities} (@pxref{Optimize Options,,Options that
|
|
Control Optimization}) when recompiling, to optimize using estimated
|
|
branch probabilities.
|
|
|
|
@need 2000
|
|
@item -ftest-coverage
|
|
Create data files for the @code{gcov} code-coverage utility
|
|
(@pxref{Gcov,, @code{gcov}: a GNU CC Test Coverage Program}).
|
|
The data file names begin with the name of your source file:
|
|
|
|
@table @code
|
|
@item @var{sourcename}.bb
|
|
A mapping from basic blocks to line numbers, which @code{gcov} uses to
|
|
associate basic block execution counts with line numbers.
|
|
|
|
@item @var{sourcename}.bbg
|
|
A list of all arcs in the program flow graph. This allows @code{gcov}
|
|
to reconstruct the program flow graph, so that it can compute all basic
|
|
block and arc execution counts from the information in the
|
|
@code{@var{sourcename}.da} file (this last file is the output from
|
|
@samp{-fprofile-arcs}).
|
|
@end table
|
|
|
|
@item -Q
|
|
Makes the compiler print out each function name as it is compiled, and
|
|
print some statistics about each pass when it finishes.
|
|
|
|
@item -d@var{letters}
|
|
Says to make debugging dumps during compilation at times specified by
|
|
@var{letters}. This is used for debugging the compiler. The file names
|
|
for most of the dumps are made by appending a word to the source file
|
|
name (e.g. @file{foo.c.rtl} or @file{foo.c.jump}). Here are the
|
|
possible letters for use in @var{letters}, and their meanings:
|
|
|
|
@table @samp
|
|
@item b
|
|
Dump after computing branch probabilities, to @file{@var{file}.bp}.
|
|
@item c
|
|
Dump after instruction combination, to the file @file{@var{file}.combine}.
|
|
@item d
|
|
Dump after delayed branch scheduling, to @file{@var{file}.dbr}.
|
|
@item D
|
|
Dump all macro definitions, at the end of preprocessing, in addition to
|
|
normal output.
|
|
@item y
|
|
Dump debugging information during parsing, to standard error.
|
|
@item r
|
|
Dump after RTL generation, to @file{@var{file}.rtl}.
|
|
@item x
|
|
Just generate RTL for a function instead of compiling it. Usually used
|
|
with @samp{r}.
|
|
@item j
|
|
Dump after first jump optimization, to @file{@var{file}.jump}.
|
|
@item s
|
|
Dump after CSE (including the jump optimization that sometimes
|
|
follows CSE), to @file{@var{file}.cse}.
|
|
@item F
|
|
Dump after purging ADDRESSOF, to @file{@var{file}.addressof}.
|
|
@item f
|
|
Dump after flow analysis, to @file{@var{file}.flow}.
|
|
@item g
|
|
Dump after global register allocation, to @file{@var{file}.greg}.
|
|
@item G
|
|
Dump after GCSE, to @file{@var{file}.gcse}.
|
|
@item j
|
|
Dump after first jump optimization, to @file{@var{file}.jump}.
|
|
@item J
|
|
Dump after last jump optimization, to @file{@var{file}.jump2}.
|
|
@item k
|
|
Dump after conversion from registers to stack, to @file{@var{file}.stack}.
|
|
@item l
|
|
Dump after local register allocation, to @file{@var{file}.lreg}.
|
|
@item L
|
|
Dump after loop optimization, to @file{@var{file}.loop}.
|
|
@item M
|
|
Dump after performing the machine dependent reorganisation pass, to
|
|
@file{@var{file}.mach}.
|
|
@item N
|
|
Dump after the register move pass, to @file{@var{file}.regmove}.
|
|
@item r
|
|
Dump after RTL generation, to @file{@var{file}.rtl}.
|
|
@item R
|
|
Dump after the second instruction scheduling pass, to @file{@var{file}.sched2}.
|
|
@item s
|
|
Dump after CSE (including the jump optimization that sometimes follows
|
|
CSE), to @file{@var{file}.cse}.
|
|
@item S
|
|
Dump after the first instruction scheduling pass, to @file{@var{file}.sched}.
|
|
@item t
|
|
Dump after the second CSE pass (including the jump optimization that
|
|
sometimes follows CSE), to @file{@var{file}.cse2}.
|
|
@item x
|
|
Just generate RTL for a function instead of compiling it. Usually used
|
|
with @samp{r}.
|
|
@item a
|
|
Produce all the dumps listed above.
|
|
@item m
|
|
Print statistics on memory usage, at the end of the run, to
|
|
standard error.
|
|
@item p
|
|
Annotate the assembler output with a comment indicating which
|
|
pattern and alternative was used.
|
|
@item y
|
|
Dump debugging information during parsing, to standard error.
|
|
@item A
|
|
Annotate the assembler output with miscellaneous debugging information.
|
|
@end table
|
|
|
|
@item -fpretend-float
|
|
When running a cross-compiler, pretend that the target machine uses the
|
|
same floating point format as the host machine. This causes incorrect
|
|
output of the actual floating constants, but the actual instruction
|
|
sequence will probably be the same as GNU CC would make when running on
|
|
the target machine.
|
|
|
|
@item -save-temps
|
|
Store the usual ``temporary'' intermediate files permanently; place them
|
|
in the current directory and name them based on the source file. Thus,
|
|
compiling @file{foo.c} with @samp{-c -save-temps} would produce files
|
|
@file{foo.i} and @file{foo.s}, as well as @file{foo.o}.
|
|
|
|
@item -print-file-name=@var{library}
|
|
Print the full absolute name of the library file @var{library} that
|
|
would be used when linking---and don't do anything else. With this
|
|
option, GNU CC does not compile or link anything; it just prints the
|
|
file name.
|
|
|
|
@item -print-prog-name=@var{program}
|
|
Like @samp{-print-file-name}, but searches for a program such as @samp{cpp}.
|
|
|
|
@item -print-libgcc-file-name
|
|
Same as @samp{-print-file-name=libgcc.a}.
|
|
|
|
This is useful when you use @samp{-nostdlib} or @samp{-nodefaultlibs}
|
|
but you do want to link with @file{libgcc.a}. You can do
|
|
|
|
@example
|
|
gcc -nostdlib @var{files}@dots{} `gcc -print-libgcc-file-name`
|
|
@end example
|
|
|
|
@item -print-search-dirs
|
|
Print the name of the configured installation directory and a list of
|
|
program and library directories gcc will search---and don't do anything else.
|
|
|
|
This is useful when gcc prints the error message
|
|
@samp{installation problem, cannot exec cpp: No such file or directory}.
|
|
To resolve this you either need to put @file{cpp} and the other compiler
|
|
components where gcc expects to find them, or you can set the environment
|
|
variable @code{GCC_EXEC_PREFIX} to the directory where you installed them.
|
|
Don't forget the trailing '/'.
|
|
@xref{Environment Variables}.
|
|
@end table
|
|
|
|
@node Optimize Options
|
|
@section Options That Control Optimization
|
|
@cindex optimize options
|
|
@cindex options, optimization
|
|
|
|
These options control various sorts of optimizations:
|
|
|
|
@table @code
|
|
@item -O
|
|
@itemx -O1
|
|
Optimize. Optimizing compilation takes somewhat more time, and a lot
|
|
more memory for a large function.
|
|
|
|
Without @samp{-O}, 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.
|
|
|
|
Without @samp{-O}, the compiler only allocates variables declared
|
|
@code{register} in registers. The resulting compiled code is a little
|
|
worse than produced by PCC without @samp{-O}.
|
|
|
|
With @samp{-O}, the compiler tries to reduce code size and execution
|
|
time.
|
|
|
|
When you specify @samp{-O}, the compiler turns on @samp{-fthread-jumps}
|
|
and @samp{-fdefer-pop} on all machines. The compiler turns on
|
|
@samp{-fdelayed-branch} on machines that have delay slots, and
|
|
@samp{-fomit-frame-pointer} on machines that can support debugging even
|
|
without a frame pointer. On some machines the compiler also turns
|
|
on other flags.@refill
|
|
|
|
@item -O2
|
|
Optimize even more. GNU CC performs nearly all supported optimizations
|
|
that do not involve a space-speed tradeoff. The compiler does not
|
|
perform loop unrolling or function inlining when you specify @samp{-O2}.
|
|
As compared to @samp{-O}, this option increases both compilation time
|
|
and the performance of the generated code.
|
|
|
|
@samp{-O2} turns on all optional optimizations except for loop unrolling
|
|
and function inlining. It also turns on the @samp{-fforce-mem} option
|
|
on all machines and frame pointer elimination on machines where doing so
|
|
does not interfere with debugging.
|
|
|
|
@item -O3
|
|
Optimize yet more. @samp{-O3} turns on all optimizations specified by
|
|
@samp{-O2} and also turns on the @samp{inline-functions} option.
|
|
|
|
@item -O0
|
|
Do not optimize.
|
|
|
|
@item -Os
|
|
Optimize for size. @samp{-Os} enables all @samp{-O2} optimizations that
|
|
do not typically increase code size. It also performs further
|
|
optimizations designed to reduce code size.
|
|
|
|
If you use multiple @samp{-O} options, with or without level numbers,
|
|
the last such option is the one that is effective.
|
|
@end table
|
|
|
|
Options of the form @samp{-f@var{flag}} specify machine-independent
|
|
flags. Most flags have both positive and negative forms; the negative
|
|
form of @samp{-ffoo} would be @samp{-fno-foo}. In the table below,
|
|
only one of the forms is listed---the one which is not the default.
|
|
You can figure out the other form by either removing @samp{no-} or
|
|
adding it.
|
|
|
|
@table @code
|
|
@item -ffloat-store
|
|
Do not store floating point variables in registers, and inhibit other
|
|
options that might change whether a floating point value is taken from a
|
|
register or memory.
|
|
|
|
@cindex floating point precision
|
|
This option prevents undesirable excess precision on machines such as
|
|
the 68000 where the floating registers (of the 68881) keep more
|
|
precision than a @code{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 @samp{-ffloat-store} for such programs.
|
|
|
|
@item -fno-default-inline
|
|
Do not make member functions inline by default merely because they are
|
|
defined inside the class scope (C++ only). Otherwise, when you specify
|
|
@w{@samp{-O}}, member functions defined inside class scope are compiled
|
|
inline by default; i.e., you don't need to add @samp{inline} in front of
|
|
the member function name.
|
|
|
|
@item -fno-defer-pop
|
|
Always pop the arguments to each function call as soon as that function
|
|
returns. For machines which must pop arguments after a function call,
|
|
the compiler normally lets arguments accumulate on the stack for several
|
|
function calls and pops them all at once.
|
|
|
|
@item -fforce-mem
|
|
Force memory operands to be copied into registers before doing
|
|
arithmetic on them. This produces better code by making all memory
|
|
references potential common subexpressions. When they are not common
|
|
subexpressions, instruction combination should eliminate the separate
|
|
register-load. The @samp{-O2} option turns on this option.
|
|
|
|
@item -fforce-addr
|
|
Force memory address constants to be copied into registers before
|
|
doing arithmetic on them. This may produce better code just as
|
|
@samp{-fforce-mem} may.
|
|
|
|
@item -fomit-frame-pointer
|
|
Don't keep the frame pointer in a register for functions that
|
|
don't need one. This avoids the instructions to save, set up and
|
|
restore frame pointers; it also makes an extra register available
|
|
in many functions. @strong{It also makes debugging impossible on
|
|
some machines.}
|
|
|
|
@ifset INTERNALS
|
|
On some machines, such as the Vax, this flag has no effect, because
|
|
the standard calling sequence automatically handles the frame pointer
|
|
and nothing is saved by pretending it doesn't exist. The
|
|
machine-description macro @code{FRAME_POINTER_REQUIRED} controls
|
|
whether a target machine supports this flag. @xref{Registers}.@refill
|
|
@end ifset
|
|
@ifclear INTERNALS
|
|
On some machines, such as the Vax, this flag has no effect, because
|
|
the standard calling sequence automatically handles the frame pointer
|
|
and nothing is saved by pretending it doesn't exist. The
|
|
machine-description macro @code{FRAME_POINTER_REQUIRED} controls
|
|
whether a target machine supports this flag. @xref{Registers,,Register
|
|
Usage, gcc.info, Using and Porting GCC}.@refill
|
|
@end ifclear
|
|
|
|
@item -fno-inline
|
|
Don't pay attention to the @code{inline} keyword. Normally this option
|
|
is used to keep the compiler from expanding any functions inline.
|
|
Note that if you are not optimizing, no functions can be expanded inline.
|
|
|
|
@item -finline-functions
|
|
Integrate all simple functions into their callers. The compiler
|
|
heuristically decides which functions are simple enough to be worth
|
|
integrating in this way.
|
|
|
|
If all calls to a given function are integrated, and the function is
|
|
declared @code{static}, then the function is normally not output as
|
|
assembler code in its own right.
|
|
|
|
@item -fkeep-inline-functions
|
|
Even if all calls to a given function are integrated, and the function
|
|
is declared @code{static}, nevertheless output a separate run-time
|
|
callable version of the function. This switch does not affect
|
|
@code{extern inline} functions.
|
|
|
|
@item -fkeep-static-consts
|
|
Emit variables declared @code{static const} when optimization isn't turned
|
|
on, even if the variables aren't referenced.
|
|
|
|
GNU CC 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 @samp{-fno-keep-static-consts} option.
|
|
|
|
@item -fno-function-cse
|
|
Do not put function addresses in registers; make each instruction that
|
|
calls a constant function contain the function's address explicitly.
|
|
|
|
This option results in less efficient code, but some strange hacks
|
|
that alter the assembler output may be confused by the optimizations
|
|
performed when this option is not used.
|
|
|
|
@item -ffast-math
|
|
This option allows GCC to violate some ANSI or IEEE rules and/or
|
|
specifications in the interest of optimizing code for speed. For
|
|
example, it allows the compiler to assume arguments to the @code{sqrt}
|
|
function are non-negative numbers and that no floating-point values
|
|
are NaNs.
|
|
|
|
This option should never be turned on by any @samp{-O} option since
|
|
it can result in incorrect output for programs which depend on
|
|
an exact implementation of IEEE or ANSI rules/specifications for
|
|
math functions.
|
|
@end table
|
|
|
|
@c following causes underfulls.. they don't look great, but we deal.
|
|
@c --mew 26jan93
|
|
The following options control specific optimizations. The @samp{-O2}
|
|
option turns on all of these optimizations except @samp{-funroll-loops}
|
|
and @samp{-funroll-all-loops}. On most machines, the @samp{-O} option
|
|
turns on the @samp{-fthread-jumps} and @samp{-fdelayed-branch} options,
|
|
but specific machines may handle it differently.
|
|
|
|
You can use the following flags in the rare cases when ``fine-tuning''
|
|
of optimizations to be performed is desired.
|
|
|
|
@table @code
|
|
@item -fstrength-reduce
|
|
Perform the optimizations of loop strength reduction and
|
|
elimination of iteration variables.
|
|
|
|
@item -fthread-jumps
|
|
Perform optimizations where we check to see if a jump branches to a
|
|
location where another comparison subsumed by the first is found. If
|
|
so, the first branch is redirected to either the destination of the
|
|
second branch or a point immediately following it, depending on whether
|
|
the condition is known to be true or false.
|
|
|
|
@item -fcse-follow-jumps
|
|
In common subexpression elimination, scan through jump instructions
|
|
when the target of the jump is not reached by any other path. For
|
|
example, when CSE encounters an @code{if} statement with an
|
|
@code{else} clause, CSE will follow the jump when the condition
|
|
tested is false.
|
|
|
|
@item -fcse-skip-blocks
|
|
This is similar to @samp{-fcse-follow-jumps}, but causes CSE to
|
|
follow jumps which conditionally skip over blocks. When CSE
|
|
encounters a simple @code{if} statement with no else clause,
|
|
@samp{-fcse-skip-blocks} causes CSE to follow the jump around the
|
|
body of the @code{if}.
|
|
|
|
@item -frerun-cse-after-loop
|
|
Re-run common subexpression elimination after loop optimizations has been
|
|
performed.
|
|
|
|
@item -frerun-loop-opt
|
|
Run the loop optimizer twice.
|
|
|
|
@item -fgcse
|
|
Perform a global common subexpression elimination pass.
|
|
This pass also performs global constant and copy propagation.
|
|
|
|
@item -fexpensive-optimizations
|
|
Perform a number of minor optimizations that are relatively expensive.
|
|
|
|
@item -foptimize-register-moves
|
|
@item -fregmove
|
|
Attempt to reassign register numbers in move instructions and as
|
|
operands of other simple instructions in order to maximize the amount of
|
|
register tying. This is especially helpful on machines with two-operand
|
|
instructions. GNU CC enables this optimization by default with @samp{-O2}
|
|
or higher.
|
|
|
|
Note @code{-fregmove} and @code{-foptimize-register-moves} are the same
|
|
optimization.
|
|
|
|
@item -fdelayed-branch
|
|
If supported for the target machine, attempt to reorder instructions
|
|
to exploit instruction slots available after delayed branch
|
|
instructions.
|
|
|
|
@item -fschedule-insns
|
|
If supported for the target machine, attempt to reorder instructions to
|
|
eliminate execution stalls due to required data being unavailable. This
|
|
helps machines that have slow floating point or memory load instructions
|
|
by allowing other instructions to be issued until the result of the load
|
|
or floating point instruction is required.
|
|
|
|
@item -fschedule-insns2
|
|
Similar to @samp{-fschedule-insns}, but requests an additional pass of
|
|
instruction scheduling after register allocation has been done. This is
|
|
especially useful on machines with a relatively small number of
|
|
registers and where memory load instructions take more than one cycle.
|
|
|
|
@item -ffunction-sections
|
|
Place each function into its own section in the output file if the
|
|
target supports arbitrary sections. The function's name determines
|
|
the section's name in the output file.
|
|
|
|
Use this option on systems where the linker can perform optimizations
|
|
to improve locality of reference in the instruction space. HPPA
|
|
processors running HP-UX and Sparc processors running Solaris 2 have
|
|
linkers with such optimizations. Other systems using the ELF object format
|
|
as well as AIX may have these optimizations in the future.
|
|
|
|
Only use this option when there are significant benefits from doing
|
|
so. When you specify this option, the assembler and linker will
|
|
create larger object and executable files and will also be slower.
|
|
You will not be able to use @code{gprof} on all systems if you
|
|
specify this option and you may have problems with debugging if
|
|
you specify both this option and @samp{-g}.
|
|
|
|
@item -fcaller-saves
|
|
Enable values to be allocated in registers that will be clobbered by
|
|
function calls, by emitting extra instructions to save and restore the
|
|
registers around such calls. Such allocation is done only when it
|
|
seems to result in better code than would otherwise be produced.
|
|
|
|
This option is enabled by default on certain machines, usually those
|
|
which have no call-preserved registers to use instead.
|
|
|
|
@item -funroll-loops
|
|
Perform the optimization of loop unrolling. This is only done for loops
|
|
whose number of iterations can be determined at compile time or run time.
|
|
@samp{-funroll-loop} implies both @samp{-fstrength-reduce} and
|
|
@samp{-frerun-cse-after-loop}.
|
|
|
|
@item -funroll-all-loops
|
|
Perform the optimization of loop unrolling. This is done for all loops
|
|
and usually makes programs run more slowly. @samp{-funroll-all-loops}
|
|
implies @samp{-fstrength-reduce} as well as @samp{-frerun-cse-after-loop}.
|
|
|
|
@item -fmove-all-movables
|
|
Forces all invariant computations in loops to be moved
|
|
outside the loop.
|
|
|
|
@item -freduce-all-givs
|
|
Forces all general-induction variables in loops to be
|
|
strength-reduced.
|
|
|
|
@emph{Note:} When compiling programs written in Fortran,
|
|
@samp{-fmove-all-moveables} and @samp{-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 let us (@code{egcs@@egcs.cygnus.com} and @code{fortran@@gnu.org})
|
|
know how use of these options affects
|
|
the performance of your production code.
|
|
We're very interested in code that runs @emph{slower}
|
|
when these options are @emph{enabled}.
|
|
|
|
@item -fno-peephole
|
|
Disable any machine-specific peephole optimizations.
|
|
|
|
@item -fbranch-probabilities
|
|
After running a program compiled with @samp{-fprofile-arcs}
|
|
(@pxref{Debugging Options,, Options for Debugging Your Program or
|
|
@code{gcc}}), you can compile it a second time using
|
|
@samp{-fbranch-probabilities}, to improve optimizations based on
|
|
guessing the path a branch might take.
|
|
|
|
@ifset INTERNALS
|
|
With @samp{-fbranch-probabilities}, GCC puts a @samp{REG_EXEC_COUNT}
|
|
note on the first instruction of each basic block, and a
|
|
@samp{REG_BR_PROB} note on each @samp{JUMP_INSN} and @samp{CALL_INSN}.
|
|
These can be used to improve optimization. Currently, they are only
|
|
used in one place: in @file{reorg.c}, instead of guessing which path a
|
|
branch is mostly to take, the @samp{REG_BR_PROB} values are used to
|
|
exactly determine which path is taken more often.
|
|
@end ifset
|
|
|
|
@item -fstrict-aliasing
|
|
Allows the compiler to assume the strictest aliasing rules applicable to
|
|
the language being compiled. For C (and C++), this activates
|
|
optimizations based on the type of expressions. In particular, an
|
|
object of one type is assumed never to reside at the same address as an
|
|
object of a different type, unless the types are almost the same. For
|
|
example, an @code{unsigned int} can alias an @code{int}, but not a
|
|
@code{void*} or a @code{double}. A character type may alias any other
|
|
type.
|
|
|
|
Pay special attention to code like this:
|
|
@example
|
|
union a_union @{
|
|
int i;
|
|
double d;
|
|
@};
|
|
|
|
int f() @{
|
|
a_union t;
|
|
t.d = 3.0;
|
|
return t.i;
|
|
@}
|
|
@end example
|
|
The practice of reading from a different union member than the one most
|
|
recently written to (called ``type-punning'') is common. Even with
|
|
@samp{-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:
|
|
@example
|
|
int f() @{
|
|
a_union t;
|
|
int* ip;
|
|
t.d = 3.0;
|
|
ip = &t.i;
|
|
return *ip;
|
|
@}
|
|
@end example
|
|
|
|
This option is not enabled by default at any optimization level because
|
|
it is new and has yet to be subjected to thorough testing. You may
|
|
of course enable it manually with @samp{-fstrict-aliasing}.
|
|
|
|
@ifset INTERNALS
|
|
Every language that wishes to perform language-specific alias analysis
|
|
should define a function that computes, given an @code{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
|
|
@code{c_get_alias_set}.
|
|
@end ifset
|
|
|
|
@item -fstructure-noalias
|
|
Allows the compiler to assume that structure / varying array references
|
|
do not alias fixed scalars.
|
|
|
|
Although this optimization is safe, GCC can occasionally lose track
|
|
of which references refer to scalars and which to structures,
|
|
leading it to perform unsafe transformations. Release 1.2 of EGCS
|
|
will incorporate changes which allow GCC to track the
|
|
scalar/structure distinction safely. Thus, the optimization will
|
|
always be same, and this option will likely be removed or will have
|
|
no effect.
|
|
@end table
|
|
|
|
@node Preprocessor Options
|
|
@section Options Controlling the Preprocessor
|
|
@cindex preprocessor options
|
|
@cindex options, preprocessor
|
|
|
|
These options control the C preprocessor, which is run on each C source
|
|
file before actual compilation.
|
|
|
|
If you use the @samp{-E} option, nothing is done except preprocessing.
|
|
Some of these options make sense only together with @samp{-E} because
|
|
they cause the preprocessor output to be unsuitable for actual
|
|
compilation.
|
|
|
|
@table @code
|
|
@item -include @var{file}
|
|
Process @var{file} as input before processing the regular input file.
|
|
In effect, the contents of @var{file} are compiled first. Any @samp{-D}
|
|
and @samp{-U} options on the command line are always processed before
|
|
@samp{-include @var{file}}, regardless of the order in which they are
|
|
written. All the @samp{-include} and @samp{-imacros} options are
|
|
processed in the order in which they are written.
|
|
|
|
@item -imacros @var{file}
|
|
Process @var{file} as input, discarding the resulting output, before
|
|
processing the regular input file. Because the output generated from
|
|
@var{file} is discarded, the only effect of @samp{-imacros @var{file}}
|
|
is to make the macros defined in @var{file} available for use in the
|
|
main input.
|
|
|
|
Any @samp{-D} and @samp{-U} options on the command line are always
|
|
processed before @samp{-imacros @var{file}}, regardless of the order in
|
|
which they are written. All the @samp{-include} and @samp{-imacros}
|
|
options are processed in the order in which they are written.
|
|
|
|
@item -idirafter @var{dir}
|
|
@cindex second include path
|
|
Add the directory @var{dir} to the second include path. The directories
|
|
on the second include path are searched when a header file is not found
|
|
in any of the directories in the main include path (the one that
|
|
@samp{-I} adds to).
|
|
|
|
@item -iprefix @var{prefix}
|
|
Specify @var{prefix} as the prefix for subsequent @samp{-iwithprefix}
|
|
options.
|
|
|
|
@item -iwithprefix @var{dir}
|
|
Add a directory to the second include path. The directory's name is
|
|
made by concatenating @var{prefix} and @var{dir}, where @var{prefix} was
|
|
specified previously with @samp{-iprefix}. If you have not specified a
|
|
prefix yet, the directory containing the installed passes of the
|
|
compiler is used as the default.
|
|
|
|
@item -iwithprefixbefore @var{dir}
|
|
Add a directory to the main include path. The directory's name is made
|
|
by concatenating @var{prefix} and @var{dir}, as in the case of
|
|
@samp{-iwithprefix}.
|
|
|
|
@item -isystem @var{dir}
|
|
Add a directory to the beginning of the second include path, marking it
|
|
as a system directory, so that it gets the same special treatment as
|
|
is applied to the standard system directories.
|
|
|
|
@item -nostdinc
|
|
Do not search the standard system directories for header files. Only
|
|
the directories you have specified with @samp{-I} options (and the
|
|
current directory, if appropriate) are searched. @xref{Directory
|
|
Options}, for information on @samp{-I}.
|
|
|
|
By using both @samp{-nostdinc} and @samp{-I-}, you can limit the include-file
|
|
search path to only those directories you specify explicitly.
|
|
|
|
@item -undef
|
|
Do not predefine any nonstandard macros. (Including architecture flags).
|
|
|
|
@item -E
|
|
Run only the C preprocessor. Preprocess all the C source files
|
|
specified and output the results to standard output or to the
|
|
specified output file.
|
|
|
|
@item -C
|
|
Tell the preprocessor not to discard comments. Used with the
|
|
@samp{-E} option.
|
|
|
|
@item -P
|
|
Tell the preprocessor not to generate @samp{#line} directives.
|
|
Used with the @samp{-E} option.
|
|
|
|
@cindex make
|
|
@cindex dependencies, make
|
|
@item -M
|
|
Tell the preprocessor to output a rule suitable for @code{make}
|
|
describing the dependencies of each object file. For each source file,
|
|
the preprocessor outputs one @code{make}-rule whose target is the object
|
|
file name for that source file and whose dependencies are all the
|
|
@code{#include} header files it uses. This rule may be a single line or
|
|
may be continued with @samp{\}-newline if it is long. The list of rules
|
|
is printed on standard output instead of the preprocessed C program.
|
|
|
|
@samp{-M} implies @samp{-E}.
|
|
|
|
Another way to specify output of a @code{make} rule is by setting
|
|
the environment variable @code{DEPENDENCIES_OUTPUT} (@pxref{Environment
|
|
Variables}).
|
|
|
|
@item -MM
|
|
Like @samp{-M} but the output mentions only the user header files
|
|
included with @samp{#include "@var{file}"}. System header files
|
|
included with @samp{#include <@var{file}>} are omitted.
|
|
|
|
@item -MD
|
|
Like @samp{-M} but the dependency information is written to a file made by
|
|
replacing ".c" with ".d" at the end of the input file names.
|
|
This is in addition to compiling the file as specified---@samp{-MD} does
|
|
not inhibit ordinary compilation the way @samp{-M} does.
|
|
|
|
In Mach, you can use the utility @code{md} to merge multiple dependency
|
|
files into a single dependency file suitable for using with the @samp{make}
|
|
command.
|
|
|
|
@item -MMD
|
|
Like @samp{-MD} except mention only user header files, not system
|
|
header files.
|
|
|
|
@item -MG
|
|
Treat missing header files as generated files and assume they live in the
|
|
same directory as the source file. If you specify @samp{-MG}, you
|
|
must also specify either @samp{-M} or @samp{-MM}. @samp{-MG} is not
|
|
supported with @samp{-MD} or @samp{-MMD}.
|
|
|
|
@item -H
|
|
Print the name of each header file used, in addition to other normal
|
|
activities.
|
|
|
|
@item -A@var{question}(@var{answer})
|
|
Assert the answer @var{answer} for @var{question}, in case it is tested
|
|
with a preprocessing conditional such as @samp{#if
|
|
#@var{question}(@var{answer})}. @samp{-A-} disables the standard
|
|
assertions that normally describe the target machine.
|
|
|
|
@item -D@var{macro}
|
|
Define macro @var{macro} with the string @samp{1} as its definition.
|
|
|
|
@item -D@var{macro}=@var{defn}
|
|
Define macro @var{macro} as @var{defn}. All instances of @samp{-D} on
|
|
the command line are processed before any @samp{-U} options.
|
|
|
|
@item -U@var{macro}
|
|
Undefine macro @var{macro}. @samp{-U} options are evaluated after all
|
|
@samp{-D} options, but before any @samp{-include} and @samp{-imacros}
|
|
options.
|
|
|
|
@item -dM
|
|
Tell the preprocessor to output only a list of the macro definitions
|
|
that are in effect at the end of preprocessing. Used with the @samp{-E}
|
|
option.
|
|
|
|
@item -dD
|
|
Tell the preprocessing to pass all macro definitions into the output, in
|
|
their proper sequence in the rest of the output.
|
|
|
|
@item -dN
|
|
Like @samp{-dD} except that the macro arguments and contents are omitted.
|
|
Only @samp{#define @var{name}} is included in the output.
|
|
|
|
@item -trigraphs
|
|
Support ANSI C trigraphs. The @samp{-ansi} option also has this effect.
|
|
|
|
@item -Wp,@var{option}
|
|
Pass @var{option} as an option to the preprocessor. If @var{option}
|
|
contains commas, it is split into multiple options at the commas.
|
|
@end table
|
|
|
|
@node Assembler Options
|
|
@section Passing Options to the Assembler
|
|
|
|
@c prevent bad page break with this line
|
|
You can pass options to the assembler.
|
|
|
|
@table @code
|
|
@item -Wa,@var{option}
|
|
Pass @var{option} as an option to the assembler. If @var{option}
|
|
contains commas, it is split into multiple options at the commas.
|
|
@end table
|
|
|
|
@node Link Options
|
|
@section Options for Linking
|
|
@cindex link options
|
|
@cindex options, linking
|
|
|
|
These options come into play when the compiler links object files into
|
|
an executable output file. They are meaningless if the compiler is
|
|
not doing a link step.
|
|
|
|
@table @code
|
|
@cindex file names
|
|
@item @var{object-file-name}
|
|
A file name that does not end in a special recognized suffix is
|
|
considered to name an object file or library. (Object files are
|
|
distinguished from libraries by the linker according to the file
|
|
contents.) If linking is done, these object files are used as input
|
|
to the linker.
|
|
|
|
@item -c
|
|
@itemx -S
|
|
@itemx -E
|
|
If any of these options is used, then the linker is not run, and
|
|
object file names should not be used as arguments. @xref{Overall
|
|
Options}.
|
|
|
|
@cindex Libraries
|
|
@item -l@var{library}
|
|
Search the library named @var{library} when linking.
|
|
|
|
It makes a difference where in the command you write this option; the
|
|
linker searches processes libraries and object files in the order they
|
|
are specified. Thus, @samp{foo.o -lz bar.o} searches library @samp{z}
|
|
after file @file{foo.o} but before @file{bar.o}. If @file{bar.o} refers
|
|
to functions in @samp{z}, those functions may not be loaded.
|
|
|
|
The linker searches a standard list of directories for the library,
|
|
which is actually a file named @file{lib@var{library}.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 @samp{-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 @samp{-l} option and specifying a file name
|
|
is that @samp{-l} surrounds @var{library} with @samp{lib} and @samp{.a}
|
|
and searches several directories.
|
|
|
|
@item -lobjc
|
|
You need this special case of the @samp{-l} option in order to
|
|
link an Objective C program.
|
|
|
|
@item -nostartfiles
|
|
Do not use the standard system startup files when linking.
|
|
The standard system libraries are used normally, unless @code{-nostdlib}
|
|
or @code{-nodefaultlibs} is used.
|
|
|
|
@item -nodefaultlibs
|
|
Do not use the standard system libraries when linking.
|
|
Only the libraries you specify will be passed to the linker.
|
|
The standard startup files are used normally, unless @code{-nostartfiles}
|
|
is used. The compiler may generate calls to memcmp, memset, and memcpy
|
|
for System V (and ANSI C) environments or to bcopy and bzero for
|
|
BSD environments. These entries are usually resolved by entries in
|
|
libc. These entry points should be supplied through some other
|
|
mechanism when this option is specified.
|
|
|
|
@item -nostdlib
|
|
Do not use the standard system startup files or libraries when linking.
|
|
No startup files and only the libraries you specify will be passed to
|
|
the linker. The compiler may generate calls to memcmp, memset, and memcpy
|
|
for System V (and ANSI C) environments or to bcopy and bzero for
|
|
BSD environments. These entries are usually resolved by entries in
|
|
libc. These entry points should be supplied through some other
|
|
mechanism when this option is specified.
|
|
|
|
@cindex @code{-lgcc}, use with @code{-nostdlib}
|
|
@cindex @code{-nostdlib} and unresolved references
|
|
@cindex unresolved references and @code{-nostdlib}
|
|
@cindex @code{-lgcc}, use with @code{-nodefaultlibs}
|
|
@cindex @code{-nodefaultlibs} and unresolved references
|
|
@cindex unresolved references and @code{-nodefaultlibs}
|
|
One of the standard libraries bypassed by @samp{-nostdlib} and
|
|
@samp{-nodefaultlibs} is @file{libgcc.a}, a library of internal subroutines
|
|
that GNU CC uses to overcome shortcomings of particular machines, or special
|
|
needs for some languages.
|
|
@ifset INTERNALS
|
|
(@xref{Interface,,Interfacing to GNU CC Output}, for more discussion of
|
|
@file{libgcc.a}.)
|
|
@end ifset
|
|
@ifclear INTERNALS
|
|
(@xref{Interface,,Interfacing to GNU CC Output,gcc.info,Porting GNU CC},
|
|
for more discussion of @file{libgcc.a}.)
|
|
@end ifclear
|
|
In most cases, you need @file{libgcc.a} even when you want to avoid
|
|
other standard libraries. In other words, when you specify @samp{-nostdlib}
|
|
or @samp{-nodefaultlibs} you should usually specify @samp{-lgcc} as well.
|
|
This ensures that you have no unresolved references to internal GNU CC
|
|
library subroutines. (For example, @samp{__main}, used to ensure C++
|
|
constructors will be called; @pxref{Collect2,,@code{collect2}}.)
|
|
|
|
@item -s
|
|
Remove all symbol table and relocation information from the executable.
|
|
|
|
@item -static
|
|
On systems that support dynamic linking, this prevents linking with the shared
|
|
libraries. On other systems, this option has no effect.
|
|
|
|
@item -shared
|
|
Produce a shared object which can then be linked with other objects to
|
|
form an executable. Not all systems support this option. You must
|
|
also specify @samp{-fpic} or @samp{-fPIC} on some systems when
|
|
you specify this option.
|
|
|
|
@item -symbolic
|
|
Bind references to global symbols when building a shared object. Warn
|
|
about any unresolved references (unless overridden by the link editor
|
|
option @samp{-Xlinker -z -Xlinker defs}). Only a few systems support
|
|
this option.
|
|
|
|
@item -Xlinker @var{option}
|
|
Pass @var{option} as an option to the linker. You can use this to
|
|
supply system-specific linker options which GNU CC does not know how to
|
|
recognize.
|
|
|
|
If you want to pass an option that takes an argument, you must use
|
|
@samp{-Xlinker} twice, once for the option and once for the argument.
|
|
For example, to pass @samp{-assert definitions}, you must write
|
|
@samp{-Xlinker -assert -Xlinker definitions}. It does not work to write
|
|
@samp{-Xlinker "-assert definitions"}, because this passes the entire
|
|
string as a single argument, which is not what the linker expects.
|
|
|
|
@item -Wl,@var{option}
|
|
Pass @var{option} as an option to the linker. If @var{option} contains
|
|
commas, it is split into multiple options at the commas.
|
|
|
|
@item -u @var{symbol}
|
|
Pretend the symbol @var{symbol} is undefined, to force linking of
|
|
library modules to define it. You can use @samp{-u} multiple times with
|
|
different symbols to force loading of additional library modules.
|
|
@end table
|
|
|
|
@node Directory Options
|
|
@section Options for Directory Search
|
|
@cindex directory options
|
|
@cindex options, directory search
|
|
@cindex search path
|
|
|
|
These options specify directories to search for header files, for
|
|
libraries and for parts of the compiler:
|
|
|
|
@table @code
|
|
@item -I@var{dir}
|
|
Add the directory @var{dir} to the head of the list of directories to be
|
|
searched for header files. This can be used to override a system header
|
|
file, substituting your own version, since these directories are
|
|
searched before the system header file directories. If you use more
|
|
than one @samp{-I} option, the directories are scanned in left-to-right
|
|
order; the standard system directories come after.
|
|
|
|
@item -I-
|
|
Any directories you specify with @samp{-I} options before the @samp{-I-}
|
|
option are searched only for the case of @samp{#include "@var{file}"};
|
|
they are not searched for @samp{#include <@var{file}>}.
|
|
|
|
If additional directories are specified with @samp{-I} options after
|
|
the @samp{-I-}, these directories are searched for all @samp{#include}
|
|
directives. (Ordinarily @emph{all} @samp{-I} directories are used
|
|
this way.)
|
|
|
|
In addition, the @samp{-I-} option inhibits the use of the current
|
|
directory (where the current input file came from) as the first search
|
|
directory for @samp{#include "@var{file}"}. There is no way to
|
|
override this effect of @samp{-I-}. With @samp{-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.
|
|
|
|
@samp{-I-} does not inhibit the use of the standard system directories
|
|
for header files. Thus, @samp{-I-} and @samp{-nostdinc} are
|
|
independent.
|
|
|
|
@item -L@var{dir}
|
|
Add directory @var{dir} to the list of directories to be searched
|
|
for @samp{-l}.
|
|
|
|
@item -B@var{prefix}
|
|
This option specifies where to find the executables, libraries,
|
|
include files, and data files of the compiler itself.
|
|
|
|
The compiler driver program runs one or more of the subprograms
|
|
@file{cpp}, @file{cc1}, @file{as} and @file{ld}. It tries
|
|
@var{prefix} as a prefix for each program it tries to run, both with and
|
|
without @samp{@var{machine}/@var{version}/} (@pxref{Target Options}).
|
|
|
|
For each subprogram to be run, the compiler driver first tries the
|
|
@samp{-B} prefix, if any. If that name is not found, or if @samp{-B}
|
|
was not specified, the driver tries two standard prefixes, which are
|
|
@file{/usr/lib/gcc/} and @file{/usr/local/lib/gcc-lib/}. 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
|
|
@samp{PATH} environment variable.
|
|
|
|
@samp{-B} prefixes that effectively specify directory names also apply
|
|
to libraries in the linker, because the compiler translates these
|
|
options into @samp{-L} options for the linker. They also apply to
|
|
includes files in the preprocessor, because the compiler translates these
|
|
options into @samp{-isystem} options for the preprocessor. In this case,
|
|
the compiler appends @samp{include} to the prefix.
|
|
|
|
The run-time support file @file{libgcc.a} can also be searched for using
|
|
the @samp{-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 @samp{-B} prefix is to use
|
|
the environment variable @code{GCC_EXEC_PREFIX}. @xref{Environment
|
|
Variables}.
|
|
|
|
@item -specs=@var{file}
|
|
Process @var{file} after the compiler reads in the standard @file{specs}
|
|
file, in order to override the defaults that the @file{gcc} driver
|
|
program uses when determining what switches to pass to @file{cc1},
|
|
@file{cc1plus}, @file{as}, @file{ld}, etc. More than one
|
|
@samp{-specs=}@var{file} can be specified on the command line, and they
|
|
are processed in order, from left to right.
|
|
@end table
|
|
|
|
@node Target Options
|
|
@section Specifying Target Machine and Compiler Version
|
|
@cindex target options
|
|
@cindex cross compiling
|
|
@cindex specifying machine version
|
|
@cindex specifying compiler version and target machine
|
|
@cindex compiler version, specifying
|
|
@cindex target machine, specifying
|
|
|
|
By default, GNU CC compiles code for the same type of machine that you
|
|
are using. However, it can also be installed as a cross-compiler, to
|
|
compile for some other type of machine. In fact, several different
|
|
configurations of GNU CC, for different target machines, can be
|
|
installed side by side. Then you specify which one to use with the
|
|
@samp{-b} option.
|
|
|
|
In addition, older and newer versions of GNU CC can be installed side
|
|
by side. One of them (probably the newest) will be the default, but
|
|
you may sometimes wish to use another.
|
|
|
|
@table @code
|
|
@item -b @var{machine}
|
|
The argument @var{machine} specifies the target machine for compilation.
|
|
This is useful when you have installed GNU CC as a cross-compiler.
|
|
|
|
The value to use for @var{machine} is the same as was specified as the
|
|
machine type when configuring GNU CC as a cross-compiler. For
|
|
example, if a cross-compiler was configured with @samp{configure
|
|
i386v}, meaning to compile for an 80386 running System V, then you
|
|
would specify @samp{-b i386v} to run that cross compiler.
|
|
|
|
When you do not specify @samp{-b}, it normally means to compile for
|
|
the same type of machine that you are using.
|
|
|
|
@item -V @var{version}
|
|
The argument @var{version} specifies which version of GNU CC to run.
|
|
This is useful when multiple versions are installed. For example,
|
|
@var{version} might be @samp{2.0}, meaning to run GNU CC version 2.0.
|
|
|
|
The default version, when you do not specify @samp{-V}, is the last
|
|
version of GNU CC that you installed.
|
|
@end table
|
|
|
|
The @samp{-b} and @samp{-V} options actually work by controlling part of
|
|
the file name used for the executable files and libraries used for
|
|
compilation. A given version of GNU CC, for a given target machine, is
|
|
normally kept in the directory @file{/usr/local/lib/gcc-lib/@var{machine}/@var{version}}.@refill
|
|
|
|
Thus, sites can customize the effect of @samp{-b} or @samp{-V} either by
|
|
changing the names of these directories or adding alternate names (or
|
|
symbolic links). If in directory @file{/usr/local/lib/gcc-lib/} the
|
|
file @file{80386} is a link to the file @file{i386v}, then @samp{-b
|
|
80386} becomes an alias for @samp{-b i386v}.
|
|
|
|
In one respect, the @samp{-b} or @samp{-V} do not completely change
|
|
to a different compiler: the top-level driver program @code{gcc}
|
|
that you originally invoked continues to run and invoke the other
|
|
executables (preprocessor, compiler per se, assembler and linker)
|
|
that do the real work. However, since no real work is done in the
|
|
driver program, it usually does not matter that the driver program
|
|
in use is not the one for the specified target and version.
|
|
|
|
The only way that the driver program depends on the target machine is
|
|
in the parsing and handling of special machine-specific options.
|
|
However, this is controlled by a file which is found, along with the
|
|
other executables, in the directory for the specified version and
|
|
target machine. As a result, a single installed driver program adapts
|
|
to any specified target machine and compiler version.
|
|
|
|
The driver program executable does control one significant thing,
|
|
however: the default version and target machine. Therefore, you can
|
|
install different instances of the driver program, compiled for
|
|
different targets or versions, under different names.
|
|
|
|
For example, if the driver for version 2.0 is installed as @code{ogcc}
|
|
and that for version 2.1 is installed as @code{gcc}, then the command
|
|
@code{gcc} will use version 2.1 by default, while @code{ogcc} will use
|
|
2.0 by default. However, you can choose either version with either
|
|
command with the @samp{-V} option.
|
|
|
|
@node Submodel Options
|
|
@section Hardware Models and Configurations
|
|
@cindex submodel options
|
|
@cindex specifying hardware config
|
|
@cindex hardware models and configurations, specifying
|
|
@cindex machine dependent options
|
|
|
|
Earlier we discussed the standard option @samp{-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 @samp{-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.
|
|
|
|
@ifset INTERNALS
|
|
These options are defined by the macro @code{TARGET_SWITCHES} in the
|
|
machine description. The default for the options is also defined by
|
|
that macro, which enables you to change the defaults.
|
|
@end ifset
|
|
|
|
@menu
|
|
* M680x0 Options::
|
|
* VAX Options::
|
|
* SPARC Options::
|
|
* Convex Options::
|
|
* AMD29K Options::
|
|
* ARM Options::
|
|
* Thumb Options::
|
|
* MN10200 Options::
|
|
* MN10300 Options::
|
|
* M32R/D Options::
|
|
* M88K Options::
|
|
* RS/6000 and PowerPC Options::
|
|
* RT Options::
|
|
* MIPS Options::
|
|
* i386 Options::
|
|
* HPPA Options::
|
|
* Intel 960 Options::
|
|
* DEC Alpha Options::
|
|
* Clipper Options::
|
|
* H8/300 Options::
|
|
* SH Options::
|
|
* System V Options::
|
|
* V850 Options::
|
|
* ARC Options::
|
|
@end menu
|
|
|
|
@node M680x0 Options
|
|
@subsection M680x0 Options
|
|
@cindex M680x0 options
|
|
|
|
These are the @samp{-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.
|
|
|
|
@table @code
|
|
@item -m68000
|
|
@itemx -mc68000
|
|
Generate output for a 68000. This is the default
|
|
when the compiler is configured for 68000-based systems.
|
|
|
|
Use this option for microcontrollers with a 68000 or EC000 core,
|
|
including the 68008, 68302, 68306, 68307, 68322, 68328 and 68356.
|
|
|
|
@item -m68020
|
|
@itemx -mc68020
|
|
Generate output for a 68020. This is the default
|
|
when the compiler is configured for 68020-based systems.
|
|
|
|
@item -m68881
|
|
Generate output containing 68881 instructions for floating point.
|
|
This is the default for most 68020 systems unless @samp{-nfp} was
|
|
specified when the compiler was configured.
|
|
|
|
@item -m68030
|
|
Generate output for a 68030. This is the default when the compiler is
|
|
configured for 68030-based systems.
|
|
|
|
@item -m68040
|
|
Generate output for a 68040. This is the default when the compiler is
|
|
configured for 68040-based systems.
|
|
|
|
This option inhibits the use of 68881/68882 instructions that have to be
|
|
emulated by software on the 68040. Use this option if your 68040 does not
|
|
have code to emulate those instructions.
|
|
|
|
@item -m68060
|
|
Generate output for a 68060. This is the default when the compiler is
|
|
configured for 68060-based systems.
|
|
|
|
This option inhibits the use of 68020 and 68881/68882 instructions that
|
|
have to be emulated by software on the 68060. Use this option if your 68060
|
|
does not have code to emulate those instructions.
|
|
|
|
@item -mcpu32
|
|
Generate output for a CPU32. This is the default
|
|
when the compiler is configured for CPU32-based systems.
|
|
|
|
Use this option for microcontrollers with a
|
|
CPU32 or CPU32+ core, including the 68330, 68331, 68332, 68333, 68334,
|
|
68336, 68340, 68341, 68349 and 68360.
|
|
|
|
@item -m5200
|
|
Generate output for a 520X "coldfire" family cpu. This is the default
|
|
when the compiler is configured for 520X-based systems.
|
|
|
|
Use this option for microcontroller with a 5200 core, including
|
|
the MCF5202, MCF5203, MCF5204 and MCF5202.
|
|
|
|
|
|
@item -m68020-40
|
|
Generate output for a 68040, without using any of the new instructions.
|
|
This results in code which can run relatively efficiently on either a
|
|
68020/68881 or a 68030 or a 68040. The generated code does use the
|
|
68881 instructions that are emulated on the 68040.
|
|
|
|
@item -m68020-60
|
|
Generate output for a 68060, without using any of the new instructions.
|
|
This results in code which can run relatively efficiently on either a
|
|
68020/68881 or a 68030 or a 68040. The generated code does use the
|
|
68881 instructions that are emulated on the 68060.
|
|
|
|
@item -mfpa
|
|
Generate output containing Sun FPA instructions for floating point.
|
|
|
|
@item -msoft-float
|
|
Generate output containing library calls for floating point.
|
|
@strong{Warning:} the requisite libraries are not available for all m68k
|
|
targets. Normally the facilities of the machine's usual C compiler are
|
|
used, but this can't be done directly in cross-compilation. You must
|
|
make your own arrangements to provide suitable library functions for
|
|
cross-compilation. The embedded targets @samp{m68k-*-aout} and
|
|
@samp{m68k-*-coff} do provide software floating point support.
|
|
|
|
@item -mshort
|
|
Consider type @code{int} to be 16 bits wide, like @code{short int}.
|
|
|
|
@item -mnobitfield
|
|
Do not use the bit-field instructions. The @samp{-m68000}, @samp{-mcpu32}
|
|
and @samp{-m5200} options imply @w{@samp{-mnobitfield}}.
|
|
|
|
@item -mbitfield
|
|
Do use the bit-field instructions. The @samp{-m68020} option implies
|
|
@samp{-mbitfield}. This is the default if you use a configuration
|
|
designed for a 68020.
|
|
|
|
@item -mrtd
|
|
Use a different function-calling convention, in which functions
|
|
that take a fixed number of arguments return with the @code{rtd}
|
|
instruction, which pops their arguments while returning. This
|
|
saves one instruction in the caller since there is no need to pop
|
|
the arguments there.
|
|
|
|
This calling convention is incompatible with the one normally
|
|
used on Unix, so you cannot use it if you need to call libraries
|
|
compiled with the Unix compiler.
|
|
|
|
Also, you must provide function prototypes for all functions that
|
|
take variable numbers of arguments (including @code{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 @code{rtd} instruction is supported by the 68010, 68020, 68030,
|
|
68040, 68060 and CPU32 processors, but not by the 68000 or 5200.
|
|
|
|
@item -malign-int
|
|
@itemx -mno-align-int
|
|
Control whether GNU CC aligns @code{int}, @code{long}, @code{long long},
|
|
@code{float}, @code{double}, and @code{long double} variables on a 32-bit
|
|
boundary (@samp{-malign-int}) or a 16-bit boundary (@samp{-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.
|
|
|
|
@strong{Warning:} if you use the @samp{-malign-int} switch, GNU CC will
|
|
align structures containing the above types differently than
|
|
most published application binary interface specifications for the m68k.
|
|
|
|
@end table
|
|
|
|
@node VAX Options
|
|
@subsection VAX Options
|
|
@cindex VAX options
|
|
|
|
These @samp{-m} options are defined for the Vax:
|
|
|
|
@table @code
|
|
@item -munix
|
|
Do not output certain jump instructions (@code{aobleq} and so on)
|
|
that the Unix assembler for the Vax cannot handle across long
|
|
ranges.
|
|
|
|
@item -mgnu
|
|
Do output those jump instructions, on the assumption that you
|
|
will assemble with the GNU assembler.
|
|
|
|
@item -mg
|
|
Output code for g-format floating point numbers instead of d-format.
|
|
@end table
|
|
|
|
@node SPARC Options
|
|
@subsection SPARC Options
|
|
@cindex SPARC options
|
|
|
|
These @samp{-m} switches are supported on the SPARC:
|
|
|
|
@table @code
|
|
@item -mno-app-regs
|
|
@itemx -mapp-regs
|
|
Specify @samp{-mapp-regs} to generate output using the global registers
|
|
2 through 4, which the SPARC SVR4 ABI reserves for applications. This
|
|
is the default.
|
|
|
|
To be fully SVR4 ABI compliant at the cost of some performance loss,
|
|
specify @samp{-mno-app-regs}. You should compile libraries and system
|
|
software with this option.
|
|
|
|
@item -mfpu
|
|
@itemx -mhard-float
|
|
Generate output containing floating point instructions. This is the
|
|
default.
|
|
|
|
@item -mno-fpu
|
|
@itemx -msoft-float
|
|
Generate output containing library calls for floating point.
|
|
@strong{Warning:} the requisite libraries are not available for all SPARC
|
|
targets. Normally the facilities of the machine's usual C compiler are
|
|
used, but this cannot be done directly in cross-compilation. You must make
|
|
your own arrangements to provide suitable library functions for
|
|
cross-compilation. The embedded targets @samp{sparc-*-aout} and
|
|
@samp{sparclite-*-*} do provide software floating point support.
|
|
|
|
@samp{-msoft-float} changes the calling convention in the output file;
|
|
therefore, it is only useful if you compile @emph{all} of a program with
|
|
this option. In particular, you need to compile @file{libgcc.a}, the
|
|
library that comes with GNU CC, with @samp{-msoft-float} in order for
|
|
this to work.
|
|
|
|
@item -mhard-quad-float
|
|
Generate output containing quad-word (long double) floating point
|
|
instructions.
|
|
|
|
@item -msoft-quad-float
|
|
Generate output containing library calls for quad-word (long double)
|
|
floating point instructions. The functions called are those specified
|
|
in the SPARC ABI. This is the default.
|
|
|
|
As of this writing, there are no sparc implementations that have hardware
|
|
support for the quad-word floating point instructions. They all invoke
|
|
a trap handler for one of these instructions, and then the trap handler
|
|
emulates the effect of the instruction. Because of the trap handler overhead,
|
|
this is much slower than calling the ABI library routines. Thus the
|
|
@samp{-msoft-quad-float} option is the default.
|
|
|
|
@item -mno-epilogue
|
|
@itemx -mepilogue
|
|
With @samp{-mepilogue} (the default), the compiler always emits code for
|
|
function exit at the end of each function. Any function exit in
|
|
the middle of the function (such as a return statement in C) will
|
|
generate a jump to the exit code at the end of the function.
|
|
|
|
With @samp{-mno-epilogue}, the compiler tries to emit exit code inline
|
|
at every function exit.
|
|
|
|
@item -mno-flat
|
|
@itemx -mflat
|
|
With @samp{-mflat}, the compiler does not generate save/restore instructions
|
|
and will use a "flat" or single register window calling convention.
|
|
This model uses %i7 as the frame pointer and is compatible with the normal
|
|
register window model. Code from either may be intermixed.
|
|
The local registers and the input registers (0-5) are still treated as
|
|
"call saved" registers and will be saved on the stack as necessary.
|
|
|
|
With @samp{-mno-flat} (the default), the compiler emits save/restore
|
|
instructions (except for leaf functions) and is the normal mode of operation.
|
|
|
|
@item -mno-unaligned-doubles
|
|
@itemx -munaligned-doubles
|
|
Assume that doubles have 8 byte alignment. This is the default.
|
|
|
|
With @samp{-munaligned-doubles}, GNU CC 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.
|
|
|
|
@item -mv8
|
|
@itemx -msparclite
|
|
These two options select variations on the SPARC architecture.
|
|
|
|
By default (unless specifically configured for the Fujitsu SPARClite),
|
|
GCC generates code for the v7 variant of the SPARC architecture.
|
|
|
|
@samp{-mv8} will give you SPARC v8 code. 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.
|
|
|
|
@samp{-msparclite} will give you SPARClite code. This adds the integer
|
|
multiply, integer divide step and scan (@code{ffs}) instructions which
|
|
exist in SPARClite but not in SPARC v7.
|
|
|
|
These options are deprecated and will be deleted in GNU CC 2.9.
|
|
They have been replaced with @samp{-mcpu=xxx}.
|
|
|
|
@item -mcypress
|
|
@itemx -msupersparc
|
|
These two options select the processor for which the code is optimised.
|
|
|
|
With @samp{-mcypress} (the default), the compiler optimizes code 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 @samp{-msupersparc} the compiler optimizes code for the SuperSparc cpu, as
|
|
used in the SparcStation 10, 1000 and 2000 series. This flag also enables use
|
|
of the full SPARC v8 instruction set.
|
|
|
|
These options are deprecated and will be deleted in GNU CC 2.9.
|
|
They have been replaced with @samp{-mcpu=xxx}.
|
|
|
|
@item -mcpu=@var{cpu_type}
|
|
Set the instruction set, register set, and instruction scheduling parameters
|
|
for machine type @var{cpu_type}. Supported values for @var{cpu_type} are
|
|
@samp{v7}, @samp{cypress}, @samp{v8}, @samp{supersparc}, @samp{sparclite},
|
|
@samp{f930}, @samp{f934}, @samp{sparclet}, @samp{tsc701}, @samp{v9}, and
|
|
@samp{ultrasparc}.
|
|
|
|
Default instruction scheduling parameters are used for values that select
|
|
an architecture and not an implementation. These are @samp{v7}, @samp{v8},
|
|
@samp{sparclite}, @samp{sparclet}, @samp{v9}.
|
|
|
|
Here is a list of each supported architecture and their supported
|
|
implementations.
|
|
|
|
@smallexample
|
|
v7: cypress
|
|
v8: supersparc
|
|
sparclite: f930, f934
|
|
sparclet: tsc701
|
|
v9: ultrasparc
|
|
@end smallexample
|
|
|
|
@item -mtune=@var{cpu_type}
|
|
Set the instruction scheduling parameters for machine type
|
|
@var{cpu_type}, but do not set the instruction set or register set that the
|
|
option @samp{-mcpu=}@var{cpu_type} would.
|
|
|
|
The same values for @samp{-mcpu=}@var{cpu_type} are used for
|
|
@samp{-mtune=}@*@var{cpu_type}, though the only useful values are those that
|
|
select a particular cpu implementation: @samp{cypress}, @samp{supersparc},
|
|
@samp{f930}, @samp{f934}, @samp{tsc701}, @samp{ultrasparc}.
|
|
|
|
@item -malign-loops=@var{num}
|
|
Align loops to a 2 raised to a @var{num} byte boundary. If
|
|
@samp{-malign-loops} is not specified, the default is 2.
|
|
|
|
@item -malign-jumps=@var{num}
|
|
Align instructions that are only jumped to to a 2 raised to a @var{num}
|
|
byte boundary. If @samp{-malign-jumps} is not specified, the default is 2.
|
|
|
|
@item -malign-functions=@var{num}
|
|
Align the start of functions to a 2 raised to @var{num} byte boundary.
|
|
If @samp{-malign-functions} is not specified, the default is 2 if compiling
|
|
for 32 bit sparc, and 5 if compiling for 64 bit sparc.
|
|
|
|
@end table
|
|
|
|
These @samp{-m} switches are supported in addition to the above
|
|
on the SPARCLET processor.
|
|
|
|
@table @code
|
|
@item -mlittle-endian
|
|
Generate code for a processor running in little-endian mode.
|
|
|
|
@item -mlive-g0
|
|
Treat register @code{%g0} as a normal register.
|
|
GCC will continue to clobber it as necessary but will not assume
|
|
it always reads as 0.
|
|
|
|
@item -mbroken-saverestore
|
|
Generate code that does not use non-trivial forms of the @code{save} and
|
|
@code{restore} instructions. Early versions of the SPARCLET processor do
|
|
not correctly handle @code{save} and @code{restore} instructions used with
|
|
arguments. They correctly handle them used without arguments. A @code{save}
|
|
instruction used without arguments increments the current window pointer
|
|
but does not allocate a new stack frame. It is assumed that the window
|
|
overflow trap handler will properly handle this case as will interrupt
|
|
handlers.
|
|
@end table
|
|
|
|
These @samp{-m} switches are supported in addition to the above
|
|
on SPARC V9 processors in 64 bit environments.
|
|
|
|
@table @code
|
|
@item -mlittle-endian
|
|
Generate code for a processor running in little-endian mode.
|
|
|
|
@item -m32
|
|
@itemx -m64
|
|
Generate code for a 32 bit or 64 bit environment.
|
|
The 32 bit environment sets int, long and pointer to 32 bits.
|
|
The 64 bit environment sets int to 32 bits and long and pointer
|
|
to 64 bits.
|
|
|
|
@item -mcmodel=medlow
|
|
Generate code for the Medium/Low code model: the program must be linked
|
|
in the low 32 bits of the address space. Pointers are 64 bits.
|
|
Programs can be statically or dynamically linked.
|
|
|
|
@item -mcmodel=medmid
|
|
Generate code for the Medium/Middle code model: the program must be linked
|
|
in the low 44 bits of the address space, the text segment must be less than
|
|
2G bytes, and data segment must be within 2G of the text segment.
|
|
Pointers are 64 bits.
|
|
|
|
@item -mcmodel=medany
|
|
Generate code for the Medium/Anywhere code model: the program may be linked
|
|
anywhere in the address space, the text segment must be less than
|
|
2G bytes, and data segment must be within 2G of the text segment.
|
|
Pointers are 64 bits.
|
|
|
|
@item -mcmodel=embmedany
|
|
Generate code for the Medium/Anywhere code model for embedded systems:
|
|
assume a 32 bit text and a 32 bit data segment, both starting anywhere
|
|
(determined at link time). Register %g4 points to the base of the
|
|
data segment. Pointers still 64 bits.
|
|
Programs are statically linked, PIC is not supported.
|
|
|
|
@item -mstack-bias
|
|
@itemx -mno-stack-bias
|
|
With @samp{-mstack-bias}, GNU CC assumes that the stack pointer, and
|
|
frame pointer if present, are offset by -2047 which must be added back
|
|
when making stack frame references.
|
|
Otherwise, assume no such offset is present.
|
|
@end table
|
|
|
|
@node Convex Options
|
|
@subsection Convex Options
|
|
@cindex Convex options
|
|
|
|
These @samp{-m} options are defined for Convex:
|
|
|
|
@table @code
|
|
@item -mc1
|
|
Generate output for C1. The code will run on any Convex machine.
|
|
The preprocessor symbol @code{__convex__c1__} is defined.
|
|
|
|
@item -mc2
|
|
Generate output for C2. Uses instructions not available on C1.
|
|
Scheduling and other optimizations are chosen for max performance on C2.
|
|
The preprocessor symbol @code{__convex_c2__} is defined.
|
|
|
|
@item -mc32
|
|
Generate output for C32xx. Uses instructions not available on C1.
|
|
Scheduling and other optimizations are chosen for max performance on C32.
|
|
The preprocessor symbol @code{__convex_c32__} is defined.
|
|
|
|
@item -mc34
|
|
Generate output for C34xx. Uses instructions not available on C1.
|
|
Scheduling and other optimizations are chosen for max performance on C34.
|
|
The preprocessor symbol @code{__convex_c34__} is defined.
|
|
|
|
@item -mc38
|
|
Generate output for C38xx. Uses instructions not available on C1.
|
|
Scheduling and other optimizations are chosen for max performance on C38.
|
|
The preprocessor symbol @code{__convex_c38__} is defined.
|
|
|
|
@item -margcount
|
|
Generate code which puts an argument count in the word preceding each
|
|
argument list. This is compatible with regular CC, and a few programs
|
|
may need the argument count word. GDB and other source-level debuggers
|
|
do not need it; this info is in the symbol table.
|
|
|
|
@item -mnoargcount
|
|
Omit the argument count word. This is the default.
|
|
|
|
@item -mvolatile-cache
|
|
Allow volatile references to be cached. This is the default.
|
|
|
|
@item -mvolatile-nocache
|
|
Volatile references bypass the data cache, going all the way to memory.
|
|
This is only needed for multi-processor code that does not use standard
|
|
synchronization instructions. Making non-volatile references to volatile
|
|
locations will not necessarily work.
|
|
|
|
@item -mlong32
|
|
Type long is 32 bits, the same as type int. This is the default.
|
|
|
|
@item -mlong64
|
|
Type long is 64 bits, the same as type long long. This option is useless,
|
|
because no library support exists for it.
|
|
@end table
|
|
|
|
@node AMD29K Options
|
|
@subsection AMD29K Options
|
|
@cindex AMD29K options
|
|
|
|
These @samp{-m} options are defined for the AMD Am29000:
|
|
|
|
@table @code
|
|
@item -mdw
|
|
@kindex -mdw
|
|
@cindex DW bit (29k)
|
|
Generate code that assumes the @code{DW} bit is set, i.e., that byte and
|
|
halfword operations are directly supported by the hardware. This is the
|
|
default.
|
|
|
|
@item -mndw
|
|
@kindex -mndw
|
|
Generate code that assumes the @code{DW} bit is not set.
|
|
|
|
@item -mbw
|
|
@kindex -mbw
|
|
@cindex byte writes (29k)
|
|
Generate code that assumes the system supports byte and halfword write
|
|
operations. This is the default.
|
|
|
|
@item -mnbw
|
|
@kindex -mnbw
|
|
Generate code that assumes the systems does not support byte and
|
|
halfword write operations. @samp{-mnbw} implies @samp{-mndw}.
|
|
|
|
@item -msmall
|
|
@kindex -msmall
|
|
@cindex memory model (29k)
|
|
Use a small memory model that assumes that all function addresses are
|
|
either within a single 256 KB segment or at an absolute address of less
|
|
than 256k. This allows the @code{call} instruction to be used instead
|
|
of a @code{const}, @code{consth}, @code{calli} sequence.
|
|
|
|
@item -mnormal
|
|
@kindex -mnormal
|
|
Use the normal memory model: Generate @code{call} instructions only when
|
|
calling functions in the same file and @code{calli} instructions
|
|
otherwise. This works if each file occupies less than 256 KB but allows
|
|
the entire executable to be larger than 256 KB. This is the default.
|
|
|
|
@item -mlarge
|
|
Always use @code{calli} instructions. Specify this option if you expect
|
|
a single file to compile into more than 256 KB of code.
|
|
|
|
@item -m29050
|
|
@kindex -m29050
|
|
@cindex processor selection (29k)
|
|
Generate code for the Am29050.
|
|
|
|
@item -m29000
|
|
@kindex -m29000
|
|
Generate code for the Am29000. This is the default.
|
|
|
|
@item -mkernel-registers
|
|
@kindex -mkernel-registers
|
|
@cindex kernel and user registers (29k)
|
|
Generate references to registers @code{gr64-gr95} instead of to
|
|
registers @code{gr96-gr127}. This option can be used when compiling
|
|
kernel code that wants a set of global registers disjoint from that used
|
|
by user-mode code.
|
|
|
|
Note that when this option is used, register names in @samp{-f} flags
|
|
must use the normal, user-mode, names.
|
|
|
|
@item -muser-registers
|
|
@kindex -muser-registers
|
|
Use the normal set of global registers, @code{gr96-gr127}. This is the
|
|
default.
|
|
|
|
@item -mstack-check
|
|
@itemx -mno-stack-check
|
|
@kindex -mstack-check
|
|
@cindex stack checks (29k)
|
|
Insert (or do not insert) a call to @code{__msp_check} after each stack
|
|
adjustment. This is often used for kernel code.
|
|
|
|
@item -mstorem-bug
|
|
@itemx -mno-storem-bug
|
|
@kindex -mstorem-bug
|
|
@cindex storem bug (29k)
|
|
@samp{-mstorem-bug} handles 29k processors which cannot handle the
|
|
separation of a mtsrim insn and a storem instruction (most 29000 chips
|
|
to date, but not the 29050).
|
|
|
|
@item -mno-reuse-arg-regs
|
|
@itemx -mreuse-arg-regs
|
|
@kindex -mreuse-arg-regs
|
|
@samp{-mno-reuse-arg-regs} tells the compiler to only use incoming argument
|
|
registers for copying out arguments. This helps detect calling a function
|
|
with fewer arguments than it was declared with.
|
|
|
|
@item -mno-impure-text
|
|
@itemx -mimpure-text
|
|
@kindex -mimpure-text
|
|
@samp{-mimpure-text}, used in addition to @samp{-shared}, tells the compiler to
|
|
not pass @samp{-assert pure-text} to the linker when linking a shared object.
|
|
|
|
@item -msoft-float
|
|
@kindex -msoft-float
|
|
Generate output containing library calls for floating point.
|
|
@strong{Warning:} the requisite libraries are not part of GNU CC.
|
|
Normally the facilities of the machine's usual C compiler are used, but
|
|
this can't be done directly in cross-compilation. You must make your
|
|
own arrangements to provide suitable library functions for
|
|
cross-compilation.
|
|
@end table
|
|
|
|
@node ARM Options
|
|
@subsection ARM Options
|
|
@cindex ARM options
|
|
|
|
These @samp{-m} options are defined for Advanced RISC Machines (ARM)
|
|
architectures:
|
|
|
|
@table @code
|
|
@item -mapcs-frame
|
|
@kindex -mapcs-frame
|
|
Generate a stack frame that is compliant with the ARM Procedure Call
|
|
Standard for all functions, even if this is not strictly necessary for
|
|
correct execution of the code. Specifying @samp{-fomit-frame-pointer}
|
|
with this option will cause the stack frames not to be generated for
|
|
leaf functions. The default is @samp{-mno-apcs-frame}.
|
|
|
|
@item -mapcs
|
|
@kindex -mapcs
|
|
This is a synonym for @samp{-mapcs-frame}.
|
|
|
|
@item -mapcs-26
|
|
@kindex -mapcs-26
|
|
Generate code for a processor running with a 26-bit program counter,
|
|
and conforming to the function calling standards for the APCS 26-bit
|
|
option. This option replaces the @samp{-m2} and @samp{-m3} options
|
|
of previous releases of the compiler.
|
|
|
|
@item -mapcs-32
|
|
@kindex -mapcs-32
|
|
Generate code for a processor running with a 32-bit program counter,
|
|
and conforming to the function calling standards for the APCS 32-bit
|
|
option. This option replaces the @samp{-m6} option of previous releases
|
|
of the compiler.
|
|
|
|
@item -mapcs-stack-check
|
|
@kindex -mapcs-stack-check
|
|
@kindex -mno-apcs-stack-check
|
|
Generate code to check the amount of stack space available upon entry to
|
|
every function (that actually uses some stack space). If there is
|
|
insufficient space available then either the function
|
|
@samp{__rt_stkovf_split_small} or @samp{__rt_stkovf_split_big} will be
|
|
called, depending upon the amount of stack space required. The run time
|
|
system is required to provide these functions. The default is
|
|
@samp{-mno-apcs-stack-check}, since this produces smaller code.
|
|
|
|
@item -mapcs-float
|
|
@kindex -mapcs-float
|
|
@kindex -mno-apcs-float
|
|
Pass floating point arguments using the float point registers. This is
|
|
one of the variants of the APCS. This option is reccommended if the
|
|
target hardware has a floating point unit or if a lot of floating point
|
|
arithmetic is going to be performed by the code. The default is
|
|
@samp{-mno-apcs-float}, since integer only code is slightly increased in
|
|
size if @samp{-mapcs-float} is used.
|
|
|
|
@item -mapcs-reentrant
|
|
@kindex -mapcs-reentrant
|
|
@kindex -mno-apcs-reentrant
|
|
Generate reentrant, position independent code. This is the equivalent
|
|
to specifying the @samp{-fpic} option. The default is
|
|
@samp{-mno-apcs-reentrant}.
|
|
|
|
@item -mthumb-interwork
|
|
@kindex -mthumb-interwork
|
|
@kindex -mno-thumb-interwork
|
|
Generate code which supports calling between the ARM and THUMB
|
|
instruction sets. Without this option the two instruction sets cannot
|
|
be reliably used inside one program. The default is
|
|
@samp{-mno-thumb-interwork}, since slightly larger code is generated
|
|
when @samp{-mthumb-interwork} is specified.
|
|
|
|
@item -mno-sched-prolog
|
|
@kindex -mno-sched-prolog
|
|
@kindex -msched-prolog
|
|
Prevent the reordering of instructions in the function prolog, or the
|
|
merging of those instruction with the instructions in the function's
|
|
body. This means that all functions will start with a recognisable set
|
|
of instructions (or in fact one of a chioce from a small set of
|
|
different function prologues), and this information can be used to
|
|
locate the start if functions inside an executable piece of code. The
|
|
default is @samp{-msched-prolog}.
|
|
|
|
@item -mhard-float
|
|
Generate output containing floating point instructions. This is the
|
|
default.
|
|
|
|
@item -msoft-float
|
|
Generate output containing library calls for floating point.
|
|
@strong{Warning:} the requisite libraries are not available for all ARM
|
|
targets. Normally the facilities of the machine's usual C compiler are
|
|
used, but this cannot be done directly in cross-compilation. You must make
|
|
your own arrangements to provide suitable library functions for
|
|
cross-compilation.
|
|
|
|
@samp{-msoft-float} changes the calling convention in the output file;
|
|
therefore, it is only useful if you compile @emph{all} of a program with
|
|
this option. In particular, you need to compile @file{libgcc.a}, the
|
|
library that comes with GNU CC, with @samp{-msoft-float} in order for
|
|
this to work.
|
|
|
|
@item -mlittle-endian
|
|
Generate code for a processor running in little-endian mode. This is
|
|
the default for all standard configurations.
|
|
|
|
@item -mbig-endian
|
|
Generate code for a processor running in big-endian mode; the default is
|
|
to compile code for a little-endian processor.
|
|
|
|
@item -mwords-little-endian
|
|
This option only applies when generating code for big-endian processors.
|
|
Generate code for a little-endian word order but a big-endian byte
|
|
order. That is, a byte order of the form @samp{32107654}. Note: this
|
|
option should only be used if you require compatibility with code for
|
|
big-endian ARM processors generated by versions of the compiler prior to
|
|
2.8.
|
|
|
|
@item -mshort-load-bytes
|
|
@kindex -mshort-load-bytes
|
|
Do not try to load half-words (eg @samp{short}s) by loading a word from
|
|
an unaligned address. For some targets the MMU is configured to trap
|
|
unaligned loads; use this option to generate code that is safe in these
|
|
environments.
|
|
|
|
@item -mno-short-load-bytes
|
|
@kindex -mno-short-load-bytes
|
|
Use unaligned word loads to load half-words (eg @samp{short}s). This
|
|
option produces more efficient code, but the MMU is sometimes configured
|
|
to trap these instructions.
|
|
|
|
@item -mshort-load-words
|
|
@kindex -mshort-load-words
|
|
This is a synonym for the @samp{-mno-short-load-bytes}.
|
|
|
|
@item -mno-short-load-words
|
|
@kindex -mno-short-load-words
|
|
This is a synonym for the @samp{-mshort-load-bytes}.
|
|
|
|
@item -mbsd
|
|
@kindex -mbsd
|
|
This option only applies to RISC iX. Emulate the native BSD-mode
|
|
compiler. This is the default if @samp{-ansi} is not specified.
|
|
|
|
@item -mxopen
|
|
@kindex -mxopen
|
|
This option only applies to RISC iX. Emulate the native X/Open-mode
|
|
compiler.
|
|
|
|
@item -mno-symrename
|
|
@kindex -mno-symrename
|
|
This option only applies to RISC iX. Do not run the assembler
|
|
post-processor, @samp{symrename}, after code has been assembled.
|
|
Normally it is necessary to modify some of the standard symbols in
|
|
preparation for linking with the RISC iX C library; this option
|
|
suppresses this pass. The post-processor is never run when the
|
|
compiler is built for cross-compilation.
|
|
|
|
@item -mcpu=<name>
|
|
@kindex -mcpu=
|
|
This specifies the name of the target ARM processor. GCC uses this name
|
|
to determine what kind of instructions it can use when generating
|
|
assembly code. Permissable names are: arm2, arm250, arm3, arm6, arm60,
|
|
arm600, arm610, arm620, arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi,
|
|
arm70, arm700, arm700i, arm710, arm710c, arm7100, arm7500, arm7500fe,
|
|
arm7tdmi, arm8, strongarm, strongarm110
|
|
|
|
@item -march=<name>
|
|
@kindex -march=
|
|
This specifies the name of the target ARM architecture. GCC uses this
|
|
name to determine what kind of instructions it can use when generating
|
|
assembly code. This option can be used in conjunction with or instead
|
|
of the @samp{-mcpu=} option. Permissable names are: armv2, armv2a,
|
|
armv3, armv3m, armv4, armv4t
|
|
|
|
@item -mfpe=<number>
|
|
@kindex -mfpe=
|
|
This specifes the version of the floating point emulation available on
|
|
the target. Permissable values are 2 and 3.
|
|
|
|
@item -mstructure-size-boundary=<n>
|
|
@kindex -mstructure-size-boundary
|
|
The size of all structures and unions will be rounded up to a multiple
|
|
of the number of bits set by this option. Permissable values are 8 and
|
|
32. The default value varies for different toolchains. For the COFF
|
|
targeted toolchain the default value is 8. Specifying the larger number
|
|
can produced faster, more efficient code, but can also increase the size
|
|
of the program. The two values are potentially incompatible. Code
|
|
compiled with one value cannot necessarily expect to work with code or
|
|
libraries compiled with the other value, if they exchange information
|
|
using structures or unions. Programmers are encouraged to use the 32
|
|
value as future versions of the toolchain may default to this value.
|
|
|
|
@end table
|
|
|
|
@node Thumb Options
|
|
@subsection Thumb Options
|
|
@cindex Thumb Options
|
|
|
|
@table @code
|
|
|
|
@item -mthumb-interwork
|
|
@kindex -mthumb-interwork
|
|
@kindex -mno-thumb-interwork
|
|
Generate code which supports calling between the THUMB and ARM
|
|
instruction sets. Without this option the two instruction sets cannot
|
|
be reliably used inside one program. The default is
|
|
@samp{-mno-thumb-interwork}, since slightly smaller code is generated
|
|
with this option.
|
|
|
|
@item -mtpcs-frame
|
|
@kindex -mtpcs-frame
|
|
@kindex -mno-tpcs-frame
|
|
Generate a stack frame that is compliant with the Thumb Procedure Call
|
|
Standard for all non-leaf functions. (A leaf function is one that does
|
|
not call any other functions). The default is @samp{-mno-apcs-frame}.
|
|
|
|
@item -mtpcs-leaf-frame
|
|
@kindex -mtpcs-leaf-frame
|
|
@kindex -mno-tpcs-leaf-frame
|
|
Generate a stack frame that is compliant with the Thumb Procedure Call
|
|
Standard for all leaf functions. (A leaf function is one that does
|
|
not call any other functions). The default is @samp{-mno-apcs-leaf-frame}.
|
|
|
|
@item -mlittle-endian
|
|
@kindex -mlittle-endian
|
|
Generate code for a processor running in little-endian mode. This is
|
|
the default for all standard configurations.
|
|
|
|
@item -mbig-endian
|
|
@kindex -mbig-endian
|
|
Generate code for a processor running in big-endian mode.
|
|
|
|
@item -mstructure-size-boundary=<n>
|
|
@kindex -mstructure-size-boundary
|
|
The size of all structures and unions will be rounded up to a multiple
|
|
of the number of bits set by this option. Permissable values are 8 and
|
|
32. The default value varies for different toolchains. For the COFF
|
|
targeted toolchain the default value is 8. Specifying the larger number
|
|
can produced faster, more efficient code, but can also increase the size
|
|
of the program. The two values are potentially incompatible. Code
|
|
compiled with one value cannot necessarily expect to work with code or
|
|
libraries compiled with the other value, if they exchange information
|
|
using structures or unions. Programmers are encouraged to use the 32
|
|
value as future versions of the toolchain may default to this value.
|
|
|
|
@end table
|
|
|
|
@node MN10200 Options
|
|
@subsection MN10200 Options
|
|
@cindex MN10200 options
|
|
These @samp{-m} options are defined for Matsushita MN10200 architectures:
|
|
@table @code
|
|
|
|
@item -mrelax
|
|
Indicate to the linker that it should perform a relaxation optimization pass
|
|
to shorten branches, calls and absolute memory addresses. This option only
|
|
has an effect when used on the command line for the final link step.
|
|
|
|
This option makes symbolic debugging impossible.
|
|
@end table
|
|
|
|
@node MN10300 Options
|
|
@subsection MN10300 Options
|
|
@cindex MN10300 options
|
|
These @samp{-m} options are defined for Matsushita MN10300 architectures:
|
|
|
|
@table @code
|
|
@item -mmult-bug
|
|
Generate code to avoid bugs in the multiply instructions for the MN10300
|
|
processors. This is the default.
|
|
|
|
@item -mno-mult-bug
|
|
Do not generate code to avoid bugs in the multiply instructions for the
|
|
MN10300 processors.
|
|
|
|
@item -mrelax
|
|
Indicate to the linker that it should perform a relaxation optimization pass
|
|
to shorten branches, calls and absolute memory addresses. This option only
|
|
has an effect when used on the command line for the final link step.
|
|
|
|
This option makes symbolic debugging impossible.
|
|
@end table
|
|
|
|
|
|
@node M32R/D Options
|
|
@subsection M32R/D Options
|
|
@cindex M32R/D options
|
|
|
|
These @samp{-m} options are defined for Mitsubishi M32R/D architectures:
|
|
|
|
@table @code
|
|
@item -mcode-model=small
|
|
Assume all objects live in the lower 16MB of memory (so that their addresses
|
|
can be loaded with the @code{ld24} instruction), and assume all subroutines
|
|
are reachable with the @code{bl} instruction.
|
|
This is the default.
|
|
|
|
The addressability of a particular object can be set with the
|
|
@code{model} attribute.
|
|
|
|
@item -mcode-model=medium
|
|
Assume objects may be anywhere in the 32 bit address space (the compiler
|
|
will generate @code{seth/add3} instructions to load their addresses), and
|
|
assume all subroutines are reachable with the @code{bl} instruction.
|
|
|
|
@item -mcode-model=large
|
|
Assume objects may be anywhere in the 32 bit address space (the compiler
|
|
will generate @code{seth/add3} instructions to load their addresses), and
|
|
assume subroutines may not be reachable with the @code{bl} instruction
|
|
(the compiler will generate the much slower @code{seth/add3/jl}
|
|
instruction sequence).
|
|
|
|
@item -msdata=none
|
|
Disable use of the small data area. Variables will be put into
|
|
one of @samp{.data}, @samp{bss}, or @samp{.rodata} (unless the
|
|
@code{section} attribute has been specified).
|
|
This is the default.
|
|
|
|
The small data area consists of sections @samp{.sdata} and @samp{.sbss}.
|
|
Objects may be explicitly put in the small data area with the
|
|
@code{section} attribute using one of these sections.
|
|
|
|
@item -msdata=sdata
|
|
Put small global and static data in the small data area, but do not
|
|
generate special code to reference them.
|
|
|
|
@item -msdata=use
|
|
Put small global and static data in the small data area, and generate
|
|
special instructions to reference them.
|
|
|
|
@item -G @var{num}
|
|
@cindex smaller data references
|
|
Put global and static objects less than or equal to @var{num} bytes
|
|
into the small data or bss sections instead of the normal data or bss
|
|
sections. The default value of @var{num} is 8.
|
|
The @samp{-msdata} option must be set to one of @samp{sdata} or @samp{use}
|
|
for this option to have any effect.
|
|
|
|
All modules should be compiled with the same @samp{-G @var{num}} value.
|
|
Compiling with different values of @var{num} may or may not work; if it
|
|
doesn't the linker will give an error message - incorrect code will not be
|
|
generated.
|
|
|
|
@end table
|
|
|
|
@node M88K Options
|
|
@subsection M88K Options
|
|
@cindex M88k options
|
|
|
|
These @samp{-m} options are defined for Motorola 88k architectures:
|
|
|
|
@table @code
|
|
@item -m88000
|
|
@kindex -m88000
|
|
Generate code that works well on both the m88100 and the
|
|
m88110.
|
|
|
|
@item -m88100
|
|
@kindex -m88100
|
|
Generate code that works best for the m88100, but that also
|
|
runs on the m88110.
|
|
|
|
@item -m88110
|
|
@kindex -m88110
|
|
Generate code that works best for the m88110, and may not run
|
|
on the m88100.
|
|
|
|
@item -mbig-pic
|
|
@kindex -mbig-pic
|
|
Obsolete option to be removed from the next revision.
|
|
Use @samp{-fPIC}.
|
|
|
|
@item -midentify-revision
|
|
@kindex -midentify-revision
|
|
@kindex ident
|
|
@cindex identifying source, compiler (88k)
|
|
Include an @code{ident} directive in the assembler output recording the
|
|
source file name, compiler name and version, timestamp, and compilation
|
|
flags used.
|
|
|
|
@item -mno-underscores
|
|
@kindex -mno-underscores
|
|
@cindex underscores, avoiding (88k)
|
|
In assembler output, emit symbol names without adding an underscore
|
|
character at the beginning of each name. The default is to use an
|
|
underscore as prefix on each name.
|
|
|
|
@item -mocs-debug-info
|
|
@itemx -mno-ocs-debug-info
|
|
@kindex -mocs-debug-info
|
|
@kindex -mno-ocs-debug-info
|
|
@cindex OCS (88k)
|
|
@cindex debugging, 88k OCS
|
|
Include (or omit) additional debugging information (about registers used
|
|
in each stack frame) as specified in the 88open Object Compatibility
|
|
Standard, ``OCS''. This extra information allows debugging of code that
|
|
has had the frame pointer eliminated. The default for DG/UX, SVr4, and
|
|
Delta 88 SVr3.2 is to include this information; other 88k configurations
|
|
omit this information by default.
|
|
|
|
@item -mocs-frame-position
|
|
@kindex -mocs-frame-position
|
|
@cindex register positions in frame (88k)
|
|
When emitting COFF debugging information for automatic variables and
|
|
parameters stored on the stack, use the offset from the canonical frame
|
|
address, which is the stack pointer (register 31) on entry to the
|
|
function. The DG/UX, SVr4, Delta88 SVr3.2, and BCS configurations use
|
|
@samp{-mocs-frame-position}; other 88k configurations have the default
|
|
@samp{-mno-ocs-frame-position}.
|
|
|
|
@item -mno-ocs-frame-position
|
|
@kindex -mno-ocs-frame-position
|
|
@cindex register positions in frame (88k)
|
|
When emitting COFF debugging information for automatic variables and
|
|
parameters stored on the stack, use the offset from the frame pointer
|
|
register (register 30). When this option is in effect, the frame
|
|
pointer is not eliminated when debugging information is selected by the
|
|
-g switch.
|
|
|
|
@item -moptimize-arg-area
|
|
@itemx -mno-optimize-arg-area
|
|
@kindex -moptimize-arg-area
|
|
@kindex -mno-optimize-arg-area
|
|
@cindex arguments in frame (88k)
|
|
Control how function arguments are stored in stack frames.
|
|
@samp{-moptimize-arg-area} saves space by optimizing them, but this
|
|
conflicts with the 88open specifications. The opposite alternative,
|
|
@samp{-mno-optimize-arg-area}, agrees with 88open standards. By default
|
|
GNU CC does not optimize the argument area.
|
|
|
|
@item -mshort-data-@var{num}
|
|
@kindex -mshort-data-@var{num}
|
|
@cindex smaller data references (88k)
|
|
@cindex r0-relative references (88k)
|
|
Generate smaller data references by making them relative to @code{r0},
|
|
which allows loading a value using a single instruction (rather than the
|
|
usual two). You control which data references are affected by
|
|
specifying @var{num} with this option. For example, if you specify
|
|
@samp{-mshort-data-512}, then the data references affected are those
|
|
involving displacements of less than 512 bytes.
|
|
@samp{-mshort-data-@var{num}} is not effective for @var{num} greater
|
|
than 64k.
|
|
|
|
@item -mserialize-volatile
|
|
@kindex -mserialize-volatile
|
|
@itemx -mno-serialize-volatile
|
|
@kindex -mno-serialize-volatile
|
|
@cindex sequential consistency on 88k
|
|
Do, or don't, generate code to guarantee sequential consistency
|
|
of volatile memory references. By default, consistency is
|
|
guaranteed.
|
|
|
|
The order of memory references made by the MC88110 processor does
|
|
not always match the order of the instructions requesting those
|
|
references. In particular, a load instruction may execute before
|
|
a preceding store instruction. Such reordering violates
|
|
sequential consistency of volatile memory references, when there
|
|
are multiple processors. When consistency must be guaranteed,
|
|
GNU C generates special instructions, as needed, to force
|
|
execution in the proper order.
|
|
|
|
The MC88100 processor does not reorder memory references and so
|
|
always provides sequential consistency. However, by default, GNU
|
|
C generates the special instructions to guarantee consistency
|
|
even when you use @samp{-m88100}, so that the code may be run on an
|
|
MC88110 processor. If you intend to run your code only on the
|
|
MC88100 processor, you may use @samp{-mno-serialize-volatile}.
|
|
|
|
The extra code generated to guarantee consistency may affect the
|
|
performance of your application. If you know that you can safely
|
|
forgo this guarantee, you may use @samp{-mno-serialize-volatile}.
|
|
|
|
@item -msvr4
|
|
@itemx -msvr3
|
|
@kindex -msvr4
|
|
@kindex -msvr3
|
|
@cindex assembler syntax, 88k
|
|
@cindex SVr4
|
|
Turn on (@samp{-msvr4}) or off (@samp{-msvr3}) compiler extensions
|
|
related to System V release 4 (SVr4). This controls the following:
|
|
|
|
@enumerate
|
|
@item
|
|
Which variant of the assembler syntax to emit.
|
|
@item
|
|
@samp{-msvr4} makes the C preprocessor recognize @samp{#pragma weak}
|
|
that is used on System V release 4.
|
|
@item
|
|
@samp{-msvr4} makes GNU CC issue additional declaration directives used in
|
|
SVr4.
|
|
@end enumerate
|
|
|
|
@samp{-msvr4} is the default for the m88k-motorola-sysv4 and
|
|
m88k-dg-dgux m88k configurations. @samp{-msvr3} is the default for all
|
|
other m88k configurations.
|
|
|
|
@item -mversion-03.00
|
|
@kindex -mversion-03.00
|
|
This option is obsolete, and is ignored.
|
|
@c ??? which asm syntax better for GAS? option there too?
|
|
|
|
@item -mno-check-zero-division
|
|
@itemx -mcheck-zero-division
|
|
@kindex -mno-check-zero-division
|
|
@kindex -mcheck-zero-division
|
|
@cindex zero division on 88k
|
|
Do, or don't, generate code to guarantee that integer division by
|
|
zero will be detected. By default, detection is guaranteed.
|
|
|
|
Some models of the MC88100 processor fail to trap upon integer
|
|
division by zero under certain conditions. By default, when
|
|
compiling code that might be run on such a processor, GNU C
|
|
generates code that explicitly checks for zero-valued divisors
|
|
and traps with exception number 503 when one is detected. Use of
|
|
mno-check-zero-division suppresses such checking for code
|
|
generated to run on an MC88100 processor.
|
|
|
|
GNU C assumes that the MC88110 processor correctly detects all
|
|
instances of integer division by zero. When @samp{-m88110} is
|
|
specified, both @samp{-mcheck-zero-division} and
|
|
@samp{-mno-check-zero-division} are ignored, and no explicit checks for
|
|
zero-valued divisors are generated.
|
|
|
|
@item -muse-div-instruction
|
|
@kindex -muse-div-instruction
|
|
@cindex divide instruction, 88k
|
|
Use the div instruction for signed integer division on the
|
|
MC88100 processor. By default, the div instruction is not used.
|
|
|
|
On the MC88100 processor the signed integer division instruction
|
|
div) traps to the operating system on a negative operand. The
|
|
operating system transparently completes the operation, but at a
|
|
large cost in execution time. By default, when compiling code
|
|
that might be run on an MC88100 processor, GNU C emulates signed
|
|
integer division using the unsigned integer division instruction
|
|
divu), thereby avoiding the large penalty of a trap to the
|
|
operating system. Such emulation has its own, smaller, execution
|
|
cost in both time and space. To the extent that your code's
|
|
important signed integer division operations are performed on two
|
|
nonnegative operands, it may be desirable to use the div
|
|
instruction directly.
|
|
|
|
On the MC88110 processor the div instruction (also known as the
|
|
divs instruction) processes negative operands without trapping to
|
|
the operating system. When @samp{-m88110} is specified,
|
|
@samp{-muse-div-instruction} is ignored, and the div instruction is used
|
|
for signed integer division.
|
|
|
|
Note that the result of dividing INT_MIN by -1 is undefined. In
|
|
particular, the behavior of such a division with and without
|
|
@samp{-muse-div-instruction} may differ.
|
|
|
|
@item -mtrap-large-shift
|
|
@itemx -mhandle-large-shift
|
|
@kindex -mtrap-large-shift
|
|
@kindex -mhandle-large-shift
|
|
@cindex bit shift overflow (88k)
|
|
@cindex large bit shifts (88k)
|
|
Include code to detect bit-shifts of more than 31 bits; respectively,
|
|
trap such shifts or emit code to handle them properly. By default GNU CC
|
|
makes no special provision for large bit shifts.
|
|
|
|
@item -mwarn-passed-structs
|
|
@kindex -mwarn-passed-structs
|
|
@cindex structure passing (88k)
|
|
Warn when a function passes a struct as an argument or result.
|
|
Structure-passing conventions have changed during the evolution of the C
|
|
language, and are often the source of portability problems. By default,
|
|
GNU CC issues no such warning.
|
|
@end table
|
|
|
|
@node RS/6000 and PowerPC Options
|
|
@subsection IBM RS/6000 and PowerPC Options
|
|
@cindex RS/6000 and PowerPC Options
|
|
@cindex IBM RS/6000 and PowerPC Options
|
|
|
|
These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
|
|
@table @code
|
|
@item -mpower
|
|
@itemx -mno-power
|
|
@itemx -mpower2
|
|
@itemx -mno-power2
|
|
@itemx -mpowerpc
|
|
@itemx -mno-powerpc
|
|
@itemx -mpowerpc-gpopt
|
|
@itemx -mno-powerpc-gpopt
|
|
@itemx -mpowerpc-gfxopt
|
|
@itemx -mno-powerpc-gfxopt
|
|
@itemx -mpowerpc64
|
|
@itemx -mno-powerpc64
|
|
@kindex -mpower
|
|
@kindex -mpower2
|
|
@kindex -mpowerpc
|
|
@kindex -mpowerpc-gpopt
|
|
@kindex -mpowerpc-gfxopt
|
|
@kindex -mpowerpc64
|
|
GNU CC supports two related instruction set architectures for the
|
|
RS/6000 and PowerPC. The @dfn{POWER} instruction set are those
|
|
instructions supported by the @samp{rios} chip set used in the original
|
|
RS/6000 systems and the @dfn{PowerPC} instruction set is the
|
|
architecture of the Motorola MPC5xx, MPC6xx, MPC8xx microprocessors, and
|
|
the IBM 4xx microprocessors.
|
|
|
|
Neither architecture is a subset of the other. However there is a
|
|
large common subset of instructions supported by both. An MQ
|
|
register is included in processors supporting the POWER architecture.
|
|
|
|
You use these options to specify which instructions are available on the
|
|
processor you are using. The default value of these options is
|
|
determined when configuring GNU CC. Specifying the
|
|
@samp{-mcpu=@var{cpu_type}} overrides the specification of these
|
|
options. We recommend you use the @samp{-mcpu=@var{cpu_type}} option
|
|
rather than the options listed above.
|
|
|
|
The @samp{-mpower} option allows GNU CC to generate instructions that
|
|
are found only in the POWER architecture and to use the MQ register.
|
|
Specifying @samp{-mpower2} implies @samp{-power} and also allows GNU CC
|
|
to generate instructions that are present in the POWER2 architecture but
|
|
not the original POWER architecture.
|
|
|
|
The @samp{-mpowerpc} option allows GNU CC to generate instructions that
|
|
are found only in the 32-bit subset of the PowerPC architecture.
|
|
Specifying @samp{-mpowerpc-gpopt} implies @samp{-mpowerpc} and also allows
|
|
GNU CC to use the optional PowerPC architecture instructions in the
|
|
General Purpose group, including floating-point square root. Specifying
|
|
@samp{-mpowerpc-gfxopt} implies @samp{-mpowerpc} and also allows GNU CC to
|
|
use the optional PowerPC architecture instructions in the Graphics
|
|
group, including floating-point select.
|
|
|
|
The @samp{-mpowerpc64} option allows GNU CC to generate the additional
|
|
64-bit instructions that are found in the full PowerPC64 architecture
|
|
and to treat GPRs as 64-bit, doubleword quantities. GNU CC defaults to
|
|
@samp{-mno-powerpc64}.
|
|
|
|
If you specify both @samp{-mno-power} and @samp{-mno-powerpc}, GNU CC
|
|
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 @samp{-mpower} and @samp{-mpowerpc}
|
|
permits GNU CC to use any instruction from either architecture and to
|
|
allow use of the MQ register; specify this for the Motorola MPC601.
|
|
|
|
@item -mnew-mnemonics
|
|
@itemx -mold-mnemonics
|
|
@kindex -mnew-mnemonics
|
|
@kindex -mold-mnemonics
|
|
Select which mnemonics to use in the generated assembler code.
|
|
@samp{-mnew-mnemonics} requests output that uses the assembler mnemonics
|
|
defined for the PowerPC architecture, while @samp{-mold-mnemonics}
|
|
requests the assembler mnemonics defined for the POWER architecture.
|
|
Instructions defined in only one architecture have only one mnemonic;
|
|
GNU CC uses that mnemonic irrespective of which of these options is
|
|
specified.
|
|
|
|
GNU CC defaults to the mnemonics appropriate for the architecture in
|
|
use. Specifying @samp{-mcpu=@var{cpu_type}} sometimes overrides the
|
|
value of these option. Unless you are building a cross-compiler, you
|
|
should normally not specify either @samp{-mnew-mnemonics} or
|
|
@samp{-mold-mnemonics}, but should instead accept the default.
|
|
|
|
@item -mcpu=@var{cpu_type}
|
|
@kindex -mcpu
|
|
Set architecture type, register usage, choice of mnemonics, and
|
|
instruction scheduling parameters for machine type @var{cpu_type}.
|
|
Supported values for @var{cpu_type} are @samp{rs6000}, @samp{rios1},
|
|
@samp{rios2}, @samp{rsc}, @samp{601}, @samp{602}, @samp{603},
|
|
@samp{603e}, @samp{604}, @samp{604e}, @samp{620}, @samp{power},
|
|
@samp{power2}, @samp{powerpc}, @samp{403}, @samp{505}, @samp{801},
|
|
@samp{821}, @samp{823}, and @samp{860} and @samp{common}.
|
|
@samp{-mcpu=power}, @samp{-mcpu=power2}, and @samp{-mcpu=powerpc}
|
|
specify generic POWER, POWER2 and pure PowerPC (i.e., not MPC601)
|
|
architecture machine types, with an appropriate, generic processor model
|
|
assumed for scheduling purposes.@refill
|
|
|
|
@c overfull hbox here --bob 22 jul96
|
|
@c original text between ignore ... end ignore
|
|
@ignore
|
|
Specifying any of the @samp{-mcpu=rios1}, @samp{-mcpu=rios2},
|
|
@samp{-mcpu=rsc}, @samp{-mcpu=power}, or @samp{-mcpu=power2} options
|
|
enables the @samp{-mpower} option and disables the @samp{-mpowerpc}
|
|
option; @samp{-mcpu=601} enables both the @samp{-mpower} and
|
|
@samp{-mpowerpc} options; all of @samp{-mcpu=602}, @samp{-mcpu=603},
|
|
@samp{-mcpu=603e}, @samp{-mcpu=604}, @samp{-mcpu=604e},
|
|
@samp{-mcpu=620}, @samp{-mcpu=403}, @samp{-mcpu=505}, @samp{-mcpu=801},
|
|
@samp{-mcpu=821}, @samp{-mcpu=823}, @samp{-mcpu=860} and
|
|
@samp{-mcpu=powerpc} enable the @samp{-mpowerpc} option and disable the
|
|
@samp{-mpower} option; @samp{-mcpu=common} disables both the
|
|
@samp{-mpower} and @samp{-mpowerpc} options.@refill
|
|
@end ignore
|
|
@c changed paragraph
|
|
Specifying any of the following options:
|
|
@samp{-mcpu=rios1}, @samp{-mcpu=rios2}, @samp{-mcpu=rsc},
|
|
@samp{-mcpu=power}, or @samp{-mcpu=power2}
|
|
enables the @samp{-mpower} option and disables the @samp{-mpowerpc} option;
|
|
@samp{-mcpu=601} enables both the @samp{-mpower} and @samp{-mpowerpc} options.
|
|
All of @samp{-mcpu=602}, @samp{-mcpu=603}, @samp{-mcpu=603e},
|
|
@samp{-mcpu=604}, @samp{-mcpu=620},
|
|
enable the @samp{-mpowerpc} option and disable the @samp{-mpower} option.
|
|
Exactly similarly, all of @samp{-mcpu=403},
|
|
@samp{-mcpu=505}, @samp{-mcpu=821}, @samp{-mcpu=860} and @samp{-mcpu=powerpc}
|
|
enable the @samp{-mpowerpc} option and disable the @samp{-mpower} option.
|
|
@samp{-mcpu=common} disables both the
|
|
@samp{-mpower} and @samp{-mpowerpc} options.@refill
|
|
@c end changes to prevent overfull hboxes
|
|
|
|
AIX versions 4 or greater selects @samp{-mcpu=common} by default, so
|
|
that code will operate on all members of the RS/6000 and PowerPC
|
|
families. In that case, GNU CC 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. GNU CC assumes a generic
|
|
processor model for scheduling purposes.
|
|
|
|
Specifying any of the options @samp{-mcpu=rios1}, @samp{-mcpu=rios2},
|
|
@samp{-mcpu=rsc}, @samp{-mcpu=power}, or @samp{-mcpu=power2} also
|
|
disables the @samp{new-mnemonics} option. Specifying @samp{-mcpu=601},
|
|
@samp{-mcpu=602}, @samp{-mcpu=603}, @samp{-mcpu=603e}, @samp{-mcpu=604},
|
|
@samp{620}, @samp{403}, or @samp{-mcpu=powerpc} also enables the
|
|
@samp{new-mnemonics} option.@refill
|
|
|
|
Specifying @samp{-mcpu=403}, @samp{-mcpu=821}, or @samp{-mcpu=860} also
|
|
enables the @samp{-msoft-float} option.
|
|
|
|
@item -mtune=@var{cpu_type}
|
|
Set the instruction scheduling parameters for machine type
|
|
@var{cpu_type}, but do not set the architecture type, register usage,
|
|
choice of mnemonics like @samp{-mcpu=}@var{cpu_type} would. The same
|
|
values for @var{cpu_type} are used for @samp{-mtune=}@var{cpu_type} as
|
|
for @samp{-mcpu=}@var{cpu_type}. The @samp{-mtune=}@var{cpu_type}
|
|
option overrides the @samp{-mcpu=}@var{cpu_type} option in terms of
|
|
instruction scheduling parameters.
|
|
|
|
@item -mfull-toc
|
|
@itemx -mno-fp-in-toc
|
|
@itemx -mno-sum-in-toc
|
|
@itemx -mminimal-toc
|
|
@kindex -mminimal-toc
|
|
Modify generation of the TOC (Table Of Contents), which is created for
|
|
every executable file. The @samp{-mfull-toc} option is selected by
|
|
default. In that case, GNU CC will allocate at least one TOC entry for
|
|
each unique non-automatic variable reference in your program. GNU CC
|
|
will also place floating-point constants in the TOC. However, only
|
|
16,384 entries are available in the TOC.
|
|
|
|
If you receive a linker error message that saying you have overflowed
|
|
the available TOC space, you can reduce the amount of TOC space used
|
|
with the @samp{-mno-fp-in-toc} and @samp{-mno-sum-in-toc} options.
|
|
@samp{-mno-fp-in-toc} prevents GNU CC from putting floating-point
|
|
constants in the TOC and @samp{-mno-sum-in-toc} forces GNU CC 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 GNU CC 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 @samp{-mminimal-toc} instead. This option causes
|
|
GNU CC to make only one TOC entry for every file. When you specify this
|
|
option, GNU CC 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. @refill
|
|
|
|
@item -maix64
|
|
@itemx -maix32
|
|
@kindex -maix64
|
|
@kindex -maix32
|
|
Enable AIX 64-bit ABI and calling convention: 64-bit pointers, 64-bit
|
|
@code{long} type, and the infrastructure needed to support them.
|
|
Specifying @samp{-maix64} implies @samp{-mpowerpc64} and
|
|
@samp{-mpowerpc}, while @samp{-maix32} disables the 64-bit ABI and
|
|
implies @samp{-mno-powerpc64}. GNU CC defaults to @samp{-maix32}.
|
|
|
|
@item -mxl-call
|
|
@itemx -mno-xl-call
|
|
@kindex -mxl-call
|
|
On AIX, pass floating-point arguments to prototyped functions beyond the
|
|
register save area (RSA) on the stack in addition to argument FPRs. The
|
|
AIX calling convention was extended but not initially documented to
|
|
handle an obscure K&R C case of calling a function that takes the
|
|
address of its arguments with fewer arguments than declared. AIX XL
|
|
compilers access floating point arguments which do not fit in the
|
|
RSA from the stack when a subroutine is compiled without
|
|
optimization. Because always storing floating-point arguments on the
|
|
stack is inefficient and rarely needed, this option is not enabled by
|
|
default and only is necessary when calling subroutines compiled by AIX
|
|
XL compilers without optimization.
|
|
|
|
@item -mthreads
|
|
@kindex -mthreads
|
|
Support @dfn{AIX Threads}. Link an application written to use
|
|
@dfn{pthreads} with special libraries and startup code to enable the
|
|
application to run.
|
|
|
|
@item -mpe
|
|
@kindex -mpe
|
|
Support @dfn{IBM RS/6000 SP} @dfn{Parallel Environment} (PE). Link an
|
|
application written to use message passing with special startup code to
|
|
enable the application to run. The system must have PE installed in the
|
|
standard location (@file{/usr/lpp/ppe.poe/}), or the @file{specs} file
|
|
must be overridden with the @samp{-specs=} option to specify the
|
|
appropriate directory location. The Parallel Environment does not
|
|
support threads, so the @samp{-mpe} option and the @samp{-mthreads}
|
|
option are incompatible.
|
|
|
|
@item -msoft-float
|
|
@itemx -mhard-float
|
|
@kindex -msoft-float
|
|
Generate code that does not use (uses) the floating-point register set.
|
|
Software floating point emulation is provided if you use the
|
|
@samp{-msoft-float} option, and pass the option to GNU CC when linking.
|
|
|
|
@item -mmultiple
|
|
@itemx -mno-multiple
|
|
Generate code that uses (does not use) the load multiple word
|
|
instructions and the store multiple word instructions. These
|
|
instructions are generated by default on POWER systems, and not
|
|
generated on PowerPC systems. Do not use @samp{-mmultiple} on little
|
|
endian PowerPC systems, since those instructions do not work when the
|
|
processor is in little endian mode.
|
|
|
|
@item -mstring
|
|
@itemx -mno-string
|
|
@kindex -mstring
|
|
Generate code that uses (does not use) the load string instructions and the
|
|
store string word instructions to save multiple registers and do small block
|
|
moves. These instructions are generated by default on POWER systems, and not
|
|
generated on PowerPC systems. Do not use @samp{-mstring} on little endian
|
|
PowerPC systems, since those instructions do not work when the processor is in
|
|
little endian mode.
|
|
|
|
@item -mupdate
|
|
@itemx -mno-update
|
|
@kindex -mupdate
|
|
Generate code that uses (does not use) the load or store instructions
|
|
that update the base register to the address of the calculated memory
|
|
location. These instructions are generated by default. If you use
|
|
@samp{-mno-update}, there is a small window between the time that the
|
|
stack pointer is updated and the address of the previous frame is
|
|
stored, which means code that walks the stack frame across interrupts or
|
|
signals may get corrupted data.
|
|
|
|
@item -mfused-madd
|
|
@itemx -mno-fused-madd
|
|
@kindex -mfused-madd
|
|
Generate code that uses (does not use) the floating point multiply and
|
|
accumulate instructions. These instructions are generated by default if
|
|
hardware floating is used.
|
|
|
|
@item -mno-bit-align
|
|
@itemx -mbit-align
|
|
@kindex -mbit-align
|
|
On System V.4 and embedded PowerPC systems do not (do) force structures
|
|
and unions that contain bit fields to be aligned to the base type of the
|
|
bit field.
|
|
|
|
For example, by default a structure containing nothing but 8
|
|
@code{unsigned} bitfields of length 1 would be aligned to a 4 byte
|
|
boundary and have a size of 4 bytes. By using @samp{-mno-bit-align},
|
|
the structure would be aligned to a 1 byte boundary and be one byte in
|
|
size.
|
|
|
|
@item -mno-strict-align
|
|
@itemx -mstrict-align
|
|
@kindex -mstrict-align
|
|
On System V.4 and embedded PowerPC systems do not (do) assume that
|
|
unaligned memory references will be handled by the system.
|
|
|
|
@item -mrelocatable
|
|
@itemx -mno-relocatable
|
|
@kindex -mrelocatable
|
|
On embedded PowerPC systems generate code that allows (does not allow)
|
|
the program to be relocated to a different address at runtime. If you
|
|
use @samp{-mrelocatable} on any module, all objects linked together must
|
|
be compiled with @samp{-mrelocatable} or @samp{-mrelocatable-lib}.
|
|
|
|
@item -mrelocatable-lib
|
|
@itemx -mno-relocatable-lib
|
|
On embedded PowerPC systems generate code that allows (does not allow)
|
|
the program to be relocated to a different address at runtime. Modules
|
|
compiled with @samp{-mrelocatable-lib} can be linked with either modules
|
|
compiled without @samp{-mrelocatable} and @samp{-mrelocatable-lib} or
|
|
with modules compiled with the @samp{-mrelocatable} options.
|
|
|
|
@item -mno-toc
|
|
@itemx -mtoc
|
|
On System V.4 and embedded PowerPC systems do not (do) assume that
|
|
register 2 contains a pointer to a global area pointing to the addresses
|
|
used in the program.
|
|
|
|
@item -mlittle
|
|
@itemx -mlittle-endian
|
|
On System V.4 and embedded PowerPC systems compile code for the
|
|
processor in little endian mode. The @samp{-mlittle-endian} option is
|
|
the same as @samp{-mlittle}.
|
|
|
|
@item -mbig
|
|
@itemx -mbig-endian
|
|
On System V.4 and embedded PowerPC systems compile code for the
|
|
processor in big endian mode. The @samp{-mbig-endian} option is
|
|
the same as @samp{-mbig}.
|
|
|
|
@item -mcall-sysv
|
|
On System V.4 and embedded PowerPC systems compile code using calling
|
|
conventions that adheres to the March 1995 draft of the System V
|
|
Application Binary Interface, PowerPC processor supplement. This is the
|
|
default unless you configured GCC using @samp{powerpc-*-eabiaix}.
|
|
|
|
@item -mcall-sysv-eabi
|
|
Specify both @samp{-mcall-sysv} and @samp{-meabi} options.
|
|
|
|
@item -mcall-sysv-noeabi
|
|
Specify both @samp{-mcall-sysv} and @samp{-mno-eabi} options.
|
|
|
|
@item -mcall-aix
|
|
On System V.4 and embedded PowerPC systems compile code using calling
|
|
conventions that are similar to those used on AIX. This is the
|
|
default if you configured GCC using @samp{powerpc-*-eabiaix}.
|
|
|
|
@item -mcall-solaris
|
|
On System V.4 and embedded PowerPC systems compile code for the Solaris
|
|
operating system.
|
|
|
|
@item -mcall-linux
|
|
On System V.4 and embedded PowerPC systems compile code for the
|
|
Linux-based GNU system.
|
|
|
|
@item -mprototype
|
|
@itemx -mno-prototype
|
|
On System V.4 and embedded PowerPC systems assume that all calls to
|
|
variable argument functions are properly prototyped. Otherwise, the
|
|
compiler must insert an instruction before every non prototyped call to
|
|
set or clear bit 6 of the condition code register (@var{CR}) to
|
|
indicate whether floating point values were passed in the floating point
|
|
registers in case the function takes a variable arguments. With
|
|
@samp{-mprototype}, only calls to prototyped variable argument functions
|
|
will set or clear the bit.
|
|
|
|
@item -msim
|
|
On embedded PowerPC systems, assume that the startup module is called
|
|
@file{sim-crt0.o} and that the standard C libraries are @file{libsim.a} and
|
|
@file{libc.a}. This is the default for @samp{powerpc-*-eabisim}.
|
|
configurations.
|
|
|
|
@item -mmvme
|
|
On embedded PowerPC systems, assume that the startup module is called
|
|
@file{crt0.o} and the standard C libraries are @file{libmvme.a} and
|
|
@file{libc.a}.
|
|
|
|
@item -mads
|
|
On embedded PowerPC systems, assume that the startup module is called
|
|
@file{crt0.o} and the standard C libraries are @file{libads.a} and
|
|
@file{libc.a}.
|
|
|
|
@item -myellowknife
|
|
On embedded PowerPC systems, assume that the startup module is called
|
|
@file{crt0.o} and the standard C libraries are @file{libyk.a} and
|
|
@file{libc.a}.
|
|
|
|
@item -memb
|
|
On embedded PowerPC systems, set the @var{PPC_EMB} bit in the ELF flags
|
|
header to indicate that @samp{eabi} extended relocations are used.
|
|
|
|
@item -meabi
|
|
@itemx -mno-eabi
|
|
On System V.4 and embedded PowerPC systems do (do not) adhere to the
|
|
Embedded Applications Binary Interface (eabi) which is a set of
|
|
modifications to the System V.4 specifications. Selecting @code{-meabi}
|
|
means that the stack is aligned to an 8 byte boundary, a function
|
|
@code{__eabi} is called to from @code{main} to set up the eabi
|
|
environment, and the @samp{-msdata} option can use both @code{r2} and
|
|
@code{r13} to point to two separate small data areas. Selecting
|
|
@code{-mno-eabi} means that the stack is aligned to a 16 byte boundary,
|
|
do not call an initialization function from @code{main}, and the
|
|
@samp{-msdata} option will only use @code{r13} to point to a single
|
|
small data area. The @samp{-meabi} option is on by default if you
|
|
configured GCC using one of the @samp{powerpc*-*-eabi*} options.
|
|
|
|
@item -msdata=eabi
|
|
On System V.4 and embedded PowerPC systems, put small initialized
|
|
@code{const} global and static data in the @samp{.sdata2} section, which
|
|
is pointed to by register @code{r2}. Put small initialized
|
|
non-@code{const} global and static data in the @samp{.sdata} section,
|
|
which is pointed to by register @code{r13}. Put small uninitialized
|
|
global and static data in the @samp{.sbss} section, which is adjacent to
|
|
the @samp{.sdata} section. The @samp{-msdata=eabi} option is
|
|
incompatible with the @samp{-mrelocatable} option. The
|
|
@samp{-msdata=eabi} option also sets the @samp{-memb} option.
|
|
|
|
@item -msdata=sysv
|
|
On System V.4 and embedded PowerPC systems, put small global and static
|
|
data in the @samp{.sdata} section, which is pointed to by register
|
|
@code{r13}. Put small uninitialized global and static data in the
|
|
@samp{.sbss} section, which is adjacent to the @samp{.sdata} section.
|
|
The @samp{-msdata=sysv} option is incompatible with the
|
|
@samp{-mrelocatable} option.
|
|
|
|
@item -msdata=default
|
|
@itemx -msdata
|
|
On System V.4 and embedded PowerPC systems, if @samp{-meabi} is used,
|
|
compile code the same as @samp{-msdata=eabi}, otherwise compile code the
|
|
same as @samp{-msdata=sysv}.
|
|
|
|
@item -msdata-data
|
|
On System V.4 and embedded PowerPC systems, put small global and static
|
|
data in the @samp{.sdata} section. Put small uninitialized global and
|
|
static data in the @samp{.sbss} section. Do not use register @code{r13}
|
|
to address small data however. This is the default behavior unless
|
|
other @samp{-msdata} options are used.
|
|
|
|
@item -msdata=none
|
|
@itemx -mno-sdata
|
|
On embedded PowerPC systems, put all initialized global and static data
|
|
in the @samp{.data} section, and all uninitialized data in the
|
|
@samp{.bss} section.
|
|
|
|
@item -G @var{num}
|
|
@cindex smaller data references (PowerPC)
|
|
@cindex .sdata/.sdata2 references (PowerPC)
|
|
On embedded PowerPC systems, put global and static items less than or
|
|
equal to @var{num} bytes into the small data or bss sections instead of
|
|
the normal data or bss section. By default, @var{num} is 8. The
|
|
@samp{-G @var{num}} switch is also passed to the linker.
|
|
All modules should be compiled with the same @samp{-G @var{num}} value.
|
|
|
|
@item -mregnames
|
|
@itemx -mno-regnames
|
|
On System V.4 and embedded PowerPC systems do (do not) emit register
|
|
names in the assembly language output using symbolic forms.
|
|
@end table
|
|
@node RT Options
|
|
@subsection IBM RT Options
|
|
@cindex RT options
|
|
@cindex IBM RT options
|
|
|
|
These @samp{-m} options are defined for the IBM RT PC:
|
|
|
|
@table @code
|
|
@item -min-line-mul
|
|
Use an in-line code sequence for integer multiplies. This is the
|
|
default.
|
|
|
|
@item -mcall-lib-mul
|
|
Call @code{lmul$$} for integer multiples.
|
|
|
|
@item -mfull-fp-blocks
|
|
Generate full-size floating point data blocks, including the minimum
|
|
amount of scratch space recommended by IBM. This is the default.
|
|
|
|
@item -mminimum-fp-blocks
|
|
Do not include extra scratch space in floating point data blocks. This
|
|
results in smaller code, but slower execution, since scratch space must
|
|
be allocated dynamically.
|
|
|
|
@cindex @file{varargs.h} and RT PC
|
|
@cindex @file{stdarg.h} and RT PC
|
|
@item -mfp-arg-in-fpregs
|
|
Use a calling sequence incompatible with the IBM calling convention in
|
|
which floating point arguments are passed in floating point registers.
|
|
Note that @code{varargs.h} and @code{stdargs.h} will not work with
|
|
floating point operands if this option is specified.
|
|
|
|
@item -mfp-arg-in-gregs
|
|
Use the normal calling convention for floating point arguments. This is
|
|
the default.
|
|
|
|
@item -mhc-struct-return
|
|
Return structures of more than one word in memory, rather than in a
|
|
register. This provides compatibility with the MetaWare HighC (hc)
|
|
compiler. Use the option @samp{-fpcc-struct-return} for compatibility
|
|
with the Portable C Compiler (pcc).
|
|
|
|
@item -mnohc-struct-return
|
|
Return some structures of more than one word in registers, when
|
|
convenient. This is the default. For compatibility with the
|
|
IBM-supplied compilers, use the option @samp{-fpcc-struct-return} or the
|
|
option @samp{-mhc-struct-return}.
|
|
@end table
|
|
|
|
@node MIPS Options
|
|
@subsection MIPS Options
|
|
@cindex MIPS options
|
|
|
|
These @samp{-m} options are defined for the MIPS family of computers:
|
|
|
|
@table @code
|
|
@item -mcpu=@var{cpu type}
|
|
Assume the defaults for the machine type @var{cpu type} when scheduling
|
|
instructions. The choices for @var{cpu type} are @samp{r2000}, @samp{r3000},
|
|
@samp{r4000}, @samp{r4400}, @samp{r4600}, and @samp{r6000}. While picking a
|
|
specific @var{cpu type} will schedule things appropriately for that
|
|
particular chip, the compiler will not generate any code that does not
|
|
meet level 1 of the MIPS ISA (instruction set architecture) without
|
|
the @samp{-mips2} or @samp{-mips3} switches being used.
|
|
|
|
@item -mips1
|
|
Issue instructions from level 1 of the MIPS ISA. This is the default.
|
|
@samp{r3000} is the default @var{cpu type} at this ISA level.
|
|
|
|
@item -mips2
|
|
Issue instructions from level 2 of the MIPS ISA (branch likely, square
|
|
root instructions). @samp{r6000} is the default @var{cpu type} at this
|
|
ISA level.
|
|
|
|
@item -mips3
|
|
Issue instructions from level 3 of the MIPS ISA (64 bit instructions).
|
|
@samp{r4000} is the default @var{cpu type} at this ISA level.
|
|
This option does not change the sizes of any of the C data types.
|
|
|
|
@item -mips4
|
|
Issue instructions from level 4 of the MIPS ISA. @samp{r8000} is the
|
|
default @var{cpu type} at this ISA level.
|
|
|
|
@item -mfp32
|
|
Assume that 32 32-bit floating point registers are available. This is
|
|
the default.
|
|
|
|
@item -mfp64
|
|
Assume that 32 64-bit floating point registers are available. This is
|
|
the default when the @samp{-mips3} option is used.
|
|
|
|
@item -mgp32
|
|
Assume that 32 32-bit general purpose registers are available. This is
|
|
the default.
|
|
|
|
@item -mgp64
|
|
Assume that 32 64-bit general purpose registers are available. This is
|
|
the default when the @samp{-mips3} option is used.
|
|
|
|
@item -mint64
|
|
Types long, int, and pointer are 64 bits. This works only if @samp{-mips3}
|
|
is also specified.
|
|
|
|
@item -mlong64
|
|
Types long and pointer are 64 bits, and type int is 32 bits.
|
|
This works only if @samp{-mips3} is also specified.
|
|
|
|
@itemx -mabi=32
|
|
@itemx -mabi=n32
|
|
@itemx -mabi=64
|
|
@itemx -mabi=eabi
|
|
Generate code for the indicated ABI.
|
|
|
|
@item -mmips-as
|
|
Generate code for the MIPS assembler, and invoke @file{mips-tfile} to
|
|
add normal debug information. This is the default for all
|
|
platforms except for the OSF/1 reference platform, using the OSF/rose
|
|
object format. If the either of the @samp{-gstabs} or @samp{-gstabs+}
|
|
switches are used, the @file{mips-tfile} program will encapsulate the
|
|
stabs within MIPS ECOFF.
|
|
|
|
@item -mgas
|
|
Generate code for the GNU assembler. This is the default on the OSF/1
|
|
reference platform, using the OSF/rose object format. Also, this is
|
|
the default if the configure option @samp{--with-gnu-as} is used.
|
|
|
|
@item -msplit-addresses
|
|
@itemx -mno-split-addresses
|
|
Generate code to load the high and low parts of address constants separately.
|
|
This allows @code{gcc} to optimize away redundant loads of the high order
|
|
bits of addresses. This optimization requires GNU as and GNU ld.
|
|
This optimization is enabled by default for some embedded targets where
|
|
GNU as and GNU ld are standard.
|
|
|
|
@item -mrnames
|
|
@itemx -mno-rnames
|
|
The @samp{-mrnames} switch says to output code using the MIPS software
|
|
names for the registers, instead of the hardware names (ie, @var{a0}
|
|
instead of @var{$4}). The only known assembler that supports this option
|
|
is the Algorithmics assembler.
|
|
|
|
@item -mgpopt
|
|
@itemx -mno-gpopt
|
|
The @samp{-mgpopt} switch says to write all of the data declarations
|
|
before the instructions in the text section, this allows the MIPS
|
|
assembler to generate one word memory references instead of using two
|
|
words for short global or static data items. This is on by default if
|
|
optimization is selected.
|
|
|
|
@item -mstats
|
|
@itemx -mno-stats
|
|
For each non-inline function processed, the @samp{-mstats} switch
|
|
causes the compiler to emit one line to the standard error file to
|
|
print statistics about the program (number of registers saved, stack
|
|
size, etc.).
|
|
|
|
@item -mmemcpy
|
|
@itemx -mno-memcpy
|
|
The @samp{-mmemcpy} switch makes all block moves call the appropriate
|
|
string function (@samp{memcpy} or @samp{bcopy}) instead of possibly
|
|
generating inline code.
|
|
|
|
@item -mmips-tfile
|
|
@itemx -mno-mips-tfile
|
|
The @samp{-mno-mips-tfile} switch causes the compiler not
|
|
postprocess the object file with the @file{mips-tfile} program,
|
|
after the MIPS assembler has generated it to add debug support. If
|
|
@file{mips-tfile} is not run, then no local variables will be
|
|
available to the debugger. In addition, @file{stage2} and
|
|
@file{stage3} objects will have the temporary file names passed to the
|
|
assembler embedded in the object file, which means the objects will
|
|
not compare the same. The @samp{-mno-mips-tfile} switch should only
|
|
be used when there are bugs in the @file{mips-tfile} program that
|
|
prevents compilation.
|
|
|
|
@item -msoft-float
|
|
Generate output containing library calls for floating point.
|
|
@strong{Warning:} the requisite libraries are not part of GNU CC.
|
|
Normally the facilities of the machine's usual C compiler are used, but
|
|
this can't be done directly in cross-compilation. You must make your
|
|
own arrangements to provide suitable library functions for
|
|
cross-compilation.
|
|
|
|
@item -mhard-float
|
|
Generate output containing floating point instructions. This is the
|
|
default if you use the unmodified sources.
|
|
|
|
@item -mabicalls
|
|
@itemx -mno-abicalls
|
|
Emit (or do not emit) the pseudo operations @samp{.abicalls},
|
|
@samp{.cpload}, and @samp{.cprestore} that some System V.4 ports use for
|
|
position independent code.
|
|
|
|
@item -mlong-calls
|
|
@itemx -mno-long-calls
|
|
Do all calls with the @samp{JALR} instruction, which requires
|
|
loading up a function's address into a register before the call.
|
|
You need to use this switch, if you call outside of the current
|
|
512 megabyte segment to functions that are not through pointers.
|
|
|
|
@item -mhalf-pic
|
|
@itemx -mno-half-pic
|
|
Put pointers to extern references into the data section and load them
|
|
up, rather than put the references in the text section.
|
|
|
|
@item -membedded-pic
|
|
@itemx -mno-embedded-pic
|
|
Generate PIC code suitable for some embedded systems. All calls are
|
|
made using PC relative address, and all data is addressed using the $gp
|
|
register. No more than 65536 bytes of global data may be used. This
|
|
requires GNU as and GNU ld which do most of the work. This currently
|
|
only works on targets which use ECOFF; it does not work with ELF.
|
|
|
|
@item -membedded-data
|
|
@itemx -mno-embedded-data
|
|
Allocate variables to the read-only data section first if possible, then
|
|
next in the small data section if possible, otherwise in data. This gives
|
|
slightly slower code than the default, but reduces the amount of RAM required
|
|
when executing, and thus may be preferred for some embedded systems.
|
|
|
|
@item -msingle-float
|
|
@itemx -mdouble-float
|
|
The @samp{-msingle-float} switch tells gcc to assume that the floating
|
|
point coprocessor only supports single precision operations, as on the
|
|
@samp{r4650} chip. The @samp{-mdouble-float} switch permits gcc to use
|
|
double precision operations. This is the default.
|
|
|
|
@item -mmad
|
|
@itemx -mno-mad
|
|
Permit use of the @samp{mad}, @samp{madu} and @samp{mul} instructions,
|
|
as on the @samp{r4650} chip.
|
|
|
|
@item -m4650
|
|
Turns on @samp{-msingle-float}, @samp{-mmad}, and, at least for now,
|
|
@samp{-mcpu=r4650}.
|
|
|
|
@item -EL
|
|
Compile code for the processor in little endian mode.
|
|
The requisite libraries are assumed to exist.
|
|
|
|
@item -EB
|
|
Compile code for the processor in big endian mode.
|
|
The requisite libraries are assumed to exist.
|
|
|
|
@item -G @var{num}
|
|
@cindex smaller data references (MIPS)
|
|
@cindex gp-relative references (MIPS)
|
|
Put global and static items less than or equal to @var{num} bytes into
|
|
the small data or bss sections instead of the normal data or bss
|
|
section. This allows the assembler to emit one word memory reference
|
|
instructions based on the global pointer (@var{gp} or @var{$28}),
|
|
instead of the normal two words used. By default, @var{num} is 8 when
|
|
the MIPS assembler is used, and 0 when the GNU assembler is used. The
|
|
@samp{-G @var{num}} switch is also passed to the assembler and linker.
|
|
All modules should be compiled with the same @samp{-G @var{num}}
|
|
value.
|
|
|
|
@item -nocpp
|
|
Tell the MIPS assembler to not run its preprocessor over user
|
|
assembler files (with a @samp{.s} suffix) when assembling them.
|
|
@end table
|
|
|
|
@ifset INTERNALS
|
|
These options are defined by the macro
|
|
@code{TARGET_SWITCHES} in the machine description. The default for the
|
|
options is also defined by that macro, which enables you to change the
|
|
defaults.
|
|
@end ifset
|
|
|
|
@node i386 Options
|
|
@subsection Intel 386 Options
|
|
@cindex i386 Options
|
|
@cindex Intel 386 Options
|
|
|
|
These @samp{-m} options are defined for the i386 family of computers:
|
|
|
|
@table @code
|
|
@item -mcpu=@var{cpu type}
|
|
Assume the defaults for the machine type @var{cpu type} when scheduling
|
|
instructions. The choices for @var{cpu type} are: @samp{i386},
|
|
@samp{i486}, @samp{i586} (@samp{pentium}), @samp{pentium}, @samp{i686}
|
|
(@samp{pentiumpro}) and @samp{pentiumpro}. While picking a specific
|
|
@var{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 @samp{-march=@var{cpu type}} option being used.
|
|
|
|
@item -march=@var{cpu type}
|
|
Generate instructions for the machine type @var{cpu type}. The choices
|
|
for @var{cpu type} are: @samp{i386}, @samp{i486}, @samp{pentium}, and
|
|
@samp{pentiumpro}. Specifying @samp{-march=@var{cpu type}} implies
|
|
@samp{-mcpu=@var{cpu type}}.
|
|
|
|
@item -m386
|
|
@itemx -m486
|
|
@itemx -mpentium
|
|
@itemx -mpentiumpro
|
|
Synonyms for -mcpu=i386, -mcpu=i486, -mcpu=pentium, and -mcpu=pentiumpro
|
|
respectively.
|
|
|
|
@item -mno-ieee-fp
|
|
@itemx -mieee-fp
|
|
Control whether or not the compiler uses IEEE floating point
|
|
comparisons. These handle correctly the case where the result of a
|
|
comparison is unordered.
|
|
|
|
@item -msoft-float
|
|
Generate output containing library calls for floating point.
|
|
@strong{Warning:} the requisite libraries are not part of GNU CC.
|
|
Normally the facilities of the machine's usual C compiler are used, but
|
|
this can't be done directly in cross-compilation. You must make your
|
|
own arrangements to provide suitable library functions for
|
|
cross-compilation.
|
|
|
|
On machines where a function returns floating point results in the 80387
|
|
register stack, some floating point opcodes may be emitted even if
|
|
@samp{-msoft-float} is used.
|
|
|
|
@item -mno-fp-ret-in-387
|
|
Do not use the FPU registers for return values of functions.
|
|
|
|
The usual calling convention has functions return values of types
|
|
@code{float} and @code{double} in an FPU register, even if there
|
|
is no FPU. The idea is that the operating system should emulate
|
|
an FPU.
|
|
|
|
The option @samp{-mno-fp-ret-in-387} causes such values to be returned
|
|
in ordinary CPU registers instead.
|
|
|
|
@item -mno-fancy-math-387
|
|
Some 387 emulators do not support the @code{sin}, @code{cos} and
|
|
@code{sqrt} instructions for the 387. Specify this option to avoid
|
|
generating those instructions. This option is the default on FreeBSD.
|
|
As of revision 2.6.1, these instructions are not generated unless you
|
|
also use the @samp{-ffast-math} switch.
|
|
|
|
@item -malign-double
|
|
@itemx -mno-align-double
|
|
Control whether GNU CC aligns @code{double}, @code{long double}, and
|
|
@code{long long} variables on a two word boundary or a one word
|
|
boundary. Aligning @code{double} variables on a two word boundary will
|
|
produce code that runs somewhat faster on a @samp{Pentium} at the
|
|
expense of more memory.
|
|
|
|
@strong{Warning:} if you use the @samp{-malign-double} switch,
|
|
structures containing the above types will be aligned differently than
|
|
the published application binary interface specifications for the 386.
|
|
|
|
@item -msvr3-shlib
|
|
@itemx -mno-svr3-shlib
|
|
Control whether GNU CC places uninitialized locals into @code{bss} or
|
|
@code{data}. @samp{-msvr3-shlib} places these locals into @code{bss}.
|
|
These options are meaningful only on System V Release 3.
|
|
|
|
@item -mno-wide-multiply
|
|
@itemx -mwide-multiply
|
|
Control whether GNU CC uses the @code{mul} and @code{imul} that produce
|
|
64 bit results in @code{eax:edx} from 32 bit operands to do @code{long
|
|
long} multiplies and 32-bit division by constants.
|
|
|
|
@item -mprofiler-epilogue
|
|
@itemx -mno-profiler-epilogue
|
|
Generate extra code to write profile information for function exits.
|
|
This option has no effect except in combination with @samp{-g} or
|
|
@samp{-pg}.
|
|
|
|
@item -mrtd
|
|
Use a different function-calling convention, in which functions that
|
|
take a fixed number of arguments return with the @code{ret} @var{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 @samp{stdcall}. You can also
|
|
override the @samp{-mrtd} option by using the function attribute
|
|
@samp{cdecl}. @xref{Function Attributes}.
|
|
|
|
@strong{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 @code{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.)
|
|
|
|
@item -mreg-alloc=@var{regs}
|
|
Control the default allocation order of integer registers. The
|
|
string @var{regs} is a series of letters specifying a register. The
|
|
supported letters are: @code{a} allocate EAX; @code{b} allocate EBX;
|
|
@code{c} allocate ECX; @code{d} allocate EDX; @code{S} allocate ESI;
|
|
@code{D} allocate EDI; @code{B} allocate EBP.
|
|
|
|
@item -mregparm=@var{num}
|
|
Control how many registers are used to pass integer arguments. By
|
|
default, no registers are used to pass arguments, and at most 3
|
|
registers can be used. You can control this behavior for a specific
|
|
function by using the function attribute @samp{regparm}.
|
|
@xref{Function Attributes}.
|
|
|
|
@strong{Warning:} if you use this switch, and
|
|
@var{num} is nonzero, then you must build all modules with the same
|
|
value, including any libraries. This includes the system libraries and
|
|
startup modules.
|
|
|
|
@item -malign-loops=@var{num}
|
|
Align loops to a 2 raised to a @var{num} byte boundary. If
|
|
@samp{-malign-loops} is not specified, the default is 2 unless
|
|
gas 2.8 (or later) is being used in which case the default is
|
|
to align the loop on a 16 byte boundary if it is less than 8
|
|
bytes away.
|
|
|
|
@item -malign-jumps=@var{num}
|
|
Align instructions that are only jumped to to a 2 raised to a @var{num}
|
|
byte boundary. If @samp{-malign-jumps} is not specified, the default is
|
|
2 if optimizing for a 386, and 4 if optimizing for a 486 unless
|
|
gas 2.8 (or later) is being used in which case the default is
|
|
to align the instruction on a 16 byte boundary if it is less
|
|
than 8 bytes away.
|
|
|
|
@item -malign-functions=@var{num}
|
|
Align the start of functions to a 2 raised to @var{num} byte boundary.
|
|
If @samp{-malign-functions} is not specified, the default is 2 if optimizing
|
|
for a 386, and 4 if optimizing for a 486.
|
|
@end table
|
|
|
|
@node HPPA Options
|
|
@subsection HPPA Options
|
|
@cindex HPPA Options
|
|
|
|
These @samp{-m} options are defined for the HPPA family of computers:
|
|
|
|
@table @code
|
|
@item -mpa-risc-1-0
|
|
Generate code for a PA 1.0 processor.
|
|
|
|
@item -mpa-risc-1-1
|
|
Generate code for a PA 1.1 processor.
|
|
|
|
@item -mbig-switch
|
|
Generate code suitable for big switch tables. Use this option only if
|
|
the assembler/linker complain about out of range branches within a switch
|
|
table.
|
|
|
|
@item -mjump-in-delay
|
|
Fill delay slots of function calls with unconditional jump instructions
|
|
by modifying the return pointer for the function call to be the target
|
|
of the conditional jump.
|
|
|
|
@item -mdisable-fpregs
|
|
Prevent floating point registers from being used in any manner. This is
|
|
necessary for compiling kernels which perform lazy context switching of
|
|
floating point registers. If you use this option and attempt to perform
|
|
floating point operations, the compiler will abort.
|
|
|
|
@item -mdisable-indexing
|
|
Prevent the compiler from using indexing address modes. This avoids some
|
|
rather obscure problems when compiling MIG generated code under MACH.
|
|
|
|
@item -mno-space-regs
|
|
Generate code that assumes the target has no space registers. This allows
|
|
GCC to generate faster indirect calls and use unscaled index address modes.
|
|
|
|
Such code is suitable for level 0 PA systems and kernels.
|
|
|
|
@item -mfast-indirect-calls
|
|
Generate code that assumes calls never cross space boundaries. This
|
|
allows GCC to emit code which performs faster indirect calls.
|
|
|
|
This option will not work in the presense of shared libraries or nested
|
|
functions.
|
|
|
|
@item -mspace
|
|
Optimize for space rather than execution time. Currently this only
|
|
enables out of line function prologues and epilogues. This option is
|
|
incompatible with PIC code generation and profiling.
|
|
|
|
@item -mlong-load-store
|
|
Generate 3-instruction load and store sequences as sometimes required by
|
|
the HP-UX 10 linker. This is equivalent to the @samp{+k} option to
|
|
the HP compilers.
|
|
|
|
@item -mportable-runtime
|
|
Use the portable calling conventions proposed by HP for ELF systems.
|
|
|
|
@item -mgas
|
|
Enable the use of assembler directives only GAS understands.
|
|
|
|
@item -mschedule=@var{cpu type}
|
|
Schedule code according to the constraints for the machine type
|
|
@var{cpu type}. The choices for @var{cpu type} are @samp{700} for
|
|
7@var{n}0 machines, @samp{7100} for 7@var{n}5 machines, and @samp{7100LC}
|
|
for 7@var{n}2 machines. @samp{7100} is the default for @var{cpu type}.
|
|
|
|
Note the @samp{7100LC} scheduling information is incomplete and using
|
|
@samp{7100LC} often leads to bad schedules. For now it's probably best
|
|
to use @samp{7100} instead of @samp{7100LC} for the 7@var{n}2 machines.
|
|
|
|
@item -mlinker-opt
|
|
Enable the optimization pass in the HPUX linker. Note this makes symbolic
|
|
debugging impossible. It also triggers a bug in the HPUX 8 and HPUX 9 linkers
|
|
in which they give bogus error messages when linking some programs.
|
|
|
|
@item -msoft-float
|
|
Generate output containing library calls for floating point.
|
|
@strong{Warning:} the requisite libraries are not available for all HPPA
|
|
targets. Normally the facilities of the machine's usual C compiler are
|
|
used, but this cannot be done directly in cross-compilation. You must make
|
|
your own arrangements to provide suitable library functions for
|
|
cross-compilation. The embedded target @samp{hppa1.1-*-pro}
|
|
does provide software floating point support.
|
|
|
|
@samp{-msoft-float} changes the calling convention in the output file;
|
|
therefore, it is only useful if you compile @emph{all} of a program with
|
|
this option. In particular, you need to compile @file{libgcc.a}, the
|
|
library that comes with GNU CC, with @samp{-msoft-float} in order for
|
|
this to work.
|
|
@end table
|
|
|
|
@node Intel 960 Options
|
|
@subsection Intel 960 Options
|
|
|
|
These @samp{-m} options are defined for the Intel 960 implementations:
|
|
|
|
@table @code
|
|
@item -m@var{cpu type}
|
|
Assume the defaults for the machine type @var{cpu type} for some of
|
|
the other options, including instruction scheduling, floating point
|
|
support, and addressing modes. The choices for @var{cpu type} are
|
|
@samp{ka}, @samp{kb}, @samp{mc}, @samp{ca}, @samp{cf},
|
|
@samp{sa}, and @samp{sb}.
|
|
The default is
|
|
@samp{kb}.
|
|
|
|
@item -mnumerics
|
|
@itemx -msoft-float
|
|
The @samp{-mnumerics} option indicates that the processor does support
|
|
floating-point instructions. The @samp{-msoft-float} option indicates
|
|
that floating-point support should not be assumed.
|
|
|
|
@item -mleaf-procedures
|
|
@itemx -mno-leaf-procedures
|
|
Do (or do not) attempt to alter leaf procedures to be callable with the
|
|
@code{bal} instruction as well as @code{call}. This will result in more
|
|
efficient code for explicit calls when the @code{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.
|
|
|
|
@item -mtail-call
|
|
@itemx -mno-tail-call
|
|
Do (or do not) make additional attempts (beyond those of the
|
|
machine-independent portions of the compiler) to optimize tail-recursive
|
|
calls into branches. You may not want to do this because the detection of
|
|
cases where this is not valid is not totally complete. The default is
|
|
@samp{-mno-tail-call}.
|
|
|
|
@item -mcomplex-addr
|
|
@itemx -mno-complex-addr
|
|
Assume (or do not assume) that the use of a complex addressing mode is a
|
|
win on this implementation of the i960. Complex addressing modes may not
|
|
be worthwhile on the K-series, but they definitely are on the C-series.
|
|
The default is currently @samp{-mcomplex-addr} for all processors except
|
|
the CB and CC.
|
|
|
|
@item -mcode-align
|
|
@itemx -mno-code-align
|
|
Align code to 8-byte boundaries for faster fetching (or don't bother).
|
|
Currently turned on by default for C-series implementations only.
|
|
|
|
@ignore
|
|
@item -mclean-linkage
|
|
@itemx -mno-clean-linkage
|
|
These options are not fully implemented.
|
|
@end ignore
|
|
|
|
@item -mic-compat
|
|
@itemx -mic2.0-compat
|
|
@itemx -mic3.0-compat
|
|
Enable compatibility with iC960 v2.0 or v3.0.
|
|
|
|
@item -masm-compat
|
|
@itemx -mintel-asm
|
|
Enable compatibility with the iC960 assembler.
|
|
|
|
@item -mstrict-align
|
|
@itemx -mno-strict-align
|
|
Do not permit (do permit) unaligned accesses.
|
|
|
|
@item -mold-align
|
|
Enable structure-alignment compatibility with Intel's gcc release version
|
|
1.3 (based on gcc 1.37). This option implies @samp{-mstrict-align}.
|
|
@end table
|
|
|
|
@node DEC Alpha Options
|
|
@subsection DEC Alpha Options
|
|
|
|
These @samp{-m} options are defined for the DEC Alpha implementations:
|
|
|
|
@table @code
|
|
@item -mno-soft-float
|
|
@itemx -msoft-float
|
|
Use (do not use) the hardware floating-point instructions for
|
|
floating-point operations. When @code{-msoft-float} is specified,
|
|
functions in @file{libgcc1.c} will be used to perform floating-point
|
|
operations. Unless they are replaced by routines that emulate the
|
|
floating-point operations, or compiled in such a way as to call such
|
|
emulations routines, these routines will issue floating-point
|
|
operations. If you are compiling for an Alpha without floating-point
|
|
operations, you must ensure that the library is built so as not to call
|
|
them.
|
|
|
|
Note that Alpha implementations without floating-point operations are
|
|
required to have floating-point registers.
|
|
|
|
@item -mfp-reg
|
|
@itemx -mno-fp-regs
|
|
Generate code that uses (does not use) the floating-point register set.
|
|
@code{-mno-fp-regs} implies @code{-msoft-float}. If the floating-point
|
|
register set is not used, floating point operands are passed in integer
|
|
registers as if they were integers and floating-point results are passed
|
|
in $0 instead of $f0. This is a non-standard calling sequence, so any
|
|
function with a floating-point argument or return value called by code
|
|
compiled with @code{-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.
|
|
|
|
@item -mieee
|
|
The Alpha architecture implements floating-point hardware optimized for
|
|
maximum performance. It is mostly compliant with the IEEE floating
|
|
point standard. However, for full compliance, software assistance is
|
|
required. This option generates code fully IEEE compliant code
|
|
@emph{except} that the @var{inexact flag} is not maintained (see below).
|
|
If this option is turned on, the CPP macro @code{_IEEE_FP} is defined
|
|
during compilation. The option is a shorthand for: @samp{-D_IEEE_FP
|
|
-mfp-trap-mode=su -mtrap-precision=i -mieee-conformant}. 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
|
|
@code{-ieee_with_no_inexact}.
|
|
|
|
@item -mieee-with-inexact
|
|
@c overfull hbox here --bob 22 jul96
|
|
@c original text between ignore ... end ignore
|
|
@ignore
|
|
This is like @samp{-mieee} except the generated code also maintains the
|
|
IEEE @var{inexact flag}. Turning on this option causes the generated
|
|
code to implement fully-compliant IEEE math. The option is a shorthand
|
|
for @samp{-D_IEEE_FP -D_IEEE_FP_INEXACT} plus @samp{-mieee-conformant},
|
|
@samp{-mfp-trap-mode=sui}, and @samp{-mtrap-precision=i}. 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 @var{inexact flag}, you should normally not specify this
|
|
option. Other Alpha compilers call this option
|
|
@samp{-ieee_with_inexact}.
|
|
@end ignore
|
|
@c changed paragraph
|
|
This is like @samp{-mieee} except the generated code also maintains the
|
|
IEEE @var{inexact flag}. Turning on this option causes the generated
|
|
code to implement fully-compliant IEEE math. The option is a shorthand
|
|
for @samp{-D_IEEE_FP -D_IEEE_FP_INEXACT} plus the three following:
|
|
@samp{-mieee-conformant},
|
|
@samp{-mfp-trap-mode=sui},
|
|
and @samp{-mtrap-precision=i}.
|
|
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 @var{inexact flag}, you should
|
|
normally not specify this option. Other Alpha compilers call this
|
|
option @samp{-ieee_with_inexact}.
|
|
@c end changes to prevent overfull hboxes
|
|
|
|
@item -mfp-trap-mode=@var{trap mode}
|
|
This option controls what floating-point related traps are enabled.
|
|
Other Alpha compilers call this option @samp{-fptm }@var{trap mode}.
|
|
The trap mode can be set to one of four values:
|
|
|
|
@table @samp
|
|
@item n
|
|
This is the default (normal) setting. The only traps that are enabled
|
|
are the ones that cannot be disabled in software (e.g., division by zero
|
|
trap).
|
|
|
|
@item u
|
|
In addition to the traps enabled by @samp{n}, underflow traps are enabled
|
|
as well.
|
|
|
|
@item su
|
|
Like @samp{su}, but the instructions are marked to be safe for software
|
|
completion (see Alpha architecture manual for details).
|
|
|
|
@item sui
|
|
Like @samp{su}, but inexact traps are enabled as well.
|
|
@end table
|
|
|
|
@item -mfp-rounding-mode=@var{rounding mode}
|
|
Selects the IEEE rounding mode. Other Alpha compilers call this option
|
|
@samp{-fprm }@var{rounding mode}. The @var{rounding mode} can be one
|
|
of:
|
|
|
|
@table @samp
|
|
@item n
|
|
Normal IEEE rounding mode. Floating point numbers are rounded towards
|
|
the nearest machine number or towards the even machine number in case
|
|
of a tie.
|
|
|
|
@item m
|
|
Round towards minus infinity.
|
|
|
|
@item c
|
|
Chopped rounding mode. Floating point numbers are rounded towards zero.
|
|
|
|
@item d
|
|
Dynamic rounding mode. A field in the floating point control register
|
|
(@var{fpcr}, see Alpha architecture reference manual) controls the
|
|
rounding mode in effect. The C library initializes this register for
|
|
rounding towards plus infinity. Thus, unless your program modifies the
|
|
@var{fpcr}, @samp{d} corresponds to round towards plus infinity.@end table
|
|
|
|
@item -mtrap-precision=@var{trap precision}
|
|
In the Alpha architecture, floating point traps are imprecise. This
|
|
means without software assistance it is impossible to recover from a
|
|
floating trap and program execution normally needs to be terminated.
|
|
GNU CC can generate code that can assist operating system trap handlers
|
|
in determining the exact location that caused a floating point trap.
|
|
Depending on the requirements of an application, different levels of
|
|
precisions can be selected:
|
|
|
|
@table @samp
|
|
@item p
|
|
Program precision. This option is the default and means a trap handler
|
|
can only identify which program caused a floating point exception.
|
|
|
|
@item f
|
|
Function precision. The trap handler can determine the function that
|
|
caused a floating point exception.
|
|
|
|
@item i
|
|
Instruction precision. The trap handler can determine the exact
|
|
instruction that caused a floating point exception.
|
|
@end table
|
|
|
|
Other Alpha compilers provide the equivalent options called
|
|
@samp{-scope_safe} and @samp{-resumption_safe}.
|
|
|
|
@item -mieee-conformant
|
|
This option marks the generated code as IEEE conformant. You must not
|
|
use this option unless you also specify @samp{-mtrap-precision=i} and either
|
|
@samp{-mfp-trap-mode=su} or @samp{-mfp-trap-mode=sui}. Its only effect
|
|
is to emit the line @samp{.eflag 48} in the function prologue of the
|
|
generated assembly file. Under DEC Unix, this has the effect that
|
|
IEEE-conformant math library routines will be linked in.
|
|
|
|
@item -mbuild-constants
|
|
Normally GNU CC examines a 32- or 64-bit integer constant to
|
|
see if it can construct it from smaller constants in two or three
|
|
instructions. If it cannot, it will output the constant as a literal and
|
|
generate code to load it from the data segment at runtime.
|
|
|
|
Use this option to require GNU CC to construct @emph{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.
|
|
|
|
@item -malpha-as
|
|
@itemx -mgas
|
|
Select whether to generate code to be assembled by the vendor-supplied
|
|
assembler (@samp{-malpha-as}) or by the GNU assembler @samp{-mgas}.
|
|
|
|
@item -mbwx
|
|
@itemx -mno-bwx
|
|
@itemx -mcix
|
|
@itemx -mno-cix
|
|
@itemx -mmax
|
|
@itemx -mno-max
|
|
Indicate whether GNU CC should generate code to use the optional BWX,
|
|
CIX, and MAX instruction sets. The default is to use the instruction sets
|
|
supported by the CPU type specified via @samp{-mcpu=} option or that
|
|
of the CPU on which GNU CC was built if none was specified.
|
|
|
|
@item -mcpu=@var{cpu_type}
|
|
Set the instruction set, register set, and instruction scheduling
|
|
parameters for machine type @var{cpu_type}. You can specify either the
|
|
@samp{EV} style name or the corresponding chip number. GNU CC
|
|
supports scheduling parameters for the EV4 and EV5 family of processors
|
|
and will choose the default values for the instruction set from
|
|
the processor you specify. If you do not specify a processor type,
|
|
GNU CC will default to the processor on which the compiler was built.
|
|
|
|
Supported values for @var{cpu_type} are
|
|
|
|
@table @samp
|
|
@item ev4
|
|
@itemx 21064
|
|
Schedules as an EV4 and has no instruction set extensions.
|
|
|
|
@item ev5
|
|
@itemx 21164
|
|
Schedules as an EV5 and has no instruction set extensions.
|
|
|
|
@item ev56
|
|
@itemx 21164a
|
|
Schedules as an EV5 and supports the BWX extension.
|
|
|
|
@item pca56
|
|
@itemx 21164pc
|
|
@itemx 21164PC
|
|
Schedules as an EV5 and supports the BWX and MAX extensions.
|
|
|
|
@item ev6
|
|
@itemx 21264
|
|
Schedules as an EV5 (until Digital releases the scheduling parameters
|
|
for the EV6) and supports the BWX, CIX, and MAX extensions.
|
|
@end table
|
|
|
|
@item -mmemory-latency=@var{time}
|
|
Sets the latency the scheduler should assume for typical memory
|
|
references as seen by the application. This number is highly
|
|
dependant on the memory access patterns used by the application
|
|
and the size of the external cache on the machine.
|
|
|
|
Valid options for @var{time} are
|
|
|
|
@table @samp
|
|
@item @var{number}
|
|
A decimal number representing clock cycles.
|
|
|
|
@item L1
|
|
@itemx L2
|
|
@itemx L3
|
|
@itemx main
|
|
The compiler contains estimates of the number of clock cycles for
|
|
``typical'' EV4 & EV5 hardware for the Level 1, 2 & 3 caches
|
|
(also called Dcache, Scache, and Bcache), as well as to main memory.
|
|
Note that L3 is only valid for EV5.
|
|
|
|
@end table
|
|
@end table
|
|
|
|
@node Clipper Options
|
|
@subsection Clipper Options
|
|
|
|
These @samp{-m} options are defined for the Clipper implementations:
|
|
|
|
@table @code
|
|
@item -mc300
|
|
Produce code for a C300 Clipper processor. This is the default.
|
|
|
|
@itemx -mc400
|
|
Produce code for a C400 Clipper processor i.e. use floating point
|
|
registers f8..f15.
|
|
@end table
|
|
|
|
@node H8/300 Options
|
|
@subsection H8/300 Options
|
|
|
|
These @samp{-m} options are defined for the H8/300 implementations:
|
|
|
|
@table @code
|
|
@item -mrelax
|
|
Shorten some address references at link time, when possible; uses the
|
|
linker option @samp{-relax}. @xref{H8/300,, @code{ld} and the H8/300,
|
|
ld.info, Using ld}, for a fuller description.
|
|
|
|
@item -mh
|
|
Generate code for the H8/300H.
|
|
|
|
@item -ms
|
|
Generate code for the H8/S.
|
|
|
|
@item -mint32
|
|
Make @code{int} data 32 bits by default.
|
|
|
|
@item -malign-300
|
|
On the h8/300h, use the same alignment rules as for the h8/300.
|
|
The default for the h8/300h is to align longs and floats on 4 byte boundaries.
|
|
@samp{-malign-300} causes them to be aligned on 2 byte boundaries.
|
|
This option has no effect on the h8/300.
|
|
@end table
|
|
|
|
@node SH Options
|
|
@subsection SH Options
|
|
|
|
These @samp{-m} options are defined for the SH implementations:
|
|
|
|
@table @code
|
|
@item -m1
|
|
Generate code for the SH1.
|
|
|
|
@item -m2
|
|
Generate code for the SH2.
|
|
|
|
@item -m3
|
|
Generate code for the SH3.
|
|
|
|
@item -m3e
|
|
Generate code for the SH3e.
|
|
|
|
@item -mb
|
|
Compile code for the processor in big endian mode.
|
|
|
|
@item -ml
|
|
Compile code for the processor in little endian mode.
|
|
|
|
@item -mdalign
|
|
Align doubles at 64 bit boundaries. Note that this changes the calling
|
|
conventions, and thus some functions from the standard C library will
|
|
not work unless you recompile it first with -mdalign.
|
|
|
|
@item -mrelax
|
|
Shorten some address references at link time, when possible; uses the
|
|
linker option @samp{-relax}.
|
|
@end table
|
|
|
|
@node System V Options
|
|
@subsection Options for System V
|
|
|
|
These additional options are available on System V Release 4 for
|
|
compatibility with other compilers on those systems:
|
|
|
|
@table @code
|
|
@item -G
|
|
Create a shared object.
|
|
It is recommended that @samp{-symbolic} or @samp{-shared} be used instead.
|
|
|
|
@item -Qy
|
|
Identify the versions of each tool used by the compiler, in a
|
|
@code{.ident} assembler directive in the output.
|
|
|
|
@item -Qn
|
|
Refrain from adding @code{.ident} directives to the output file (this is
|
|
the default).
|
|
|
|
@item -YP,@var{dirs}
|
|
Search the directories @var{dirs}, and no others, for libraries
|
|
specified with @samp{-l}.
|
|
|
|
@item -Ym,@var{dir}
|
|
Look in the directory @var{dir} to find the M4 preprocessor.
|
|
The assembler uses this option.
|
|
@c This is supposed to go with a -Yd for predefined M4 macro files, but
|
|
@c the generic assembler that comes with Solaris takes just -Ym.
|
|
@end table
|
|
|
|
@node V850 Options
|
|
@subsection V850 Options
|
|
@cindex V850 Options
|
|
|
|
These @samp{-m} options are defined for V850 implementations:
|
|
|
|
@table @code
|
|
@item -mlong-calls
|
|
@itemx -mno-long-calls
|
|
Treat all calls as being far away (near). If calls are assumed to be
|
|
far away, the compiler will always load the functions address up into a
|
|
register, and call indirect through the pointer.
|
|
|
|
@item -mno-ep
|
|
@itemx -mep
|
|
Do not optimize (do optimize) basic blocks that use the same index
|
|
pointer 4 or more times to copy pointer into the @code{ep} register, and
|
|
use the shorter @code{sld} and @code{sst} instructions. The @samp{-mep}
|
|
option is on by default if you optimize.
|
|
|
|
@item -mno-prolog-function
|
|
@itemx -mprolog-function
|
|
Do not use (do use) external functions to save and restore registers at
|
|
the prolog and epilog of a function. The external functions are slower,
|
|
but use less code space if more than one function saves the same number
|
|
of registers. The @samp{-mprolog-function} option is on by default if
|
|
you optimize.
|
|
|
|
@item -mspace
|
|
Try to make the code as small as possible. At present, this just turns
|
|
on the @samp{-mep} and @samp{-mprolog-function} options.
|
|
|
|
@item -mtda=@var{n}
|
|
Put static or global variables whose size is @var{n} bytes or less into
|
|
the tiny data area that register @code{ep} points to. The tiny data
|
|
area can hold up to 256 bytes in total (128 bytes for byte references).
|
|
|
|
@item -msda=@var{n}
|
|
Put static or global variables whose size is @var{n} bytes or less into
|
|
the small data area that register @code{gp} points to. The small data
|
|
area can hold up to 64 kilobytes.
|
|
|
|
@item -mzda=@var{n}
|
|
Put static or global variables whose size is @var{n} bytes or less into
|
|
the first 32 kilobytes of memory.
|
|
|
|
@item -mv850
|
|
Specify that the target processor is the V850.
|
|
|
|
@item -mbig-switch
|
|
Generate code suitable for big switch tables. Use this option only if
|
|
the assembler/linker complain about out of range branches within a switch
|
|
table.
|
|
@end table
|
|
|
|
@node ARC Options
|
|
@subsection ARC Options
|
|
@cindex ARC Options
|
|
|
|
These options are defined for ARC implementations:
|
|
|
|
@table @code
|
|
@item -EL
|
|
Compile code for little endian mode. This is the default.
|
|
|
|
@item -EB
|
|
Compile code for big endian mode.
|
|
|
|
@item -mmangle-cpu
|
|
Prepend the name of the cpu to all public symbol names.
|
|
In multiple-processor systems, there are many ARC variants with different
|
|
instruction and register set characteristics. This flag prevents code
|
|
compiled for one cpu to be linked with code compiled for another.
|
|
No facility exists for handling variants that are "almost identical".
|
|
This is an all or nothing option.
|
|
|
|
@item -mcpu=@var{cpu}
|
|
Compile code for ARC variant @var{cpu}.
|
|
Which variants are supported depend on the configuration.
|
|
All variants support @samp{-mcpu=base}, this is the default.
|
|
|
|
@item -mtext=@var{text section}
|
|
@item -mdata=@var{data section}
|
|
@item -mrodata=@var{readonly data section}
|
|
Put functions, data, and readonly data in @var{text section},
|
|
@var{data section}, and @var{readonly data section} respectively
|
|
by default. This can be overridden with the @code{section} attribute.
|
|
@xref{Variable Attributes}.
|
|
|
|
@end table
|
|
|
|
|
|
@node Code Gen Options
|
|
@section Options for Code Generation Conventions
|
|
@cindex code generation conventions
|
|
@cindex options, code generation
|
|
@cindex run-time options
|
|
|
|
These machine-independent options control the interface conventions
|
|
used in code generation.
|
|
|
|
Most of them have both positive and negative forms; the negative form
|
|
of @samp{-ffoo} would be @samp{-fno-foo}. In the table below, only
|
|
one of the forms is listed---the one which is not the default. You
|
|
can figure out the other form by either removing @samp{no-} or adding
|
|
it.
|
|
|
|
@table @code
|
|
@item -fexceptions
|
|
Enable exception handling, and generate extra code needed to propagate
|
|
exceptions. If you do not specify this option, GNU CC enables it by
|
|
default for languages like C++ that normally require exception handling,
|
|
and disabled for languages like C that do not normally require it.
|
|
However, when compiling C code that needs to interoperate properly with
|
|
exception handlers written in C++, you may need to enable this option.
|
|
You may also wish to disable this option is you are compiling older C++
|
|
programs that don't use exception handling.
|
|
|
|
@item -fpcc-struct-return
|
|
Return ``short'' @code{struct} and @code{union} values in memory like
|
|
longer ones, rather than in registers. This convention is less
|
|
efficient, but it has the advantage of allowing intercallability between
|
|
GNU CC-compiled files and files compiled with other compilers.
|
|
|
|
The precise convention for returning structures in memory depends
|
|
on the target configuration macros.
|
|
|
|
Short structures and unions are those whose size and alignment match
|
|
that of some integer type.
|
|
|
|
@item -freg-struct-return
|
|
Use the convention that @code{struct} and @code{union} values are
|
|
returned in registers when possible. This is more efficient for small
|
|
structures than @samp{-fpcc-struct-return}.
|
|
|
|
If you specify neither @samp{-fpcc-struct-return} nor its contrary
|
|
@samp{-freg-struct-return}, GNU CC defaults to whichever convention is
|
|
standard for the target. If there is no standard convention, GNU CC
|
|
defaults to @samp{-fpcc-struct-return}, except on targets where GNU CC
|
|
is the principal compiler. In those cases, we can choose the standard,
|
|
and we chose the more efficient register return alternative.
|
|
|
|
@item -fshort-enums
|
|
Allocate to an @code{enum} type only as many bytes as it needs for the
|
|
declared range of possible values. Specifically, the @code{enum} type
|
|
will be equivalent to the smallest integer type which has enough room.
|
|
|
|
@item -fshort-double
|
|
Use the same size for @code{double} as for @code{float}.
|
|
|
|
@item -fshared-data
|
|
Requests that the data and non-@code{const} variables of this
|
|
compilation be shared data rather than private data. The distinction
|
|
makes sense only on certain operating systems, where shared data is
|
|
shared between processes running the same program, while private data
|
|
exists in one copy per process.
|
|
|
|
@item -fno-common
|
|
Allocate even uninitialized global variables in the bss section of the
|
|
object file, rather than generating them as common blocks. This has the
|
|
effect that if the same variable is declared (without @code{extern}) in
|
|
two different compilations, you will get an error when you link them.
|
|
The only reason this might be useful is if you wish to verify that the
|
|
program will work on other systems which always work this way.
|
|
|
|
@item -fno-ident
|
|
Ignore the @samp{#ident} directive.
|
|
|
|
@item -fno-gnu-linker
|
|
Do not output global initializations (such as C++ constructors and
|
|
destructors) in the form used by the GNU linker (on systems where the GNU
|
|
linker is the standard method of handling them). Use this option when
|
|
you want to use a non-GNU linker, which also requires using the
|
|
@code{collect2} program to make sure the system linker includes
|
|
constructors and destructors. (@code{collect2} is included in the GNU CC
|
|
distribution.) For systems which @emph{must} use @code{collect2}, the
|
|
compiler driver @code{gcc} is configured to do this automatically.
|
|
|
|
@item -finhibit-size-directive
|
|
Don't output a @code{.size} assembler directive, or anything else that
|
|
would cause trouble if the function is split in the middle, and the
|
|
two halves are placed at locations far apart in memory. This option is
|
|
used when compiling @file{crtstuff.c}; you should not need to use it
|
|
for anything else.
|
|
|
|
@item -fverbose-asm
|
|
Put extra commentary information in the generated assembly code to
|
|
make it more readable. This option is generally only of use to those
|
|
who actually need to read the generated assembly code (perhaps while
|
|
debugging the compiler itself).
|
|
|
|
@samp{-fno-verbose-asm}, the default, causes the
|
|
extra information to be omitted and is useful when comparing two assembler
|
|
files.
|
|
|
|
@item -fvolatile
|
|
Consider all memory references through pointers to be volatile.
|
|
|
|
@item -fvolatile-global
|
|
Consider all memory references to extern and global data items to
|
|
be volatile.
|
|
|
|
@item -fpic
|
|
@cindex global offset table
|
|
@cindex PIC
|
|
Generate position-independent code (PIC) suitable for use in a shared
|
|
library, if supported for the target machine. Such code accesses all
|
|
constant addresses through a global offset table (GOT). The dynamic
|
|
loader resolves the GOT entries when the program starts (the dynamic
|
|
loader is not part of GNU CC; it is part of the operating system). If
|
|
the GOT size for the linked executable exceeds a machine-specific
|
|
maximum size, you get an error message from the linker indicating that
|
|
@samp{-fpic} does not work; in that case, recompile with @samp{-fPIC}
|
|
instead. (These maximums are 16k on the m88k, 8k on the Sparc, and 32k
|
|
on the m68k and RS/6000. The 386 has no such limit.)
|
|
|
|
Position-independent code requires special support, and therefore works
|
|
only on certain machines. For the 386, GNU CC supports PIC for System V
|
|
but not for the Sun 386i. Code generated for the IBM RS/6000 is always
|
|
position-independent.
|
|
|
|
@item -fPIC
|
|
If supported for the target machine, emit position-independent code,
|
|
suitable for dynamic linking and avoiding any limit on the size of the
|
|
global offset table. This option makes a difference on the m68k, m88k,
|
|
and the Sparc.
|
|
|
|
Position-independent code requires special support, and therefore works
|
|
only on certain machines.
|
|
|
|
@item -ffixed-@var{reg}
|
|
Treat the register named @var{reg} as a fixed register; generated code
|
|
should never refer to it (except perhaps as a stack pointer, frame
|
|
pointer or in some other fixed role).
|
|
|
|
@var{reg} must be the name of a register. The register names accepted
|
|
are machine-specific and are defined in the @code{REGISTER_NAMES}
|
|
macro in the machine description macro file.
|
|
|
|
This flag does not have a negative form, because it specifies a
|
|
three-way choice.
|
|
|
|
@item -fcall-used-@var{reg}
|
|
Treat the register named @var{reg} as an allocable register that is
|
|
clobbered by function calls. It may be allocated for temporaries or
|
|
variables that do not live across a call. Functions compiled this way
|
|
will not save and restore the register @var{reg}.
|
|
|
|
Use of this flag for a register that has a fixed pervasive role in the
|
|
machine's execution model, such as the stack pointer or frame pointer,
|
|
will produce disastrous results.
|
|
|
|
This flag does not have a negative form, because it specifies a
|
|
three-way choice.
|
|
|
|
@item -fcall-saved-@var{reg}
|
|
Treat the register named @var{reg} as an allocable register saved by
|
|
functions. It may be allocated even for temporaries or variables that
|
|
live across a call. Functions compiled this way will save and restore
|
|
the register @var{reg} if they use it.
|
|
|
|
Use of this flag for a register that has a fixed pervasive role in the
|
|
machine's execution model, such as the stack pointer or frame pointer,
|
|
will produce disastrous results.
|
|
|
|
A different sort of disaster will result from the use of this flag for
|
|
a register in which function values may be returned.
|
|
|
|
This flag does not have a negative form, because it specifies a
|
|
three-way choice.
|
|
|
|
@item -fpack-struct
|
|
Pack all structure members together without holes. Usually you would
|
|
not want to use this option, since it makes the code suboptimal, and
|
|
the offsets of structure members won't agree with system libraries.
|
|
|
|
@item -fcheck-memory-usage
|
|
Generate extra code to check each memory access. GNU CC will generate
|
|
code that is suitable for a detector of bad memory accesses such as
|
|
@file{Checker}. If you specify this option, you can not use the
|
|
@code{asm} or @code{__asm__} keywords.
|
|
|
|
You must also specify this option when you compile functions you call that
|
|
have side effects. If you do not, you may get erroneous messages from
|
|
the detector. Normally, you should compile all your code with this option.
|
|
If you use functions from a library that have side-effects (such as
|
|
@code{read}), you may not be able to recompile the library and
|
|
specify this option. In that case, you can enable the
|
|
@samp{-fprefix-function-name} option, which requests GNU CC to encapsulate
|
|
your code and make other functions look as if they were compiled with
|
|
@samp{-fcheck-memory-usage}. This is done by calling ``stubs'',
|
|
which are provided by the detector. If you cannot find or build
|
|
stubs for every function you call, you may have to specify
|
|
@samp{-fcheck-memory-usage} without @samp{-fprefix-function-name}.
|
|
|
|
@item -fprefix-function-name
|
|
Request GNU CC to add a prefix to the symbols generated for function names.
|
|
GNU CC adds a prefix to the names of functions defined as well as
|
|
functions called. Code compiled with this option and code compiled
|
|
without the option can't be linked together, unless or stubs are used.
|
|
|
|
If you compile the following code with @samp{-fprefix-function-name}
|
|
@example
|
|
extern void bar (int);
|
|
void
|
|
foo (int a)
|
|
@{
|
|
return bar (a + 5);
|
|
|
|
@}
|
|
@end example
|
|
|
|
@noindent
|
|
GNU CC will compile the code as if it was written:
|
|
@example
|
|
extern void prefix_bar (int);
|
|
void
|
|
prefix_foo (int a)
|
|
@{
|
|
return prefix_bar (a + 5);
|
|
@}
|
|
@end example
|
|
This option is designed to be used with @samp{-fcheck-memory-usage}.
|
|
|
|
@item -fstack-check
|
|
Generate code to verify that you do not go beyond the boundary of the
|
|
stack. You should specify this flag if you are running in an
|
|
environment with multiple threads, but only rarely need to specify it in
|
|
a single-threaded environment since stack overflow is automatically
|
|
detected on nearly all systems if there is only one stack.
|
|
|
|
@item -fexceptions
|
|
Enable exception handling. For some targets, this implies
|
|
generation of frame unwind information for all functions, which can produce
|
|
significant data size overhead, though it does not affect execution.
|
|
|
|
This option is on by default for languages that support exception
|
|
handling (such as C++), and off for those that don't (such as C).
|
|
|
|
@item +e0
|
|
@itemx +e1
|
|
Control whether virtual function definitions in classes are used to
|
|
generate code, or only to define interfaces for their callers. (C++
|
|
only).
|
|
|
|
These options are provided for compatibility with @code{cfront} 1.x
|
|
usage; the recommended alternative GNU C++ usage is in flux. @xref{C++
|
|
Interface,,Declarations and Definitions in One Header}.
|
|
|
|
With @samp{+e0}, virtual function definitions in classes are declared
|
|
@code{extern}; the declaration is used only as an interface
|
|
specification, not to generate code for the virtual functions (in this
|
|
compilation).
|
|
|
|
With @samp{+e1}, G++ actually generates the code implementing virtual
|
|
functions defined in the code, and makes them publicly visible.
|
|
|
|
@cindex aliasing of parameters
|
|
@cindex parameters, aliased
|
|
@item -fargument-alias
|
|
@itemx -fargument-noalias
|
|
@itemx -fargument-noalias-global
|
|
Specify the possible relationships among parameters and between
|
|
parameters and global data.
|
|
|
|
@samp{-fargument-alias} specifies that arguments (parameters) may
|
|
alias each other and may alias global storage.
|
|
@samp{-fargument-noalias} specifies that arguments do not alias
|
|
each other, but may alias global storage.
|
|
@samp{-fargument-noalias-global} specifies that arguments do not
|
|
alias each other and do not alias global storage.
|
|
|
|
Each language will automatically use whatever option is required by
|
|
the language standard. You should not need to use these options yourself.
|
|
@end table
|
|
|
|
@node Environment Variables
|
|
@section Environment Variables Affecting GNU CC
|
|
@cindex environment variables
|
|
|
|
This section describes several environment variables that affect how GNU
|
|
CC operates. They work by specifying directories or prefixes to use
|
|
when searching for various kinds of files.
|
|
|
|
@ifclear INTERNALS
|
|
Note that you can also specify places to search using options such as
|
|
@samp{-B}, @samp{-I} and @samp{-L} (@pxref{Directory Options}). These
|
|
take precedence over places specified using environment variables, which
|
|
in turn take precedence over those specified by the configuration of GNU
|
|
CC.
|
|
@end ifclear
|
|
@ifset INTERNALS
|
|
Note that you can also specify places to search using options such as
|
|
@samp{-B}, @samp{-I} and @samp{-L} (@pxref{Directory Options}). These
|
|
take precedence over places specified using environment variables, which
|
|
in turn take precedence over those specified by the configuration of GNU
|
|
CC. @xref{Driver}.
|
|
@end ifset
|
|
|
|
@table @code
|
|
@item TMPDIR
|
|
@findex TMPDIR
|
|
If @code{TMPDIR} is set, it specifies the directory to use for temporary
|
|
files. GNU CC uses temporary files to hold the output of one stage of
|
|
compilation which is to be used as input to the next stage: for example,
|
|
the output of the preprocessor, which is the input to the compiler
|
|
proper.
|
|
|
|
@item GCC_EXEC_PREFIX
|
|
@findex GCC_EXEC_PREFIX
|
|
If @code{GCC_EXEC_PREFIX} is set, it specifies a prefix to use in the
|
|
names of the subprograms executed by the compiler. No slash is added
|
|
when this prefix is combined with the name of a subprogram, but you can
|
|
specify a prefix that ends with a slash if you wish.
|
|
|
|
If GNU CC cannot find the subprogram using the specified prefix, it
|
|
tries looking in the usual places for the subprogram.
|
|
|
|
The default value of @code{GCC_EXEC_PREFIX} is
|
|
@file{@var{prefix}/lib/gcc-lib/} where @var{prefix} is the value
|
|
of @code{prefix} when you ran the @file{configure} script.
|
|
|
|
Other prefixes specified with @samp{-B} take precedence over this prefix.
|
|
|
|
This prefix is also used for finding files such as @file{crt0.o} that are
|
|
used for linking.
|
|
|
|
In addition, the prefix is used in an unusual way in finding the
|
|
directories to search for header files. For each of the standard
|
|
directories whose name normally begins with @samp{/usr/local/lib/gcc-lib}
|
|
(more precisely, with the value of @code{GCC_INCLUDE_DIR}), GNU CC tries
|
|
replacing that beginning with the specified prefix to produce an
|
|
alternate directory name. Thus, with @samp{-Bfoo/}, GNU CC will search
|
|
@file{foo/bar} where it would normally search @file{/usr/local/lib/bar}.
|
|
These alternate directories are searched first; the standard directories
|
|
come next.
|
|
|
|
@item COMPILER_PATH
|
|
@findex COMPILER_PATH
|
|
The value of @code{COMPILER_PATH} is a colon-separated list of
|
|
directories, much like @code{PATH}. GNU CC tries the directories thus
|
|
specified when searching for subprograms, if it can't find the
|
|
subprograms using @code{GCC_EXEC_PREFIX}.
|
|
|
|
@item LIBRARY_PATH
|
|
@findex LIBRARY_PATH
|
|
The value of @code{LIBRARY_PATH} is a colon-separated list of
|
|
directories, much like @code{PATH}. When configured as a native compiler,
|
|
GNU CC tries the directories thus specified when searching for special
|
|
linker files, if it can't find them using @code{GCC_EXEC_PREFIX}. Linking
|
|
using GNU CC also uses these directories when searching for ordinary
|
|
libraries for the @samp{-l} option (but directories specified with
|
|
@samp{-L} come first).
|
|
|
|
@item C_INCLUDE_PATH
|
|
@itemx CPLUS_INCLUDE_PATH
|
|
@itemx OBJC_INCLUDE_PATH
|
|
@findex C_INCLUDE_PATH
|
|
@findex CPLUS_INCLUDE_PATH
|
|
@findex OBJC_INCLUDE_PATH
|
|
@c @itemx OBJCPLUS_INCLUDE_PATH
|
|
These environment variables pertain to particular languages. Each
|
|
variable's value is a colon-separated list of directories, much like
|
|
@code{PATH}. When GNU CC searches for header files, it tries the
|
|
directories listed in the variable for the language you are using, after
|
|
the directories specified with @samp{-I} but before the standard header
|
|
file directories.
|
|
|
|
@item DEPENDENCIES_OUTPUT
|
|
@findex DEPENDENCIES_OUTPUT
|
|
@cindex dependencies for make as output
|
|
If this variable is set, its value specifies how to output dependencies
|
|
for Make based on the header files processed by the compiler. This
|
|
output looks much like the output from the @samp{-M} option
|
|
(@pxref{Preprocessor Options}), but it goes to a separate file, and is
|
|
in addition to the usual results of compilation.
|
|
|
|
The value of @code{DEPENDENCIES_OUTPUT} can be just a file name, in
|
|
which case the Make rules are written to that file, guessing the target
|
|
name from the source file name. Or the value can have the form
|
|
@samp{@var{file} @var{target}}, in which case the rules are written to
|
|
file @var{file} using @var{target} as the target name.
|
|
@end table
|
|
|
|
@node Running Protoize
|
|
@section Running Protoize
|
|
|
|
The program @code{protoize} is an optional part of GNU C. You can use
|
|
it to add prototypes to a program, thus converting the program to ANSI
|
|
C in one respect. The companion program @code{unprotoize} does the
|
|
reverse: it removes argument types from any prototypes that are found.
|
|
|
|
When you run these programs, you must specify a set of source files as
|
|
command line arguments. The conversion programs start out by compiling
|
|
these files to see what functions they define. The information gathered
|
|
about a file @var{foo} is saved in a file named @file{@var{foo}.X}.
|
|
|
|
After scanning comes actual conversion. The specified files are all
|
|
eligible to be converted; any files they include (whether sources or
|
|
just headers) are eligible as well.
|
|
|
|
But not all the eligible files are converted. By default,
|
|
@code{protoize} and @code{unprotoize} convert only source and header
|
|
files in the current directory. You can specify additional directories
|
|
whose files should be converted with the @samp{-d @var{directory}}
|
|
option. You can also specify particular files to exclude with the
|
|
@samp{-x @var{file}} option. A file is converted if it is eligible, its
|
|
directory name matches one of the specified directory names, and its
|
|
name within the directory has not been excluded.
|
|
|
|
Basic conversion with @code{protoize} consists of rewriting most
|
|
function definitions and function declarations to specify the types of
|
|
the arguments. The only ones not rewritten are those for varargs
|
|
functions.
|
|
|
|
@code{protoize} optionally inserts prototype declarations at the
|
|
beginning of the source file, to make them available for any calls that
|
|
precede the function's definition. Or it can insert prototype
|
|
declarations with block scope in the blocks where undeclared functions
|
|
are called.
|
|
|
|
Basic conversion with @code{unprotoize} consists of rewriting most
|
|
function declarations to remove any argument types, and rewriting
|
|
function definitions to the old-style pre-ANSI form.
|
|
|
|
Both conversion programs print a warning for any function declaration or
|
|
definition that they can't convert. You can suppress these warnings
|
|
with @samp{-q}.
|
|
|
|
The output from @code{protoize} or @code{unprotoize} replaces the
|
|
original source file. The original file is renamed to a name ending
|
|
with @samp{.save}. If the @samp{.save} file already exists, then
|
|
the source file is simply discarded.
|
|
|
|
@code{protoize} and @code{unprotoize} both depend on GNU CC itself to
|
|
scan the program and collect information about the functions it uses.
|
|
So neither of these programs will work until GNU CC is installed.
|
|
|
|
Here is a table of the options you can use with @code{protoize} and
|
|
@code{unprotoize}. Each option works with both programs unless
|
|
otherwise stated.
|
|
|
|
@table @code
|
|
@item -B @var{directory}
|
|
Look for the file @file{SYSCALLS.c.X} in @var{directory}, instead of the
|
|
usual directory (normally @file{/usr/local/lib}). This file contains
|
|
prototype information about standard system functions. This option
|
|
applies only to @code{protoize}.
|
|
|
|
@item -c @var{compilation-options}
|
|
Use @var{compilation-options} as the options when running @code{gcc} to
|
|
produce the @samp{.X} files. The special option @samp{-aux-info} is
|
|
always passed in addition, to tell @code{gcc} to write a @samp{.X} file.
|
|
|
|
Note that the compilation options must be given as a single argument to
|
|
@code{protoize} or @code{unprotoize}. If you want to specify several
|
|
@code{gcc} options, you must quote the entire set of compilation options
|
|
to make them a single word in the shell.
|
|
|
|
There are certain @code{gcc} arguments that you cannot use, because they
|
|
would produce the wrong kind of output. These include @samp{-g},
|
|
@samp{-O}, @samp{-c}, @samp{-S}, and @samp{-o} If you include these in
|
|
the @var{compilation-options}, they are ignored.
|
|
|
|
@item -C
|
|
Rename files to end in @samp{.C} instead of @samp{.c}.
|
|
This is convenient if you are converting a C program to C++.
|
|
This option applies only to @code{protoize}.
|
|
|
|
@item -g
|
|
Add explicit global declarations. This means inserting explicit
|
|
declarations at the beginning of each source file for each function
|
|
that is called in the file and was not declared. These declarations
|
|
precede the first function definition that contains a call to an
|
|
undeclared function. This option applies only to @code{protoize}.
|
|
|
|
@item -i @var{string}
|
|
Indent old-style parameter declarations with the string @var{string}.
|
|
This option applies only to @code{protoize}.
|
|
|
|
@code{unprotoize} converts prototyped function definitions to old-style
|
|
function definitions, where the arguments are declared between the
|
|
argument list and the initial @samp{@{}. By default, @code{unprotoize}
|
|
uses five spaces as the indentation. If you want to indent with just
|
|
one space instead, use @samp{-i " "}.
|
|
|
|
@item -k
|
|
Keep the @samp{.X} files. Normally, they are deleted after conversion
|
|
is finished.
|
|
|
|
@item -l
|
|
Add explicit local declarations. @code{protoize} with @samp{-l} inserts
|
|
a prototype declaration for each function in each block which calls the
|
|
function without any declaration. This option applies only to
|
|
@code{protoize}.
|
|
|
|
@item -n
|
|
Make no real changes. This mode just prints information about the conversions
|
|
that would have been done without @samp{-n}.
|
|
|
|
@item -N
|
|
Make no @samp{.save} files. The original files are simply deleted.
|
|
Use this option with caution.
|
|
|
|
@item -p @var{program}
|
|
Use the program @var{program} as the compiler. Normally, the name
|
|
@file{gcc} is used.
|
|
|
|
@item -q
|
|
Work quietly. Most warnings are suppressed.
|
|
|
|
@item -v
|
|
Print the version number, just like @samp{-v} for @code{gcc}.
|
|
@end table
|
|
|
|
If you need special compiler options to compile one of your program's
|
|
source files, then you should generate that file's @samp{.X} file
|
|
specially, by running @code{gcc} on that source file with the
|
|
appropriate options and the option @samp{-aux-info}. Then run
|
|
@code{protoize} on the entire set of files. @code{protoize} will use
|
|
the existing @samp{.X} file because it is newer than the source file.
|
|
For example:
|
|
|
|
@example
|
|
gcc -Dfoo=bar file1.c -aux-info
|
|
protoize *.c
|
|
@end example
|
|
|
|
@noindent
|
|
You need to include the special files along with the rest in the
|
|
@code{protoize} command, even though their @samp{.X} files already
|
|
exist, because otherwise they won't get converted.
|
|
|
|
@xref{Protoize Caveats}, for more information on how to use
|
|
@code{protoize} successfully.
|
|
|