[gnu.gcc.bug] i386 gcc 1.34 dumps core

pardo@OPUS.CS.WASHINGTON.EDU (Divid Kezzel) (07/19/89)

/*
 * GCC: version 1.34
 * MACHINE: Sequent i386
 * CONFIG FILES: As set up by `config.gcc'
 * SYMPTOM: `cc1' gets fatal signal 11 (SIGSEGV) when compiling the
 *	following program.
 * REPEAT-BY: gcc -g -Wall -v -c file.c
 * NOTES: Has inline i386 `asm' functions.  Started dumping core when
 *	the `LOCK' and `UNLOCK' functions were added.
 *
 * RUNTIME:	gcc -g -Wall -v -c tmp.c
gcc version 1.34
 /uns/usr/local/lib/gcc-cpp -v -undef -D__GNUC__ -Dunix -Di386 -Dsequent -D__unix__ -D__i386__ -D__sequent__ -Wall tmp.c /tmp/cc024582.cpp
GNU CPP version 1.34
 /uns/usr/local/lib/gcc-cc1 /tmp/cc024582.cpp -quiet -dumpbase tmp.c -g -Wall -version -o /tmp/cc024582.s
GNU C version 1.34 (80386, BSD syntax) compiled by GNU C version 1.34.
gcc: Program cc1 got fatal signal 11.
 *
 * Furthur information upon request.
 */


# 1 "buf.c"
 


















 
# 1 "/uns/usr/local/lib/gcc-include/assert.h"
 











void __eprintf ();		 

















# 21 "buf.c"

# 1 "/usr/include/stdio.h"
 











 




extern	struct	_iobuf {
	int	_cnt;
	char	*_ptr;
	char	*_base;
	int	_bufsiz;
	short	_flag;
	char	_file;
} _iob[20 ];



























struct _iobuf 	*fopen();
struct _iobuf 	*fdopen();
struct _iobuf 	*freopen();
long	ftell();
char	*gets();
char	*fgets();
char	*sprintf();

# 22 "buf.c"


 
# 1 "/u1/pardo/june/resch/trace/pardo/include/types.h"
 




























 











 














    typedef void *VOIDP;
    typedef void const * VOIDCP;








 













 



























 












typedef enum {NO=0, YES} bool;
typedef enum { LESS = -1,  EQUAL = 0,  GREATER = 1 }  trinary;
typedef unsigned int u_int;


 






# 1 "/u1/pardo/june/resch/trace/pardo/include/types.vax.h"
 






































 











typedef signed char int8;
typedef short int12;
typedef short int16;
typedef int int24;
typedef int int32;
typedef unsigned char u_int8;
typedef unsigned short u_int12;
typedef unsigned short u_int16;
typedef unsigned int u_int24;
typedef unsigned int u_int32;



























 




# 134 "/u1/pardo/june/resch/trace/pardo/include/types.h"











# 25 "buf.c"


 
# 1 "parallel.h"
 


























	 














# 28 "buf.c"

# 1 "lock.h"
 




















# 30 "lock.h"



     

	typedef char BUF_lock_t;
	
	

	    static inline void
	LOCK (BUF_lock_t *laddr)
	{
	    BUF_lock_t old;

	    old = (1) ;
	    do {
		asm ("xchgb %0,%1"
		     : "=r" (old), "=m" (*laddr)
		     : "0" (old), "1" (*laddr)
		     );
	    } while (old != (0) );
	}

	    static inline void
    	UNLOCK (BUF_lock_t *laddr)
	{
	    *laddr = (0) ;
	}



# 69 "lock.h"








# 29 "buf.c"

# 1 "buf.h"
 




























# 1 "buf.i386.h"
 

















 




 



typedef u_int16 BUF_process_id_t;


 


typedef void * BUF_data_t;

 











 












 



























# 101 "buf.i386.h"
    

# 115 "buf.i386.h"

# 124 "buf.i386.h"



# 30 "buf.h"










 










 




















typedef struct BUF_buf_t {
    struct BUF_buf_t *next;
    bool pid_done;
    union {
	BUF_data_t *last;
	u_int size;
    } u;
    BUF_process_id_t pid;
     
    BUF_data_t data[1];
} BUF_buf_t;



 



