Looking at GCC 4.0 20050318, and configuring as a cross-compiler for ARM/Linux thusly: $ mkdir arm-linux ; cd arm-linux $ ../configure --prefix=/opt/gcc-linux --target=arm-linux-elf --enable-languages=c,ada
Once the gnat1 binary is built, just type this from the gcc/ada directory. $ ../../arm-linux/gcc/gnat1 nlists.adb -O2 -o nlists.s -gnatpg Turning off optimisation makes no difference to the resulting problem. The compiled version of Nlists::First() results in: nlists__first: @ args = 0, pretend = 0, frame = 0, outgoing = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. cmp r0, #0 ldrne r2, .L320 mov r1, #1191182336 ldrne r3, [r2, #0] add ip, r0, r0, asl #1 add r1, r1, #8781824 add r1, r1, #35840 addne r3, r3, ip, asl #2 ldrne r0, [r3, r1] @ lr needed for prologue bx lr .L320: .word nlists__lists__tableX The problem I see is an out-of-bounds memory access here: ldrne r0, [r3, r1] FYI, on my machine: R1 == 0x47868c00 R3 == 0xb97d3a9c Here, R3 points to a legitimate memory address Surely R1 is a little large ? -- Summary: Code gen creating out-of-bounds addresses on legit code Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: ada AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: nick at sqrt dot co dot uk 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: arm-linux-elf http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20797