🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.gcc.bug
Article #2222

shot in the sparc

#2222
From: Michael Tiemann
Date: Thu, 02 Feb 1989 16:57
80 lines
2710 bytes
   Date: Thu, 02 Feb 89 03:40:52 -0800
   From: "Douglas C. Schmidt" <sources%crimee.ics.uci.edu@paris.ics.uci.edu>


   Michael,

      This is really off the wall, and probably a waste of time, but some
   code generated with gcc 1.33 is getting a segmentation fault on the
   sparc.  I'm fairly certain it's the compiler, since cc has no problems
   with it, and the system I'm compiling is very portable and has been
   around for a long time (it's a C version of Knuth's Tex program
   generated with a Web-to-C converter).

      The debugger claims the program fails on the following line:

   curval = curval * radix + d ; 

   where the variables are:

   long curval;
   char radix;
   char d;

      Here's the relevant output from gcc

      sethi %hi(_radix),%g1
      ldsb [%g1+%lo(_radix)],%o0
      sethi %hi(_curval),%g1
      ld [%g1+%lo(_curval)],%o3
      call .mul,2
      mov %o3,%o1
      mov %o0,%o2
      sll %l1,0x18,%o0
      sra %o0,0x18,%o0
      add %o2,%o0,%o0
      st %o0,[%g1+%lo(_curval)]

      And here's the output from cc (which doesn't seg fault)

     sethi %hi(_radix),%o1
     ldsb  [%o1+%lo(_radix)],%o1
     sethi %hi(_curval),%o0
     ld [%o0+%lo(_curval)],%o0
     call  .mul,2 
     nop 
     mov   %i4,%l1 
     add   %o0,%l1,%l2
     sethi %hi(_curval),%l3
     st %l2,[%l3+%lo(_curval)]

   If this is too much of a pain, just ignore it.  I don't know sparc
   well enough to figure out what's going wrong, so if you can figure it
   out from this skimpy sample that's fine, otherwise, we'll just have to
   wait....

   Doug

   p.s.  No options were used for the compilation, in particular -meager
	 was *not* applied.

This problem is very easily fixed:

Change the function `output_mul_insn' to include somewhere, a call to
CC_STATUS_INIT:

char *
output_mul_insn (operands, unsignedp)
     rtx *operands;
     int unsignedp;
{
  int lucky1 = ((unsigned)REGNO (operands[1]) - 8) <= 1;
  int lucky2 = ((unsigned)REGNO (operands[2]) - 8) <= 1;

  CC_STATUS_INIT;	/* this forgotten in virgin 1.33.  */
  if (lucky1)
    if (lucky2)
      output_asm_insn ("call .mul,2\n\tnop", operands);

Michael
Technical Details
Message-ID: <8902021657.AA01816@yahi.Stanford.EDU>
Path: arc1-ca.pugleaf.net!utzoo!telly!attcan!dptcdc!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!YAHI.STANFORD.EDU!mdt
References: <2185.602422852@crimee.ics.uci.edu>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!telly!attcan!dptcdc!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!YAHI.STANFORD.EDU!mdt
From: mdt@YAHI.STANFORD.EDU (Michael Tiemann)
Newsgroups: gnu.gcc.bug
Subject: shot in the sparc
Message-ID: <8902021657.AA01816@yahi.Stanford.EDU>
Date: 2 Feb 89 16:57:59 GMT
References: <2185.602422852@crimee.ics.uci.edu>
Sender: daemon@tut.cis.ohio-state.edu
Reply-To: tiemann@lurch.stanford.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 80