Article View: gnu.gcc.bug
Article #6180gcc-2.7.2{,.1} m68k-elf problem
From: Matthew L. Martin
Date: Fri, 22 Nov 1996 00:00
Date: Fri, 22 Nov 1996 00:00
179 lines
5571 bytes
5571 bytes
I have reduced this to what I think is the minimum needed to reproduce:
The gcc used is 2.7.2 with no local modifications, targeted for
m68k-unknown-linux, hosted on a sparc running sunos-4.1.4.
I first noticed this on gcc-2.7.2.1, I then backed down to 2.7.2, but it
appears to be a m68k-elf bug.
> cat config.status
#!/bin/sh
# GCC was configured as follows:
./../gcc-2.7.2/configure --target=m68k-linux -prefix=/home/mxm --local-prefix=/u1/ns/exl/tools --with-gnu-as --exec-prefix=/u1/ns/exl/tools
echo host=sparc-sun-sunos4.1.4 target=m68k-unknown-linux
build=sparc-sun-sunos4.1.4
It was compiled with gcc-2.7.2, configured as:
#!/bin/sh
# GCC was configured as follows:
./../gcc-2.7.2/configure --with-gnu-as --prefix=/u1/ns/exl/tools echo host=sparc-sun-sunos4.1.4 target=sparc-sun-sunos4.1.4
build=sparc-sun-sunos4.1.4
When I feed this source code:
>cat inconf.c
/*
* External declarations
*/
extern int zero();
extern unsigned int tnets;
void *ALP(unsigned int size);
extern inline void *alp(unsigned int size)
{
return((void *)(
{
register unsigned short __SCOPS ;
register unsigned long __RETURN asm("%d0");
asm volatile ("move %%SR, %0; move #0x2700, %%SR" : "=md" (__SCOPS));
;
ALP ( size );
asm volatile ("move %0, %%SR": : "md" ((unsigned short)(__SCOPS)));
;
__RETURN;
})
);
}
struct inia {
int a;
int b;
};
void doaddrs()
{
struct inia **iniatlst;
iniatlst = (struct inia **) alp(tnets * sizeof(struct inia **));
zero(iniatlst, tnets * sizeof(struct inia **));
}
>
into the cross compiler, thusly:
>./xgcc -B./ -O2 -S -v -I/u1/ns/exl -DMC68000 -m68020 -fconserve-space
-mnobitfield -Wall -Wno-format inconf.c
Reading specs from ./specs
gcc version 2.7.2
./cpp -lang-c -v -I/u1/ns/exl -isystem ./include -undef -D__GNUC__=2
-D__GNUC_MINOR__=7 -D__ELF__ -Dunix -Dmc68000 -Dmc68020 -Dlinux
-D__ELF__ -D__unix__ -D__mc68000__ -D__mc68020__ -D__linux__ -D__unix
-D__mc68000 -D__mc68020 -D__linux -Asystem(unix) -Asystem(posix)
-Acpu(m68k) -Amachine(m68k) -D__OPTIMIZE__ -Wall -Wno-format
-D__HAVE_68881__ -DMC68000 inconf.c /usr/tmp/cca04073.i
GNU CPP version 2.7.2 (68k Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/u1/ns/exl
./include
/u1/ns/exl/tools/lib/gcc-lib/m68k-linux/2.7.2/include
/u1/ns/exl/tools/lib/gcc-lib/m68k-linux/2.7.2/sys-include
/u1/ns/exl/tools/m68k-linux/include
End of search list.
./cc1 /usr/tmp/cca04073.i -quiet -dumpbase inconf.c -m68020
-mnobitfield -O2 -Wall -Wno-format -version -fconserve-space -o inconf.s
GNU C version 2.7.2 (68k Linux/ELF) compiled by GNU C version 2.7.2.
The resulting assembly code is surprising:
>cat inconf.s
.file "inconf.c"
.version "01.01"
gcc2_compiled.:
.text
.align 2
.globl doaddrs
.type doaddrs,@function
doaddrs:
link.w %a6,#0
move.l %d2,-(%sp)
move.l tnets,%d0
asl.l #2,%d0
#APP
move %SR, %d2; move #0x2700, %SR
#NO_APP
move.l %d0,-(%sp)
jbsr ALP
addq.w #4,%sp
#APP
move %d2, %SR
#NO_APP
move.l tnets,%d0
asl.l #2,%d0
move.l %d0,-(%sp) #<-- it seems to believe that d0 has two
move.l %d0,-(%sp) #<-- different values at the same time
jbsr zero
move.l -4(%a6),%d2
unlk %a6
rts
.Lfe1:
.size doaddrs,.Lfe1-doaddrs
.ident "GCC: (GNU) 2.7.2"
>
However, when I feed the same source to gcc-2.7.2 configured as:
#!/bin/sh
# GCC was configured as follows:
./../gcc-2.7.2/configure --target=m68k-coff -prefix=/home/mxm --local-prefix=/u1/ns/exl/tools --with-gnu-as --exec-prefix=/u1/ns/exl/tools
echo host=sparc-sun-sunos4.1.4 target=m68k-unknown-coff
build=sparc-sun-sunos4.1.4
with the same command line as above, the assembler output is unsurprising:
.file "inconf.c"
gcc2_compiled.:
__gnu_compiled_c:
.text
.even
.globl doaddrs
doaddrs:
link.w %a6,#0
move.l %d2,-(%sp)
move.l tnets,%d0
asl.l #2,%d0
#APP
move %SR, %d2; move #0x2700, %SR
#NO_APP
move.l %d0,-(%sp)
jsr ALP
addq.w #4,%sp
#APP
move %d2, %SR
#NO_APP
move.l tnets,%d1 #<-- use a different register for a new
asl.l #2,%d1 #<-- value when the old one is still live
move.l %d1,-(%sp) #<-- thus pushing the correct args
move.l %d0,-(%sp)
jsr zero
move.l -4(%a6),%d2
unlk %a6
rts
This is keeping us from using elf, which we would like to do for
debugging information.
Thanks for your attention.
mxm Matthew L. Martin mxm@proteon.com
------------------------------------------------------------
I'm a contractor. If you want an opinion, I'll sell you one.
Which one do you want?
Technical Details
Message-ID:
<Pine.SUN.3.95.961122165053.8853B-100000@cobain.proteon.com>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII-7-bit
X-Google-Thread: 113d02,f7c3876a6b1f26f6,start
X-Google-Attributes: gid113d02,public
From: "Matthew L. Martin" <mxm@proteon.com>
Subject: gcc-2.7.2{,.1} m68k-elf problem
Date: 1996/11/22
Message-ID: <Pine.SUN.3.95.961122165053.8853B-100000@cobain.proteon.com>
X-Deja-AN: 198197191
sender: bug-gcc-request@prep.ai.mit.edu
x-gateway: relay3.UU.NET from bug-gcc to gnu.gcc.bug; Fri, 22 Nov 1996 17:49:20 EST
content-type: TEXT/PLAIN; charset=US-ASCII
mime-version: 1.0
newsgroups: gnu.gcc.bug