2483 lines
93 KiB
Plaintext
2483 lines
93 KiB
Plaintext
@c Copyright (C) 1988, 1989, 1992 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 grouping options
|
|
@cindex options, grouping
|
|
The GNU C compiler uses a command syntax much like the Unix C compiler.
|
|
The @code{gcc} program accepts options and file names as operands.
|
|
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; @code{gcc} reorders the command-line options so
|
|
that the choices specified by option flags are applied to all input
|
|
files. 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.
|
|
|
|
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}.
|
|
@example
|
|
-c -S -E -o @var{file} -pipe -v -x @var{language}
|
|
@end example
|
|
|
|
@item Language Options
|
|
@xref{Dialect Options,,Options Controlling Dialect}.
|
|
@example
|
|
-ansi -fbuiltin -fcond-mismatch -fno-asm
|
|
-fsigned-bitfields -fsigned-char
|
|
-funsigned-bitfields -funsigned-char -fwritable-strings
|
|
-traditional -traditional-cpp -trigraphs
|
|
@end example
|
|
|
|
@item Warning Options
|
|
@xref{Warning Options,,Options to Request or Suppress Warnings}.
|
|
@example
|
|
-fsyntax-only -pedantic -pedantic-errors
|
|
-w -W -Wall -Waggregate-return
|
|
-Wcast-align -Wcast-qual -Wcomment -Wconversion -Werror
|
|
-Wformat -Wid-clash-@var{len} -Wimplicit -Wimport
|
|
-Winline -Wmissing-prototypes
|
|
-Wparentheses -Wpointer-arith -Wreturn-type -Wshadow
|
|
-Wstrict-prototypes -Wswitch -Wtraditional -Wtrigraphs
|
|
-Wuninitialized -Wunused -Wwrite-strings -Wchar-subscripts
|
|
@end example
|
|
|
|
@item Debugging Options
|
|
@xref{Debugging Options,,Options for Debugging Your Program or GCC}.
|
|
@example
|
|
-a -d@var{letters} -fpretend-float
|
|
-g -g@var{level} -ggdb -gdwarf
|
|
-gstabs -gstabs+ -gcoff -gxcoff
|
|
-p -pg -save-temps
|
|
@end example
|
|
|
|
@item Optimization Options
|
|
@xref{Optimize Options,,Options that Control Optimization}.
|
|
@example
|
|
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks
|
|
-fdelayed-branch -fexpensive-optimizations -ffast-math
|
|
-ffloat-store -fforce-addr -fforce-mem -finline
|
|
-finline-functions -fkeep-inline-functions
|
|
-fno-defer-pop -fno-function-cse -fomit-frame-pointer
|
|
-frerun-cse-after-loop -fschedule-insns -fschedule-insns2
|
|
-fstrength-reduce -fthread-jumps
|
|
-funroll-all-loops -funroll-loops
|
|
-O -O2
|
|
@end example
|
|
|
|
@item Preprocessor Options
|
|
@xref{Preprocessor Options,,Options Controlling the Preprocessor}.
|
|
@example
|
|
-C -dD -dM -dN
|
|
-D@var{macro}@r{[}=@var{defn}@r{]} -E -H
|
|
-include @var{file} -imacros @var{file}
|
|
-M -MD -MM -MMD -nostdinc -P -trigraphs -U@var{macro}
|
|
@end example
|
|
|
|
@item Linker Options
|
|
@xref{Link Options,,Options for Linking}.
|
|
@example
|
|
@var{object-file-name}
|
|
-l@var{library} -nostdlib -static
|
|
@end example
|
|
|
|
@item Directory Options
|
|
@xref{Directory Options,,Options for Directory Search}.
|
|
@example
|
|
-B@var{prefix} -I@var{dir} -I- -L@var{dir}
|
|
@end example
|
|
|
|
@item Target Options
|
|
@xref{Target Options,,Target Machine and Compiler Version}.
|
|
@example
|
|
-b @var{machine} -V @var{version}
|
|
@end example
|
|
|
|
@item Machine Dependent Options
|
|
@xref{Submodel Options,,Hardware Models and Configurations}.
|
|
@example
|
|
@emph{M680x0 Options}
|
|
-m68000 -m68020 -m68881 -mbitfield -mc68000 -mc68020 -mfpa
|
|
-mnobitfield -mrtd -mshort -msoft-float
|
|
|
|
@emph{VAX Options}
|
|
-mg -mgnu -munix
|
|
|
|
@emph{SPARC Options}
|
|
-mforce-align -mfpu -mno-epilogue
|
|
|
|
@emph{Convex Options}
|
|
-margcount -mc1 -mc2 -mnoargcount
|
|
|
|
@emph{AMD29K Options}
|
|
-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge
|
|
-mnbw -mnodw -msmall -mstack-check -muser-registers
|
|
|
|
@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-underscores
|
|
-mocs-debug-info -mocs-frame-position -moptimize-arg-area
|
|
-mshort-data-@var{num} -msvr3 -msvr4 -mtrap-large-shift
|
|
-muse-div-instruction -mversion-03.00 -mwarn-passed-structs
|
|
|
|
@emph{RS/6000 Options}
|
|
-mfp-in-toc -mno-fop-in-toc
|
|
|
|
@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}
|
|
-mcpu=@var{cpu type} -mips2 -mips3 -mint64 -mlong64 -mlonglong128
|
|
-mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats
|
|
-mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile
|
|
-msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic
|
|
-mno-half-pic -G @var{num} -nocpp
|
|
|
|
@emph{i386 Options}
|
|
-m486 -msoft-float
|
|
@end example
|
|
|
|
@item Code Generation Options
|
|
@xref{Code Gen Options,,Options for Code Generation Conventions}.
|
|
@example
|
|
-fcall-saved-@var{reg} -fcall-used-@var{reg} -ffixed-@var{reg}
|
|
-fno-common -fpcc-struct-return -fpic -fPIC -fshared-data
|
|
-fshort-enums -fshort-double -fvolatile
|
|
@end example
|
|
|
|
@end table
|
|
|
|
@menu
|
|
* Overall Options:: Controlling the kind of output:
|
|
an executable, object files, assembler files,
|
|
or preprocessed source.
|
|
* Dialect Options:: Controlling the variant of C language compiled.
|
|
* 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.
|
|
* 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.
|
|
@end menu
|
|
|
|
@node Overall Options, Dialect Options, Invoking GCC, Invoking GCC
|
|
@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}.m
|
|
Objective-C source code
|
|
|
|
@item @var{file}.h
|
|
C header file (not to be compiled or linked).
|
|
|
|
@item @var{file}.cc
|
|
@itemx @var{file}.cxx
|
|
@itemx @var{file}.C
|
|
C++ source code which must be preprocessed.
|
|
|
|
@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 choosing a default based on the file name suffix).
|
|
This option applies to all following input files until
|
|
the next @samp{-x} option. Possible values of @var{language} are
|
|
@samp{c}, @samp{objective-c}, @samp{c-header}, @samp{c++},
|
|
@samp{cpp-output}, @samp{assembler}, and @samp{assembler-with-cpp}.
|
|
|
|
@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 Dialect Options, Warning Options, Overall Options, Invoking GCC
|
|
@section Options Controlling Dialect
|
|
@cindex dialect options
|
|
@cindex language dialect options
|
|
@cindex options, dialect
|
|
|
|
The following options control the dialect of 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 disallows @samp{$} as part of
|
|
identifiers.
|
|
|
|
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 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. These words may then be used as identifiers. You can
|
|
use @code{__asm__}, @code{__inline__} and @code{__typeof__} instead.
|
|
@samp{-ansi} implies @samp{-fno-asm}.
|
|
|
|
@item -fno-builtin
|
|
Don't recognize built-in functions that do not begin with two leading
|
|
underscores. Currently, the functions affected include @code{alloca},
|
|
@code{abort}, @code{exit}, @code{_exit}, @code{abs}, @code{fabs},
|
|
@code{labs}, @code{memcpy}, @code{memcmp}, @code{strcmp},
|
|
@code{strcpy}, @code{strlen}, and @code{sqrt}.
|
|
|
|
The @samp{-ansi} option prevents @code{alloca} and @code{_exit} from
|
|
being builtin functions.
|
|
|
|
@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 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
|
|
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
|
|
In the preprocessor, comments convert to nothing at all, rather than
|
|
to a space. This allows traditional token concatenation.
|
|
|
|
@item
|
|
In the preprocessor, 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
|
|
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.
|
|
@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.
|
|
|
|
@item -traditional-cpp
|
|
Attempt to support some aspects of traditional C preprocessors.
|
|
This includes the last three items in the table immediately above,
|
|
but none of the other effects of @samp{-traditional}.
|
|
|
|
@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,
|
|
@samp{-fno-signed-char} is equivalent to @samp{-funsigned-char}.
|
|
|
|
@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. @samp{-traditional} also has this
|
|
effect.
|
|
|
|
Writing into string constants is a very bad idea; ``constants'' should
|
|
be constant.
|
|
@end table
|
|
|
|
@node Warning Options, Debugging Options, Dialect Options, Invoking GCC
|
|
@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 emit any output.
|
|
|
|
@item -w
|
|
Inhibit all warning messages.
|
|
|
|
@item -Wno_import
|
|
Inhibit warning messages about the use of @samp{#import}.
|
|
|
|
@item -pedantic
|
|
Issue all the warnings demanded by strict ANSI standard C; reject
|
|
all programs that use forbidden extensions.
|
|
|
|
Valid ANSI standard 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 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
|
|
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:
|
|
|
|
@example
|
|
foo (a)
|
|
@{
|
|
if (a > 0)
|
|
return a;
|
|
@}
|
|
@end example
|
|
|
|
@item
|
|
An expression-statement contains no side effects.
|
|
|
|
@item
|
|
An unsigned value is compared against zero with @samp{>} or @samp{<=}.
|
|
@end itemize
|
|
|
|
@item -Wimplicit
|
|
Warn whenever a function or parameter is implicitly declared.
|
|
|
|
@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 -Wunused
|
|
Warn whenever a local variable is unused aside from its declaration,
|
|
whenever a function is declared static but never defined, and whenever
|
|
a statement computes a result that is explicitly not used.
|
|
|
|
@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 -Wcomment
|
|
Warn whenever a comment-start sequence @samp{/*} appears in a comment.
|
|
|
|
@item -Wtrigraphs
|
|
Warn if any trigraphs are encountered (assuming they are enabled).
|
|
|
|
@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 -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 -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:
|
|
|
|
@example
|
|
@{
|
|
int x;
|
|
switch (y)
|
|
@{
|
|
case 1: x = 1;
|
|
break;
|
|
case 2: x = 4;
|
|
break;
|
|
case 3: x = 5;
|
|
@}
|
|
foo (x);
|
|
@}
|
|
@end example
|
|
|
|
@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:
|
|
|
|
@example
|
|
@{
|
|
int save_y;
|
|
if (change_y) save_y = y, y = new_y;
|
|
@dots{}
|
|
if (change_y) y = save_y;
|
|
@}
|
|
@end example
|
|
|
|
@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 as
|
|
@code{volatile} all the functions you use that never return.
|
|
@xref{Function Attributes}.
|
|
|
|
@item -Wparentheses
|
|
Warn if parentheses are omitted in certain contexts.
|
|
|
|
@item -Wall
|
|
All of the above @samp{-W} options combined. These are all the
|
|
options which pertain to usage that we recommend avoiding and that we
|
|
believe is easy to avoid, even in conjunction with macros.
|
|
@end table
|
|
|
|
The remaining @samp{-W@dots{}} options are not implied by @samp{-Wall}
|
|
because they warn about constructions that we consider reasonable to
|
|
use, on occasion, in clean programs.
|
|
|
|
@table @code
|
|
@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 -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 -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 -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.
|
|
|
|
@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 -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 -Werror
|
|
Make all warnings into errors.
|
|
@end table
|
|
|
|
@node Debugging Options, Optimize Options, Warning Options, Invoking GCC
|
|
@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 DBX crash or
|
|
refuse to read the program. If you want to control for certain whether
|
|
to generate the extra information, use @samp{-gstabs+} or @samp{-gstabs}
|
|
(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 in the native format (if that is 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.
|
|
|
|
@item -gstabs+
|
|
Produce debugging information in stabs format (if that is supported),
|
|
using GDB extensions. The use of these extensions is likely to make DBX
|
|
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 COFF systems.
|
|
|
|
@item -gxcoff
|
|
Produce debugging information in XCOFF format (if that is supported).
|
|
This is the format used on IBM RS/6000 systems.
|
|
|
|
@item -gdwarf
|
|
Produce debugging information in DWARF format (if that is supported).
|
|
This is the format used by SDB on systems that use DWARF.
|
|
|
|
@item -g@var{level}
|
|
@itemx -ggdb@var{level}
|
|
@itemx -gstabs@var{level}
|
|
@itemx -gcoff@var{level}
|
|
@itemx -gxcoff@var{level}
|
|
@itemx -gdwarf@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}.
|
|
@c ??? looks like -p and -pg are now equivalent. Are they? 11dec91
|
|
|
|
@cindex @code{gprof}
|
|
@item -pg
|
|
Generate extra code to write profile information suitable for the
|
|
analysis program @code{gprof}.
|
|
|
|
@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.
|
|
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 -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 M
|
|
Dump all macro definitions, at the end of preprocessing, and write no
|
|
output.
|
|
@item N
|
|
Dump all macro names, at the end of preprocessing.
|
|
@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 L
|
|
Dump after loop optimization, to @file{@var{file}.loop}.
|
|
@item t
|
|
Dump after the second CSE pass (including the jump optimization that
|
|
sometimes follows CSE), to @file{@var{file}.cse2}.
|
|
@item f
|
|
Dump after flow analysis, to @file{@var{file}.flow}.
|
|
@item c
|
|
Dump after instruction combination, to @file{@var{file}.combine}.
|
|
@item S
|
|
Dump after the first instruction scheduling pass, to
|
|
@file{@var{file}.sched}.
|
|
@item l
|
|
Dump after local register allocation, to @file{@var{file}.lreg}.
|
|
@item g
|
|
Dump after global register allocation, to @file{@var{file}.greg}.
|
|
@item R
|
|
Dump after the second instruction scheduling pass, to
|
|
@file{@var{file}.sched2}.
|
|
@item J
|
|
Dump after last jump optimization, to @file{@var{file}.jump2}.
|
|
@item d
|
|
Dump after delayed branch scheduling, to @file{@var{file}.dbr}.
|
|
@item k
|
|
Dump after conversion from registers to stack, to @file{@var{file}.stack}.
|
|
@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.
|
|
@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}.
|
|
@end table
|
|
|
|
@node Optimize Options, Preprocessor Options, Debugging Options, Invoking GCC
|
|
@section Options That Control Optimization
|
|
@cindex optimize options
|
|
@cindex options, optimization
|
|
|
|
These options control various sorts of optimizations:
|
|
|
|
@table @code
|
|
@item -O
|
|
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}, only variables declared @code{register} are
|
|
allocated 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 @samp{-O} is specified, @samp{-fthread-jumps} and
|
|
@samp{-fdelayed-branch} are turned on. On some machines other
|
|
flags may also be turned on.
|
|
|
|
@item -O2
|
|
Optimize even more. Nearly all supported optimizations that do not
|
|
involve a space-speed tradeoff are performed. As compared to @samp{-O},
|
|
this option increases both compilation time and the performance of the
|
|
generated code.
|
|
|
|
@samp{-O2} turns on all @samp{-f@var{flag}} options that enable more
|
|
optimization, except for @samp{-funroll-loops},
|
|
@samp{-funroll-all-loops} and @samp{-fomit-frame-pointer}.
|
|
@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. This
|
|
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.
|
|
|
|
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-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 may produce better code by making all
|
|
memory references potential common subexpressions. When they are
|
|
not common subexpressions, instruction combination should
|
|
eliminate the separate register-load. I am interested in hearing
|
|
about the difference this makes.
|
|
|
|
@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. I am interested in hearing about the
|
|
difference this makes.
|
|
|
|
@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.
|
|
|
|
@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.
|
|
|
|
@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/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.
|
|
|
|
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
|
|
|
|
|
|
|
|
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}. The @samp{-O} option usually turns on
|
|
the @samp{-fthread-jumps} and @samp{-fdelayed-branch} options, but
|
|
specific machines may change the default optimizations.
|
|
|
|
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 -fexpensive-optimizations
|
|
Perform a number of minor optimizations that are relatively expensive.
|
|
|
|
@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 -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 @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} and @samp{-frerun-cse-after-loop}.
|
|
|
|
@item -fno-peephole
|
|
Disable any machine-specific peephole optimizations.
|
|
@end table
|
|
|
|
@node Preprocessor Options, Link Options, Optimize Options, Invoking GCC
|
|
@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 -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 -nostdinc++
|
|
Do not search for header files in the C++-specific standard directories,
|
|
but do still search the other standard directories.
|
|
(This option is used when building @samp{libg++}.)
|
|
|
|
@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} commands.
|
|
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 files
|
|
@samp{#include}d in it. 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 files with
|
|
names made by replacing @samp{.c} with @samp{.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.
|
|
|
|
The Mach utility @samp{md} can be used to merge the @samp{.d} 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 -H
|
|
Print the name of each header file used, in addition to other normal
|
|
activities.
|
|
|
|
@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. You don't want to know about this
|
|
brain-damage. The @samp{-ansi} option also has this effect.
|
|
@end table
|
|
|
|
@node Link Options, Directory Options, Preprocessor Options, Invoking GCC
|
|
@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 -nostdlib
|
|
Don't use the standard system libraries and startup files when linking.
|
|
Only the files you specify will be passed to the linker.
|
|
|
|
@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. Only a few systems support 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.
|
|
@end table
|
|
|
|
@node Directory Options, Target Options, Link Options, Invoking GCC
|
|
@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}
|
|
Append directory @var{dir} to the list of directories searched for
|
|
include files.
|
|
|
|
@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 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.
|
|
|
|
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}.
|
|
@end table
|
|
|
|
@node Target Options, Submodel Options, Directory Options, Invoking GCC
|
|
@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 controlled
|
|
by the way GNU CC is installed. Normally, it will be a version that
|
|
is recommended for general use.
|
|
@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
|
|
|
|
It follows that 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). Thus, if
|
|
@file{/usr/local/lib/gcc-lib/80386} is a link to
|
|
@file{/usr/local/lib/gcc-lib/i386v}, then @samp{-b 80386} will be an alias
|
|
for @samp{-b i386v}.@refill
|
|
|
|
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, Code Gen Options, Target Options, Invoking GCC
|
|
@section Specifying 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.
|
|
|
|
@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::
|
|
* M88K Options::
|
|
* RS/6000 Options::
|
|
* RT Options::
|
|
* MIPS Options::
|
|
* i386 Options::
|
|
@end menu
|
|
|
|
@node M680x0 Options, Vax Options, Submodel Options, Submodel 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 -m68020
|
|
@itemx -mc68020
|
|
Generate output for a 68020 (rather than a 68000). This is the
|
|
default when the compiler is configured for 68020-based systems.
|
|
|
|
@item -m68000
|
|
@itemx -mc68000
|
|
Generate output for a 68000 (rather than a 68020). This is the default
|
|
when the compiler is configured for a 68000-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 -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 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 -mshort
|
|
Consider type @code{int} to be 16 bits wide, like @code{short int}.
|
|
|
|
@item -mnobitfield
|
|
Do not use the bit-field instructions. @samp{-m68000} implies
|
|
@samp{-mnobitfield}.
|
|
|
|
@item -mbitfield
|
|
Do use the bit-field instructions. @samp{-m68020} implies
|
|
@samp{-mbitfield}. This is the default if you use the unmodified
|
|
sources configured 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 and 68020
|
|
processors, but not by the 68000.
|
|
@end table
|
|
|
|
@node VAX Options, Sparc Options, M680x0 Options, Submodel 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, Convex Options, Vax Options, Submodel Options
|
|
@subsection SPARC Options
|
|
@cindex SPARC options
|
|
|
|
These @samp{-m} switches are supported on the Sparc:
|
|
|
|
@table @code
|
|
@ignore
|
|
@item -mfpu
|
|
Generate output containing floating point instructions. This is the
|
|
default if you use the unmodified sources.
|
|
|
|
@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.
|
|
@end ignore
|
|
|
|
@item -mforce-align
|
|
Make sure all objects of type @code{double} are 8-byte aligned in memory
|
|
and use double-word instructions to reference them.
|
|
|
|
@item -mno-epilogue
|
|
Generate separate return instructions for @code{return} statements.
|
|
This has both advantages and disadvantages; I don't recall what they
|
|
are.
|
|
@end table
|
|
|
|
@node Convex Options, AMD29K Options, SPARC Options, Submodel Options
|
|
@subsection Convex Options
|
|
@cindex Convex options
|
|
|
|
These @samp{-m} options are defined for the Convex:
|
|
|
|
@table @code
|
|
@item -mc1
|
|
Generate output for a C1. This is the default when the compiler is
|
|
configured for a C1.
|
|
|
|
@item -mc2
|
|
Generate output for a C2. This is the default when the compiler is
|
|
configured for a C2.
|
|
|
|
@item -margcount
|
|
Generate code which puts an argument count in the word preceding each
|
|
argument list. Some nonportable Convex and Vax programs need this word.
|
|
(Debuggers don't, except for functions with variable-length argument
|
|
lists; this info is in the symbol table.)
|
|
|
|
@item -mnoargcount
|
|
Omit the argument count word. This is the default if you use the
|
|
unmodified sources.
|
|
@end table
|
|
|
|
@node AMD29K Options, M88K Options, Convex Options, Submodel Options
|
|
@subsection AMD29K Options
|
|
@cindex AMD29K options
|
|
|
|
These @samp{-m} options are defined for the AMD Am29000:
|
|
|
|
@table @code
|
|
@item -mdw
|
|
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 -mnodw
|
|
Generate code that assumes the @code{DW} bit is not set.
|
|
|
|
@item -mbw
|
|
Generate code that assumes the system supports byte and halfword write
|
|
operations. This is the default.
|
|
|
|
@item -mnbw
|
|
Generate code that assumes the systems does not support byte and
|
|
halfword write operations. @samp{-mnbw} implies @samp{-mnodw}.
|
|
|
|
@item -msmall
|
|
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 -mlarge
|
|
Do not assume that the @code{call} instruction can be used; this is the
|
|
default.
|
|
|
|
@item -m29050
|
|
Generate code for the Am29050.
|
|
|
|
@item -m29000
|
|
Generate code for the Am29000. This is the default.
|
|
|
|
@item -mkernel-registers
|
|
Generate references to registers @code{gr64-gr95} instead of
|
|
@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
|
|
Use the normal set of global registers, @code{gr96-gr127}. This is the
|
|
default.
|
|
|
|
@item -mstack-check
|
|
Insert a call to @code{__msp_check} after each stack adjustment. This
|
|
is often used for kernel code.
|
|
@end table
|
|
|
|
@node M88K Options, RS/6000 Options, AMD29K Options, Submodel 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 tha
|
|
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 -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 to store function arguments in stack frames.
|
|
@samp{-moptimize-arg-area} saves space, but was ruled illegal by 88open.
|
|
@samp{-mno-optimize-arg-area} conforms to the 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 -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 (which you can select
|
|
independently using @samp{-mversion-03.00}).
|
|
@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{-msvr3} is the default for all m88K configurations except
|
|
the SVr4 configuration.
|
|
|
|
@item -mversion-03.00
|
|
@kindex -mversion-03.00
|
|
In the DG/UX configuration, there are two flavors of SVr4. This option
|
|
modifies @samp{-msvr4} to select whether the hybrid-COFF or real-ELF
|
|
flavor is used. All other configurations ignore this option.
|
|
@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
|
|
Early models of the 88K architecture had problems with division by zero;
|
|
in particular, many of them didn't trap. Use these options to avoid
|
|
including (or to include explicitly) additional code to detect division
|
|
by zero and signal an exception. All GNU CC configurations for the 88K use
|
|
@samp{-mcheck-zero-division} by default.
|
|
|
|
@item -muse-div-instruction
|
|
@kindex -muse-div-instruction
|
|
@cindex divide instruction, 88k
|
|
Do not emit code to check both the divisor and dividend when doing
|
|
signed integer division to see if either is negative, and adjust the
|
|
signs so the divide is done using non-negative numbers. Instead, rely
|
|
on the operating system to calculate the correct value when the
|
|
@code{div} instruction traps. This results in different behavior when
|
|
the most negative number is divided by -1, but is useful when most or
|
|
all signed integer divisions are done with positive numbers.
|
|
|
|
@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 Options, RT Options, M88K Options, Submodel Options
|
|
@subsection IBM RS/6000 Options
|
|
@cindex RS/6000 Options
|
|
@cindex IBM RS/6000 Options
|
|
|
|
Only one pair of @samp{-m} options is defined for the IBM RS/6000:
|
|
|
|
@table @code
|
|
@item -mfp-in-toc
|
|
@itemx -mno-fp-in-toc
|
|
Control whether or not floating-point constants go in the Table of
|
|
Contents (TOC), a table of all global variable and function addresses. By
|
|
default GNU CC puts floating-point constants there; if the TOC overflows,
|
|
@samp{-mno-fp-in-toc} will reduce the size of the TOC, which may avoid
|
|
the overflow.
|
|
@end table
|
|
|
|
@node RT Options, MIPS Options, RS/6000 Options, Submodel 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 @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 either @samp{-fpcc-struct-return} or
|
|
@samp{-mhc-struct-return}.
|
|
@end table
|
|
|
|
@node MIPS Options, i386 Options, RT Options, Submodel 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 default @var{cpu type} is
|
|
@samp{default}, which picks the longest cycles times for any of the
|
|
machines, in order that the code run at reasonable rates on all MIPS
|
|
cpu's. Other choices for @var{cpu type} are @samp{r2000},
|
|
@samp{r3000}, @samp{r4000}, 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 -mips2
|
|
Issue instructions from level 2 of the MIPS ISA (branch likely, square
|
|
root instructions). The @samp{-mcpu=r4000} or @samp{-mcpu=r6000}
|
|
switch must be used in conjunction with @samp{-mips2}.
|
|
|
|
@item -mips3
|
|
Issue instructions from level 3 of the MIPS ISA (64 bit instructions).
|
|
You must use the @samp{-mcpu=r4000} switch along with @samp{-mips3}.
|
|
|
|
@item -mint64
|
|
@item -mlong64
|
|
@item -mlonglong128
|
|
These options don't work at present.
|
|
|
|
@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.
|
|
|
|
@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 GNU assembler does not support the
|
|
@samp{-mrnames} switch, and the MIPS assembler will be instructed to
|
|
run the MIPS C preprocessor over the source file. The
|
|
@samp{-mno-rnames} switch is default.
|
|
|
|
@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 -mfp64
|
|
Assume that the @var{FR} bit in the status word is on, and that there
|
|
are 32 64-bit floating point registers, instead of 32 32-bit floating
|
|
point registers. You must also specify the @samp{-mcpu=r4000} and
|
|
@samp{-mips3} switches.
|
|
|
|
@item -mfp32
|
|
Assume that there are 32 32-bit floating point registers. This is the
|
|
default.
|
|
|
|
@item -mabicalls
|
|
@itemx -mno-abicalls
|
|
Emit the @samp{.abicalls}, @samp{.cpload}, and @samp{.cprestore}
|
|
pseudo operations that some System V.4 ports use for position
|
|
independent code.
|
|
|
|
@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. These options
|
|
do not work at present.
|
|
|
|
@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 it's 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, , MIPS Options, Submodel 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 -m486
|
|
@itemx -mno486
|
|
Control whether or not code is optimized for a 486 instead of an
|
|
386. Code generated for an 486 will run on a 386 and vice versa.
|
|
|
|
@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 returnings float point results in the 80387
|
|
register stack, some floating point opcodes may be emitted even if
|
|
@samp{-msoft-float} is used.
|
|
@end table
|
|
|
|
@node Code Gen Options, Environment Variables, Submodel Options, Invoking GCC
|
|
@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 -fpcc-struct-return
|
|
Use the same convention for returning @code{struct} and @code{union}
|
|
values that is used by the usual C compiler on your system. This
|
|
convention is less efficient for small structures, and on many
|
|
machines it fails to be reentrant; but it has the advantage of
|
|
allowing intercallability between GNU CC-compiled code and PCC-compiled
|
|
code.
|
|
|
|
@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
|
|
Don't 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 ``collect'' program and a non-GNU linker.
|
|
|
|
@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).
|
|
|
|
@item -fvolatile
|
|
Consider all memory references through pointers to be volatile.
|
|
|
|
@item -fpic
|
|
@cindex global offset table
|
|
If supported for the target machines, generate position-independent
|
|
code, suitable for use in a shared library. All addresses will be
|
|
accessed through a global offset table (GOT). If the GOT size for the
|
|
linked executable exceeds a machine-specific maximum size, you will get
|
|
an error message from the linker indicating that @samp{-fpic} does not
|
|
work; 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. Code generated for the IBM RS/6000 is always
|
|
position-independent.
|
|
|
|
The GNU assembler does not fully support PIC. Currently, you must use
|
|
some other assembler in order for PIC to work. We would welcome
|
|
volunteers to upgrade GAS to handle this; the first part of the job is
|
|
to figure out what the assembler must do differently.
|
|
|
|
@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 allocatable 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 allocatable 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.
|
|
@end table
|
|
|
|
@node Environment Variables,, Code Gen Options, Invoking GCC
|
|
@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.
|
|
|
|
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}. 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
|