🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.gcc.bug
Article #6180

gcc-2.7.2{,.1} m68k-elf problem

#6180
From: Matthew L. Martin
Date: Fri, 22 Nov 1996 00:00
179 lines
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-mail

Show 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