The file sol2-ci.asm is assembled to yield crti.o for the sparc-rtems target.
However sol2-ci.asm contains C preprocessor conditionals to select an
appropriate stack frame size depending on whether or not we're building for the
SPARC V9 architecture, but the language is specified as "-x assembler" rather
than "-x assembler-with-cpp" when assembling. As a result the preprocessor
directives (apparently) get treated as comments, and both the V9 and the non-V9
code goes into crti.o.
The net effect of this is that the _init() and _fini() functions in crti.o each
start with two SAVE instructions instead of one, as in the following fragment
of disassembly...
02015f58 <_init>:
2015f58: 9d e3 bf 50 save %sp, -176, %sp
2015f5c: 9d e3 bf a0 save %sp, -96, %sp
2015f60: 7f ff ac 88 call 2001180
2015f64: 01 00 00 00 nop
2015f68: 7f ff fb 11 call 2014bac <__do_global_ctors_aux>
2015f6c: 01 00 00 00 nop
2015f70: 81 c7 e0 08 ret
2015f74: 81 e8 00 00 restore
02015f78 <_fini>:
2015f78: 9d e3 bf 50 save %sp, -176, %sp
2015f7c: 9d e3 bf a0 save %sp, -96, %sp
2015f80: 7f ff ac 5c call 20010f0 <__do_global_dtors_aux>
2015f84: 01 00 00 00 nop
2015f88: 81 c7 e0 08 ret
2015f8c: 81 e8 00 00 restore
Things get very confused after leaving _fini() due to the mismatch between the
number of windows SAVEd versus the number RESTOREd -- the second window does
not contain a valid return address (that's in the first window) so we end up
jumping to wherever %i7 happens to be pointing.
After checking in CVS, it would seem that this problem exists at the HEAD.
--
Summary: Preprocessing needed when assembling
gcc/config/sparc/sol2-ci.asm
Product: gcc
Version: 3.2.3
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: michaelb at ieee dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: sparc-rtems
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20159