Contents|Index|Previous|Next
PowerPC
development
The following documentation discusses
cross-development with the PowerPC targets.
Cross-development tools in the GNUPro Toolkit
are normally installed with names that reflect the target machine, so that
you can install more than one set of tools in the same binary directory.
The target name, constructed with the --target option to configure
, is used as a prefix to the program name. For example, the compiler for
the PowerPC (gcc in native configurations) is called,
depending on which configuration you have installed, by powerpc-eabi-gcc.
The following processors are supported
for the PowerPC targets.
|
603(e)
|
|
604
|
|
604(e)
|
|
821
|
|
860
|
Compiling
for PowerPC targets
The PowerPC target family toolchain controls
variances in code generation directly from the command line.
When you run gcc, you can use
command-line options to choose whether to take advantage of the extra PowerPC
machine instructions, and whether to generate code for hardware or software
floating point.
When you run gcc, you can use
command-line options to choose machine-specific details.
The following -m options are defined
for the PowerPC.
-mpower
-mno-power
-mpower2
-mno-power2
-mpowerpc
-mno-powerpc
-mpowerpc-gpopt
-mno-powerpc-gpopt
-mpowerpc-gfxopt
-mno-powerpc-gfxopt
GNU CC supports two related instruction set architectures
for the IBM RS/6000 and PowerPC. The POWER instruction set are those instructions
supported by the rios chip set used in the original RS/6000 systems
and the PowerPC instruction set is the architecture of the Motorola MPC5xx,
MPC6xx, MCP8xx and the IBM 4xx microprocessors. The
PowerPC architecture defines 64-bit instructions, but they are not supported
by any current processors.
Neither architecture is a subset
of the other. However there is a large common subset of instructions supported
by both. An MQ register is included in processors supporting the POWER
architecture.
You use these options to specify
which instructions are available on the processor you are using. The default
value of these options is determined when configuring GNU CC. Specifying
the -mcpu=cpu_type overrides the specification of these
options.
We recommend you use the -mcpu=cpu_type
option rather than any of these options.
The -mpower option allows
GNU CC to generate instructions that are found only in the POWER architecture
and to use the MQ register. Specifying -mpower2 implies -power
and
also allows GNU CC to generate instructions that are present in the POWER2
architecture but not the original POWER architecture.
The -mpowerpc option
allows GNU CC to generate instructions that are found only in the 32-bit
subset of the PowerPC architecture. Specifying -mpowerpc-gpopt implies
-mpowerpc
and
also allows GNU CC to use the optional PowerPC architecture instructions
in the General Purpose group, including floating-point square root. Specifying
-mpowerpc-gfxopt
implies
-mpowerpc and also allows GNU CC to use the optional PowerPC architecture
instructions in the Graphics group, including floating-point select.
If you specify both -mno-power
and
-mno-powerpc
,
GNU CC will use only the instructions in the common subset of both architectures
plus some special AIX common-mode calls, and will not use the MQ register.
Specifying both -mpower and
-mpowerpc
permits GNU CC
to use any instruction from either architecture and to allow use of the
MQ register; specify this for the Motorola MPC601.
-mnew-mnemonics
-mold-mnemonics
Select which mnemonics to use in the generated assembler
code.
-mnew-mnemonics requests
output that uses the assembler mnemonics defined for the PowerPC architecture,
while -mold-mnemonics requests the assembler mnemonics defined
for the POWER architecture. Instructions defined in only one architecture
have only one mnemonic; GNU CC uses that mnemonic irrespective of which
of these options is specified.
PowerPC assemblers support both
the old and new mnemonics, as will later POWER assemblers. Current POWER
assemblers only support the old mnemonics. Specify -mnew-mnemonics
if
you have an assembler that supports them, otherwise specify -mold-mnemonics
.
The default value of these options
depends on how GNU CC was configured. Specifying -mcpu=cpu_type
sometimes overrides the value of these option. Unless you are building
a cross-compiler, you should normally not specify either -mnew-mnemonics
or -mold-mnemonics , but should instead accept the default.
-mcpu=cpu_type
Set architecture type, register usage, choice of mnemonics,
and instruction scheduling parameters for machine type, cpu_type.
Supported values for cpu_type are rs6000, rios1,
rios2,
rsc,
601,
602, 603,
603e,
604,
604e,
620, power,
power2,
powerpc,
403,
505, 801,
821,
823, 860 and
common.
The -mcpu=power, -mcpu=power2,
and -mcpu=powerpc specify generic POWER, POWER2 and pure PowerPC
(i.e., not MPC601) architecture machine types, with an appropriate, generic
processor model assumed for scheduling purposes.
Specifying -mcpu=rios1,
-mcpu=rios2,
-mcpu=rsc,
-mcpu=power,
or -mcpu=power2 enables the -mpower option and disables
the -mpowerpc option;
-mcpu=601 enables both the -mpower
and -mpowerpc options; -mcpu=602,
-mcpu=603,
-mcpu=603e, -mcpu=604,
-mcpu=620 ; -mcpu=403,
-mcpu=505, -mcpu=821,
-mcpu=860 and -mcpu=powerpc
enable the -mpowerpc option and disable the -mpower option;
-mcpu=common disables both the -mpower and -mpowerpc
options.
IBM AIX versions 4 or greater
selects -mcpu=common by default, so that code will operate on
all members of the IBM RS/6000 and PowerPC families. In that case, GNU
CC will use only the instructions in the common subset of both architectures
plus some special AIX common-mode calls, and will not use the MQ register.
GNU CC assumes a generic processor model for scheduling purposes.
Specifying -mcpu=rios1,
-mcpu=rios2,
-mcpu=rsc,
-mcpu=power,
or -mcpu=power2
also disables the new-mnemonics option.
Specifying -mcpu=601
, -mcpu=602, -mcpu=603,
-mcpu=603e, -mcpu=604
, -mcpu=620, -mcpu=403, or -mcpu=powerpc also
enables the new-mnemonics option.
Specifying -mcpu=403
, -mcpu=821, or
-mcpu=860 also enables the -msoft-float
option.
-mtune=cpu_type
Set the instruction scheduling parameters for machine
type, cpu_type, but do not set the architecture type, register
usage, choice of mnemonics like -mcpu=cpu_type would. The
same values for cpu_type are used for -mtune=cpu_type
as for -mcpu=cpu_type . The -mtune=cpu_type
option overrides the -mcpu=cpu_type option in terms of
instruction scheduling parameters.
-mfull-toc
-mno-fp-in-toc
-mno-sum-in-toc
-mminimal-toc
Modify generation of the TOC (Table Of Contents), which
is created for every executable file. The -mfull-toc option is
selected by default. In that case, GNU CC will allocate at least one TOC
entry for each unique non-automatic variable reference in your program.
GNU CC will also place floating-point constants in the TOC. However, only
16,384 entries are available in the TOC.
If you receive a linker error
message that saying you have overflowed the available TOC space, you can
reduce the amount of TOC space used with the -mno-fp-in-toc and
-mno-sum-in-toc
options.
-mno-fp-in-toc prevents
GNU CC from putting floating-point constants in the TOC and -mno-sum-in-toc
forces GNU CC to generate code to calculate the sum of an address and a
constant at run-time instead of putting that sum into the TOC.
You may specify one or both of these options. Each causes
GNU CC to produce very slightly slower and larger code at the expense of
conserving TOC space.
If you still run out of space
in the TOC even when you specify both of these options, specify -mminimal-toc
instead. This option causes GNU CC to make only one TOC entry for every
file. When you specify this option, GNU CC will produce code that is slower
and larger but which uses extremely little TOC space. You may wish to use
this option only on files that contain less frequently executed code.
-msoft-float
-mhard-float
Generate code that does not use or does use the floating-point
register set. Software floating point emulation is provided if you use
the -msoft-float option, and pass the option to GNU CC when linking.
-mmultiple
-mno-multiple
Generate code that uses (does not use) the load multiple
word instructions and the store multiple word instructions. These instructions
are generated by default on POWER systems, and not generated on PowerPC
systems. Do not use -mmultiple on little endian PowerPC systems,
since those instructions do not work when the processor is in little endian
mode.
-mstring
-mno-string
Generate code that uses (does not use) the load string
instructions and the store string word instructions to save multiple registers
and do small block moves. These instructions are generated by default on
POWER systems, and not generated on PowerPC systems.
Do not use -mstring on little endian PowerPC
systems, since those instructions do not work when the processor is in
little endian mode.
-mupdate
-mno-update
Generate code that uses (or does not use) the load or
store instructions that update the base register to the address of the
calculated memory location. These instructions are generated by default.
If you use -mno-update
, there is a small window between the time that the stack pointer is updated
and the address of the previous frame is stored, which means code that
walks the stack frame across interrupts or signals may get corrupted data.
-mfused-madd
-mno-fused-madd
Generate code that uses (does not use) the floating point
multiply and accumulate instructions. These instructions are generated
by default if hardware floating is used.
-mno-bit-align
-mbit-align
On System V.4 and embedded PowerPC systems do not and
do force structures and unions containing bit fields aligned to the base
type of the bit field. For example, by default a structure containing nothing
but 8 unsigned bitfields of length 1 would be aligned to a 4 byte boundary
and have a size of 4 bytes. By using -mno-bit-align, the structure
would be aligned to a 1 byte boundary and be one byte in size.
-mno-strict-align
-mstrict-align
On System V.4 and embedded PowerPC systems do not (do)
assume that unaligned memory references will be handled by the system.
-mrelocatable
-mno-relocatable
On embedded PowerPC systems generate code that allows
(does not allow) the program to be relocated to a different address at
runtime. If you use -mrelocatable on any module, all objects linked
together must be compiled with -mrelocatable or -mrelocatable-lib.
-mrelocatable-lib
-mno-relocatable-lib
On embedded PowerPC systems generate code that allows
(does not allow) the program to be relocated to a different address at
runtime. Modules compiled with -mreloctable-lib can be linked
with either modules compiled without -mrelocatable and -mrelocatable-lib
or with modules compiled with the -mrelocatable options.
-mno-toc
-mtoc
On System V.4 and embedded PowerPC systems do not (do)
assume that register 2 contains a pointer to a global area pointing to
the addresses used in the program.
-mno-traceback
-mtraceback
On embedded PowerPC systems do not (do) generate a trace-back
tag before the start of the function. This tag can be used by the debugger
to identify where the start of a function is.
-mlittle
-mlittle-endian
On System V.4 and embedded PowerPC systems compile code
for the processor in little endian mode. The -mlittle-endian option
is the same as -mlittle .
-mbig
-mbig-endian
On System V.4 and embedded PowerPC systems compile code
for the processor in big endian mode. The -mbig-endian option
is the same as -mbig .
-mcall-sysv
On System V.4 and embedded PowerPC systems compile code
using calling conventions that adheres to the March 1995 draft of the System
V Application Binary Interface, PowerPC processor supplement. This is the
default unless you configured GCC using powerpc-*-eabiaix .
-mcall-sysv-eabi
Specify both -mcall-sysv and -meabi
options.
-mcall-sysv-noeabi
Specify both -mcall-sysv and -mnoeabi
options.
-mcall-aix
On System V.4 and embedded PowerPC systems compile code
using calling conventions that are similar to those used on AIX. This is
the default if you configured GCC using powerpc-*-eabiaix .
-mcall-solaris
On System V.4 and embedded PowerPC systems, compile code
for the Solaris operating system.
-mcall-linux
On System V.4 and embedded PowerPC systems, compile code
for the Linux operating system.
-mprototype
-mno-prototype
On System V.4 and embedded PowerPC systems assume that
all calls to variable argument functions are properly prototyped. Otherwise,
the compiler must insert an instruction before every non prototyped call
to set or clear bit 6 of the condition code register (CR) to indicate
whether floating point values were passed in the floating point registers
in case the function takes a variable arguments.
With -mprototype, only
calls to prototyped variable argument functions will set or clear the bit.
-msim
On embedded PowerPC systems, assume that the startup
module is called sim-crt0.o and the standard C libraries are libsim.a
and libc.a. This is default for powerpc-*-eabisim configurations.
-mmvme
On embedded PowerPC systems, assume that the startup
module is called mvme-crt0.o and the standard C libraries are
libmvme.a
and libc.a .
-memb
On embedded PowerPC systems, set the PPC_EMB
bit in the ELF flags header to indicate that eabi extended relocations
are used.
-mads
On embedded PowerPC systems, assume that the startup
module is called crt0.o and the standard C libraries are libads.a
and libc.a .
-myellowknife
On embedded PowerPC systems, assume that the startup
module is called crt0.o and ` libyk.a and ` libc.a
are the standard C libraries.
-meabi
-mno-eabi
On System V.4 and embedded PowerPC systems do (do not)
adhere to the Embedded Applications Binary Interface (EABI) which is a
set of modifications to the System V.4 specifications. Selecting -meabi
means that the stack is aligned to an 8 byte boundary, a function, __eabi,
is called to from main to set up the EABI environment, and the
-msdata
option can use both r2 and r13 to point to two separate
small data areas.
Selecting -mno-eabi
means that the stack is aligned to a 16 byte boundary, do not call an initialization
function from main, and the
-msdata option will only use r13 to point
to a single small data area. The -meabi option is on by default
if you configured GCC using one of the powerpc*-*-eabi* options.
-msdata=eabi
On System V.4 and embedded PowerPC systems, put small
initialized const global and static data in the .sdata2 section,
which is pointed to by register r2 . Put small initialized non-const
global and static data in the .sdata section, which is pointed
to by register r13 . Put small uninitialized global and static
data in the .sbss section, which is adjacent to the .sdata
section. The -msdata=eabi option is incompatible with the -mrelocatable
option. The -msdata=eabi option also sets the -memb option.
-msdata=sysv
-msdata=default
-msdata
On System V.4 and embedded PowerPC systems, if -meabi
is used, compile code the same as -msdata=eabi, otherwise compile
code the same as -msdata=sysv .
-msdata-data
On System V.4 and embedded PowerPC systems, put small
global and static data in the .sdata section. Put small uninitialized
global and static data in the .sbss section. Do not use register
r13
to address small data however.
-msdata=none
-mno-sdata
On embedded PowerPC systems, put all initialized global
and static data in the .data section, and all uninitialized data
in the .bss section.
-G num
On embedded PowerPC systems, put global and static items
less than or equal to num bytes into the small data or
bss sections instead of the normal data or bss section. By default, num
is 8. The ` -G num switch is also passed to the linker. All modules
should be compiled with the same -G num value.
-mregnames
-mno-regnames
On System V.4 and embedded PowerPC systems, do (do not)
emit register names in the assembly language output using symbolic forms.
Floating-point
subroutines for PowerPC
The following two kinds of floating point subroutines are
useful with the GNU compiler.
-
Software implementations of the basic functions (floating-point
multiply, divide, add, subtract), for use when there is no hardware floating-point
support.
-
General-purpose mathematical subroutines, included with implementation
of the standard C mathematical subroutine library. See Mathematical
functions (math.h) in GNUPro
Math Library in GNUPro Libraries.
Preprocessor
macro for PowerPC targets
GCC defines the preprocessor macro, __powerpc-eabi__,
for the PowerPC configurations.
Assembler
options for PowerPC targets
To use the GNU assembler to assemble GCC
output, configure GCC with the --with-gnu-as switch or with the
-mgas
option.
-mgas
Compile using the GNU assembler, gas, to assemble
GCC output.
-Wa
If you invoke the GNU assembler through the GNU C compiler
(version 2), you can use the -Wa option to pass arguments through
to the assembler. One common use of this option is to exploit the assembler
s listing features.
Assembler arguments that you
specify with GCC, -Wa must be separated from each other (and the
-Wa)
by commas, like the options, -alh and -L, in the following
example input, separate from -Wa.
powerpc-eabi-gcc -c -g -O -Wa,-alh, -L file.c
-L
The additional assembler option, -L, preserves
local labels, which may make the listing output more intelligible to humans.
For example, in the following
commandline, the assembler option, -ahl, requests a listing with
interspersed high-level language and assembly language.
powerpc-eabi-gcc -c -g -O -Wa,-alh,-L file.c
-L preserves local labels,
while the compiler debugging option, -g, gives the assembler the
necessary debugging information.
Use the following options to enable listing
output from the assembler. The letters after -a may be combined
into one option, such as -al .
-a
By itself, -a requests listings of high-level language
source, assembly language, and symbols.
-ah
Requests a high-level language listing.
-al
Request an output-program assembly listing.
Requests a symbol table listing.
-ad
Omits debugging directives from listing. High-level listings
require a compiler debugging option like -g, and assembly listings
(such as -al) requested.
Use the following listing-control assembler
directives to control the appearance of the listing output (if you do not
request listing output with one of the -a options, the following
listing-control directives have no effect).
.list
Turn on listings for further input.
.nolist
Turn off listings for further input.
.psize linecount, columnwidth
Describe the page size for your output (the default is
60,
200). gas generates form feeds after printing each group
of linecount lines. To avoid these automatic form feeds,
specify 0 as linecount. The variable input for
columnwidth
uses the same descriptive option.
.eject
Skip to a new page (issue a form feed).
.title
Use as the title (this is the second line of the listing
output, directly after the source file name and page number) when generating
assembly listings.
.sbttl
Use as the subtitle (this is the third line of the listing
output, directly after the title line) when generating assembly listings.
-an
Turn off all forms processing.
Debugging
PowerPC targets
The PowerPC-configured GNU debugger, GDB,
is called by powerpc-eabi-gdb.
GDB needs to know the following specifications
to talk to PowerPC targets.
-
Specifications for what you want to use one, such as target
remote, gdb s generic debugging protocol.
-
Specifications for what serial device connects your PowerPC
board (the first serial device available on your host is the default).
-
Specifications for what speed to use over the serial device.
Use the following GDB commands to specify
the connection to your target board.
target powerpc serial-device
To run a program on the board, start up GDB with the
name of your program as the argument. To connect to the board, use the
command, target interface serial-device, where interface
is an interface from the previous list of specifications and serial-device
is the name of the serial port connected to the board. If the program has
not already been downloaded to the board, you may use the load
command to download it. You can then use all the usual gdb commands.
For example, the following sequence connects to the target board through
a serial port, and loads and runs programs, designated here as prog,
through the debugger.
(gdb) target powerpc com1
|
...
|
breakinst () ../sparc-stub.c:975
|
975 }
|
(gdb) s
|
main () hello.c:50
|
50 writer(1, "Got to here\n");
|
(gdb)
|
target powerpc hostname
: portnumber
You can specify a TCP/IP connection instead of a serial
port, using the syntax, hostname : portnumber (assuming
your board, designated here as hostname, is connected,
for instance, to use a serial line, designated by portnumber,
managed by a terminal concentrator).
GDB also supports set remotedebug n.
You can see some debugging information about communications with the board
by setting the variable, remotedebug.
The following information applies to the
stack frame for the PowerPC.
-
The stack grows downwards from high addresses to low addresses.
-
A leaf function need not allocate a stack frame if it does
not need one.
-
A frame pointer need not be allocated.
-
The stack pointer shall always be aligned to 4 byte boundaries.
-
The register save area shall be aligned to a 4 byte boundary.
Stack frames for functions taking a fixed
number of arguments use the definitions in the following
chart. FP points to the same location
as SP.
Stack frames for functions that take a
variable number of arguments use the following definitions.
General Purpose Registers
|
Floating-Point Registers
|
Stack Frame Offset
|
r3: c
|
f1: ff
|
08: ptr to t
|
r4: d
|
f2: gg
|
0c: (padding)
|
r5: e
|
f3: hh
|
10: nn(lo)
|
r6: f
|
f4: ii
|
14: nn(hi)
|
r7: g
|
f5: jj
|
|
r8: h
|
f6: kk
|
|
r9: ptr to ld
|
f7: ll
|
|
r10: ptr to s
|
f8: mm
|
|
Integers, floating point values, and aggregates
of 8 bytes or less are returned in register r0 (and r1
if necessary).
Aggregates larger than 8 bytes are returned
by having the caller pass the address of a buffer to hold the value in
r0
as an invisible first argument. All arguments are then shifted down
by one. The address of this buffer is returned in r0 .