The GCC 3.4 release series fixed several cases in which earlier releases did not follow the proper calling conventions. These fixes unfortunately did not all happen in one release, so in certain rare cases code will be incompatible when using different compiler versions within the release series.
_Complex
integer types smaller than
_Complex long
, and _Complex
floating point
types smaller than _Complex double
were passed and
returned incorrectly in one register instead of the real and
imaginary components being in separate registers. This has been
fixed for PowerPC64 GNU/Linux and AIX, with PowerPC GNU/Linux and
Darwin opting to stay compatible with GCC 3.3.-mabi=altivec
, PowerPC64 GNU/Linux used to
pass vector arguments to non-prototyped functions only in vector
registers. Without a prototype the argument is supposed to be
passed in both vector registers and in general purpose registers or
on the stack.-mabi=no-altivec
, vector parameters were not
aligned, and wrong code was used to access them if the target
function used vector instructions. Furthermore,
-maltivec
affected the way vector parameters were
passed and returned. This affected all ABIs, both 32-bit and
64-bit. The fix necessarily introduces an incompatibility
between GCC 3.3 and GCC 3.4, but not for the more common
-mabi=altivec
case._Complex
types, 128-bit long double
, and
vectors under -mabi=altivec
when all vector registers
had been used._Complex
types in functions accepting variable
arguments. _Complex
integer types smaller than
_Complex long
, and _Complex
floating
point types smaller than _Complex double
, were not
properly repackaged from registers used to pass the values.long double
partially passed in
f13
(because f2
.. f12
were
used for other floating point arguments) also incorrectly used
f14
instead of passing the remainder of the argument on
the stack. Affected PowerPC64 GNU/Linux, AIX, and Darwin.-mabi=altivec
, vector arguments passed in
the variable argument part of a function with an ellipsis in the
prototype.-mabi=no-altivec
, all vector arguments.r9
, r10
and two stack words, and
r8
not be used for passing other arguments.long double
correctly
if it needed to be passed both in general purpose and floating point
registers (variable argument functions, or not prototyped). For
example, if the long double
should have been passed
partially in r8
, r9
, r10
then
only r8
was set.long double
passed partially in floating
point registers and partially on the stack caused a compiler abort
on PowerPC64 GNU/Linux and AIX-64.Copyright (C) Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
These pages are maintained by the GCC team. Last modified 2022-10-26.