[comp.sys.sgi] GCC and IRIX 3.3.1

XBR2D96D@DDATHD21.BITNET (Knobi der Rechnerschrat) (11/01/90)

Hallo,

  an addition to my previous posting about installing gcc-1.37.1 on
IRIX 3.3.1:

 you have also to modify the distributed version of stdarg.h. It's the
same  problem as with va-mips.h. The differences are as follows:

------------------------ diffs for stdarg.h ----------------------
*** stdarg.oh   Wed Oct 31 17:23:48 1990
--- stdarg.h    Wed Oct 31 17:24:15 1990
***************
*** 2,5 ****
--- 2,10 ----
  #define _STDARG_H

+ /* This is for IRIX 3.3.1 , M. Knoblauch */
+ #ifdef sgi
+ #define _VA_LIST_
+ #endif
+
  typedef char *va_list;

---------------------------------------------------------------------
  Unfortunatelly I had to discover, that the stdarg mechanism does not
work. The following C program compiled with gcc-1.37.1 gives the shown
results:

----------------------------- t2.c ----------------------------------
#include <stdarg.h>
#include <stdio.h>

main()
{
blaa("Test  0\n");
blaa("Test  1 %s\n","string");
blaa("Test  2 %d\n",4711);
blaa("Test  3 %f\n",4712.);
blaa("Test  4 %s %f\n","string",4712.);
blaa("Test  5 %s %f %d\n","string",4712.,4711);
blaa("Test  6 %s %d %f\n","string",4712,4711.);
blaa("Test  7 %s %d %d \n","string",4712,4711);
blaa("Test  8 %s %d %d %d\n","string",4712,4711,4713);
blaa("Test  9 %d %d %d %d\n",4712,4711,4713,4714);
}

#define LINELEN 100

blaa(char *fmt, ...)
{
va_list  ap;
char     *fp;
register int c;

char buffer[100];
char note[LINELEN],format[10];
int b,j,i,fi,narg;


narg = i = b = fi = 0;

  va_start(ap,fmt);
  fp =  fmt;

  while( ( c = *fp++) != '\0' )
    if( c != '%' ) buffer[b++] = c;
    else
      {
      format[fi++] = c;
      while( ((c = *fp++) != 'd') && (c != 'f') && (c != 's') ) format[fi++]=c;
      format[fi++] = c;  format[fi] = 0;
      switch( c )
         {
         case   'd' : sprintf(note,format,va_arg(ap,int));narg++;
                      break;
         case   'f' : sprintf(note,format,va_arg(ap,double));narg++;
                      break;
         case   's' : sprintf(note,format,va_arg(ap,char *));narg++;
                      break;
         default    : note[0] = c; note[1] = '\0';
                      break;

         }
      j = 0;  fi = 0;
      while( ( buffer[b++] = note[j++]) != '\0');  b--;
      }
   buffer[b] = '\0';
   va_end(ap);

   printf("narg = %d:%s",narg,buffer);
}  /* end eprint */
--------------------------------end-----------------------------------

narg = 0:Test  0
narg = 1:Test  1 (null)
narg = 1:Test  2 0
narg = 1:Test  3 0.000000
narg = 2:Test  4 (null) 0.000000
narg = 3:Test  5 (null) 0.000000 4711
narg = 3:Test  6 (null) 0 0.000000
narg = 3:Test  7 (null) 0 0
narg = 4:Test  8 (null) 0 0 4713
narg = 4:Test  9 0 0 0 4714

 This output is definitelly not as expected. From Test_5, Test_8
and Test_9 one can see that the first 12 Byte on the argument-List
are corrupted. After that arguments are  processed correct. Has anybody
seen this problem before? The program works fine when compiled with
cc.

 Btw. does an gcc version exist for the 4D series, that supports
debugger (either dbx or gdb) operations?

Regards
Martin Knoblauch

TH-Darmstadt
Physical Chemistry 1
Petersenstrasse 20
D-6100 Darmstadt, FRG

BITNET: <XBR2D96D@DDATHD21>

amoss@SHUM.HUJI.AC.IL (Amos Shapira) (11/02/90)

XBR2D96D@DDATHD21.BITNET (Knobi der Rechnerschrat) writes:

>are corrupted. After that arguments are  processed correct. Has anybody
>seen this problem before? The program works fine when compiled with
>cc.

> Btw. does an gcc version exist for the 4D series, that supports
>debugger (either dbx or gdb) operations?

There are diffs to change GCC 1.37.1 to OSF 1.8.1.5 which solve all your
problems. The diffs are on foobar.colorado.edu (and I believe on several other
archives). I didn't manage to appelay some of those diffs but with a set of my
own the compiler works O.K. with debugging.

A question of my own: I managed to compile G++ 1.37.1 on an Iris but it
aborts because it reaches a "default:" which shouldn't be reached (i.e.
an internal compiler bug). Does anyone have a working G++ 1.37.1?

>Regards
>Martin Knoblauch

>BITNET: <XBR2D96D@DDATHD21>