typedef struct BUF_ppbd_t {
    BUF_buf_t *base;
    BUF_data_t *curr;
    BUF_data_t *last;
} BUF_ppbd_t;



 






typedef struct BUF_buf_list_t {
    BUF_buf_t *tail;
    BUF_lock_t lock;
} BUF_buf_list_t;



 






# 30 "buf.c"



    extern void *malloc (unsigned nelt);
    extern void free (void *ptr);
    extern void abort(void);
    extern void fprintf (struct _iobuf  *fp, char const *format, ...);



 






















typedef struct buf_config_t {
    u_int hash_length;		 
    bool malloc_more;		 
    bool free_excess;		 
    u_int howmany;		 
    u_int retries;		 
    u_int writers;		 

     
    u_int32 buf_size;		 
} buf_config_t;

  buf_config_t BUF_config;


 









typedef enum acct_name_t {
    ACCT_ZERO,
    FIND_FREE_BUFFER,
    GC,
    HTBL_STORE_BUF,
    HTBL_GET_BUF,
    ACCT_N
} acct_name_t;

typedef struct acct_t {
    u_int count;
    BUF_lock_t lock;
} acct_t;
















  acct_t BUF_acct[ACCT_N];

      void
BUF_acct_init ()
{
    acct_name_t i;

    for (i=ACCT_ZERO; i<ACCT_N; ++i) {
	UNLOCK (&BUF_acct[i].lock);
	BUF_acct[i].count = 0;
    }
}



 
















	 BUF_buf_list_t BUF_fullbufs;
	   BUF_buf_list_t BUF_fullhead;
					 
 
	 BUF_buf_list_t BUF_freelist;	 
	 u_int BUF_free_length;

 
	 BUF_buf_list_t *BUF_hashtbl;	 
	 u_int BUF_htbl_size;		 








 






 



      BUF_buf_t *
BUF_filled_next ()
{
    if (BUF_config.writers > 1) {
	LOCK (&BUF_fullhead.lock);
    }
    return (BUF_fullhead.tail);
}


      bool
BUF_htbl_init (size)
    u_int size;
{
    ((size > 0) ? 0 : (__eprintf ("Failed assertion " "size > 0"	" at line %d of `"  "buf.c" "'.\n",  233),	abort ()) ) ;
    
    BUF_hashtbl = (BUF_buf_list_t *)
	malloc (size * sizeof(BUF_buf_list_t*));
    if (!BUF_hashtbl)
	return (NO);
    	do {  BUF_htbl_size = (size);  } while(0 )  ;
    do {
	--size;
	UNLOCK (&BUF_hashtbl[size].lock);
	BUF_hashtbl[size].tail = 0 ;
    } while (size > 0);
    return (YES);
}

      void
BUF_htbl_store_buf (buf)
    BUF_buf_t *buf;
{
    u_int where;

    	do { ; } while(0 )  ;

    where = ((buf->pid) % BUF_htbl_size) ;
    ((where < 	(BUF_htbl_size) ) ? 0 : (__eprintf ("Failed assertion " "where < BUF_HTBL_SIZE"	" at line %d of `"  "buf.c" "'.\n",  258),	abort ()) ) ;
    LOCK (&BUF_hashtbl[where].lock);
    buf->next = BUF_hashtbl[where].tail;
    BUF_hashtbl[where].tail = buf;
    UNLOCK (&BUF_hashtbl[where].lock);
}






      BUF_buf_t *
BUF_htbl_get_buf (pid)
    BUF_process_id_t pid;
{



    BUF_buf_t *buf, **trail;
    u_int where;

    	do { ; } while(0 )  ;

    where = ((pid) % BUF_htbl_size) ;
    ((where < 	(BUF_htbl_size) ) ? 0 : (__eprintf ("Failed assertion " "where < BUF_HTBL_SIZE"	" at line %d of `"  "buf.c" "'.\n",  286),	abort ()) ) ;
    LOCK (&BUF_hashtbl[where].lock);
    for ((trail=&BUF_hashtbl[where].tail), (buf=BUF_hashtbl[where].tail);
	 buf && buf->pid != pid;
	 trail = &buf->next, buf = buf->next)
    {



	;
    }
    if (buf)
	*trail = buf->next;
    UNLOCK (&BUF_hashtbl[where].lock);

    		do {  if (buf) buf->next = 0 ;  } while(0 )  ;



    return (buf);
}