home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / gnu / gcc / bug / 2187 < prev    next >
Encoding:
Text File  |  1992-08-25  |  26.5 KB  |  1,085 lines

  1. Path: sparky!uunet!stanford.edu!ames!uakari.primate.wisc.edu!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!watson.ibm.com!c$dje
  2. From: c$dje@watson.ibm.com (David Edelsohn)
  3. Newsgroups: gnu.gcc.bug
  4. Subject: gcc-2.2.2 fatal signal 11 bug report
  5. Message-ID: <9208251607.AA25885@tweetie.watson.ibm.com>
  6. Date: 25 Aug 92 16:07:26 GMT
  7. Sender: gnulists@ai.mit.edu
  8. Distribution: gnu
  9. Organization: GNUs Not Usenet
  10. Lines: 1072
  11. Approved: bug-gcc@prep.ai.mit.edu
  12.  
  13.  
  14.     The appended source code causes gcc-2.2.2 to crash with an internal
  15. compiler error -- fatal signal 11 from cc1.  Gcc configured for both a Risc
  16. System/6000 running AIX 3.1.7 and a Sun Sparcstation running SunOS 3.1.2
  17. demonstrate this bug.  The appended code is a trimmed version, with include
  18. files prepended, appropriate for an RS/6000 but a Sparcstation will produce
  19. the same results with additional warnings.
  20.  
  21.                     David
  22.  
  23. % gcc -v bad.c
  24. Reading specs from /contrib/lib/gcc-lib/rs6000/2.2/specs
  25. gcc version 2.2
  26.  /contrib/lib/gcc-lib/rs6000/2.2/cpp -lang-c -v -undef -D__GNUC__=2 -D_IBMR2 -D_AIX -D___IBMR2__ -D___AIX__ -D___IBMR2 -D___AIX -D__CHAR_UNSIGNED__ bad.c /tmp/cckcICkR.i
  27. GNU CPP version 2.2
  28.  /contrib/lib/gcc-lib/rs6000/2.2/cc1 /tmp/cckcICkR.i -quiet -dumpbase bad.c -version -o /tmp/cckcICkR.s
  29. GNU C version 2.2.2 compiled by GNU C version 2.2.
  30. gcc: Internal compiler error: program cc1 got fatal signal 11
  31.  
  32. -----bad.c-----
  33. typedef char *        va_list;
  34. typedef int        ptrdiff_t;
  35. typedef unsigned short    wchar_t;
  36. typedef long        fpos_t;
  37. typedef    long        time_t;
  38. typedef int        clock_t;
  39. typedef    unsigned long    size_t;
  40. typedef    unsigned char    uchar_t;
  41. typedef    unsigned short    ushort_t;
  42. typedef    unsigned int    uint_t;
  43. typedef unsigned long    ulong_t;
  44. typedef    struct { int r[1]; } *    physadr_t;
  45. typedef long        level_t;
  46. typedef    long        daddr_t;    
  47. typedef    char *        caddr_t;    
  48. typedef    ulong_t        ino_t;        
  49. typedef short        cnt_t;
  50. typedef ulong_t        dev_t;        
  51. typedef    long        chan_t;        
  52. typedef    long        off_t;        
  53. typedef    long        paddr_t;
  54. typedef    long        key_t;
  55. typedef long        timer_t;    
  56. typedef    short        nlink_t;
  57. typedef    ulong_t        mode_t;        
  58. typedef ulong_t        uid_t;        
  59. typedef ulong_t        gid_t;        
  60. typedef    void *        mid_t;        
  61. typedef    int        pid_t;        
  62. typedef char        slab_t[12];    
  63. typedef long            mtyp_t;        
  64. typedef struct label_t {        
  65.     struct label_t *prev;        
  66.     ulong_t           iar;        
  67.     ulong_t           stack;        
  68.     ulong_t           toc;        
  69.     ulong_t           cr;
  70.     ulong_t           intpri;        
  71.     ulong_t           reg[19];    
  72. } label_t;
  73.  
  74. typedef long        vmid_t;        
  75. typedef ulong_t        vmhandle_t;    
  76.  
  77. typedef struct vmaddr_t {        
  78.     vmhandle_t    srval;        
  79.     caddr_t        offset;        
  80. } vmaddr_t;
  81.  
  82. typedef struct adspace_t{        
  83.     ulong_t        alloc;        
  84.     vmhandle_t    srval[16];    
  85. } adspace_t;
  86.  
  87. typedef struct sigset_t    {
  88.     unsigned long losigs;
  89.     unsigned long hisigs;
  90. } sigset_t;
  91.  
  92. typedef    uchar_t        uchar;
  93. typedef    ushort_t    ushort;
  94. typedef    uint_t        uint;
  95. typedef ulong_t        ulong;
  96.  
  97. typedef    physadr_t    physadr;
  98.  
  99.  
  100. typedef    unsigned char    u_char;
  101. typedef    unsigned short    u_short;
  102. typedef    unsigned int    u_int;
  103. typedef    unsigned long    u_long;
  104.  
  105. typedef    struct    _quad { long val[2]; } quad;
  106. typedef    long    swblk_t;
  107.  
  108.  
  109. struct sigset    {
  110.     unsigned long losigs;
  111.     unsigned long hisigs;
  112. };
  113.  
  114.  
  115. struct fsid {
  116.     long    val[2];
  117. };
  118. typedef struct fsid fsid_t;
  119.  
  120. struct fid {
  121.     uint_t    fid_len;
  122.     char    fid_data[(    32  - sizeof(fsid_t) - sizeof(uint_t)) ];
  123. };
  124. typedef struct fid fid_t;
  125.  
  126. struct fileid {            
  127.     uint_t    fid_len;
  128.     ino_t    fid_ino;
  129.     uint_t    fid_gen;
  130.     char    fid_x[(    32  - sizeof(fsid_t) - sizeof(uint_t))  - (sizeof(ino_t) + 2) - sizeof(uint_t)];
  131. };
  132.  
  133.  
  134. struct fhandle {
  135.     char x[    32 ];        
  136. };
  137. struct filehandle {            
  138.     fsid_t        fh_fsid;        
  139.     struct fileid    fh_fid;            
  140. };
  141. typedef struct fhandle fhandle_t;
  142.  
  143. struct unique_id {
  144.        unsigned long word1;
  145.        unsigned long word2;
  146.        unsigned long word3;
  147.        unsigned long word4;
  148. };
  149. typedef struct unique_id unique_id_t;
  150.  
  151. typedef struct  coldesc  {
  152.     short     cd_stroff;
  153.     short      cd_repoff;
  154.     short     cd_cval;
  155.     short      cd_cuniq;
  156. } coldesc_t;
  157.  
  158.  
  159.  
  160.  
  161. typedef struct collation_table {
  162.     short    lc_version;
  163.     short     lc_length;            
  164.     char     *lc_locale_name;        
  165.     int      len_collate;
  166.     short    *lc_collate;
  167.     int      len_coluniq;
  168.     short    *lc_coluniq;
  169.     int      len_coldesc;
  170.     coldesc_t *lc_coldesc;
  171.     int     len_strings;            
  172.     wchar_t  *lc_strings;            
  173.     int     high_cvalue;            
  174. } col_t;
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182. typedef struct char_classification_table {
  183.     short      lc_version;         
  184.     short       lc_length;          
  185.     short      lc_code_type;     
  186.     short      mb_cur_max;       
  187.     short      mb_cur_min;       
  188.     short      lc_dsp_width;
  189.     char       *lc_locale_name;     
  190.     int        len_caseconv;       
  191.     wchar_t    *lc_caseconv;       
  192.     int       len_ctype;
  193.     unsigned short *lc_ctype;         
  194. } ctype_t;
  195.  
  196.  
  197.  
  198.  
  199.  
  200. typedef    struct lc_monetary_table {
  201.     short      lc_version;
  202.     short     lc_length;        
  203.     char       *lc_locale_name;    
  204.     char     *int_curr_symbol;    
  205.     char     *currency_symbol;    
  206.     char     *mon_decimal_point;    
  207.     char     *mon_thousands_sep;    
  208.     char     *mon_grouping;        
  209.     char     *positive_sign;        
  210.     char     *negative_sign;        
  211.     char     int_frac_digits;    
  212.     char     frac_digits;        
  213.     char     p_cs_precedes;        
  214.     char     p_sep_by_space;        
  215.     char     n_cs_precedes;        
  216.     char     n_sep_by_space;        
  217.     char     p_sign_posn;        
  218.     char     n_sign_posn;        
  219. } mon_t;
  220.  
  221.  
  222.  
  223.  
  224.  
  225. typedef struct numeric_table {
  226.     short    lc_version;
  227.     short    lc_length;        
  228.     char    *lc_locale_name;    
  229.     char     *decimal_point;
  230.     char     *thousands_sep;
  231.     char    *grouping;
  232. } num_t;
  233.  
  234.  
  235.  
  236.  
  237.  
  238. typedef struct lc_messages_table {
  239.     short    lc_version;
  240.     short    lc_length;        
  241.     char    *lc_locale_name;    
  242.     char     *messages;        
  243.     char     *yes_string;        
  244.     char     *no_string;        
  245. } msg_t;
  246.  
  247.  
  248.  
  249.  
  250.  
  251. typedef struct lc_time_table {
  252.     short   lc_version;
  253.     short    lc_length;    
  254.     char    *lc_locale_name;
  255.     char    *t_fmt;
  256.     char    *d_fmt;
  257.     char    *nlldate;
  258.     char    *d_t_fmt;
  259.     char    *abday;
  260.     char    *day;
  261.     char    *abmon;
  262.     char    *mon;
  263.  
  264.  
  265.  
  266.  
  267.     char    *misc;
  268.     char    *tstrs;
  269.     char    *tunits;
  270.  
  271.  
  272.  
  273.     char    *year;        
  274.     char    *am_pm;
  275. } tim_t;
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282. typedef struct wchar_mapping_table {
  283.     short    lc_version;
  284.     short     lc_length;            
  285.     char     *lc_identifier;
  286. } map_t;
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295. typedef struct localeinfo_table {
  296.     char     lc_mag0, lc_mag1;
  297.     short    lc_version;
  298.     short    lc_code_type;
  299.     short     lc_length;        
  300.     col_t    *lc_coltbl;        
  301.     ctype_t  *lc_chrtbl;        
  302.     mon_t    *lc_montbl;        
  303.     num_t    *lc_numtbl;        
  304.     tim_t    *lc_timtbl;        
  305.     msg_t    *lc_msgtbl;        
  306.     map_t    *lc_maptbl;        
  307. } loc_t;
  308.  
  309. extern loc_t *_locp;
  310.  
  311.  
  312.  
  313. typedef unsigned short NLchar;
  314.  
  315. extern char
  316.     *NLstrcpy(),
  317.     *NLstrncpy(),
  318.     *NLstrcat(),
  319.     *NLstrncat(),
  320.     *NLstrchr(),
  321.     *NLstrrchr(),
  322.     *NLstrpbrk(),
  323.     *NLstrtok();
  324. extern NLchar
  325.     *NCstrcpy(),
  326.     *NCstrncpy(),
  327.     *NCstrcat(),
  328.     *NCstrncat(),
  329.     *NCstrchr(),
  330.     *NCstrrchr(),
  331.     *NCstrpbrk(),
  332.     *NCstrtok();
  333. extern NLchar *_NCgetbuf();
  334. extern void free(void *ptr);
  335. extern char _NLflattab[];
  336. extern unsigned _NLflattsize;
  337. extern char _NLesctab[][2];
  338. extern unsigned _NLesctsize;
  339. extern unsigned _NLunesctsize;
  340.  
  341.  
  342.  
  343.  
  344. extern struct NLescdata {
  345.     unsigned char *key;
  346.     NLchar value;
  347. } _NLunesctab[];
  348. extern int isascii(int c);
  349. extern int toascii(int c);
  350. extern int errno;
  351. extern int errno;
  352. extern char *setlocale(int category, const char *locale);
  353. extern struct lconv *localeconv(void);
  354.  
  355.  
  356. typedef struct lconv {
  357.    char *decimal_point;        
  358.    char *thousands_sep;        
  359.    char *grouping;        
  360.    char *int_curr_symbol;    
  361.    char *currency_symbol;    
  362.    char *mon_decimal_point;    
  363.    char *mon_thousands_sep;    
  364.    char *mon_grouping;        
  365.    char *positive_sign;        
  366.    char *negative_sign;        
  367.    char int_frac_digits;    
  368.    char frac_digits;        
  369.    char p_cs_precedes;        
  370.    char p_sep_by_space;        
  371.    char n_cs_precedes;        
  372.    char n_sep_by_space;        
  373.    char p_sign_posn;        
  374.    char n_sign_posn;        
  375. } lconv;
  376. extern  unsigned _DBLINF[2];
  377. extern  double acos(double x);
  378. extern  double asin(double x);
  379. extern  double atan(double x);
  380. extern  double atan2(double x,double y);
  381. extern  double ceil(double x);
  382. extern  double cos(double x);
  383. extern  double cosh(double x);
  384. extern  double exp(double x);
  385. extern  double fabs(double x);
  386. extern  double floor(double x);
  387. extern  double fmod(double x, double y);
  388. extern  double frexp(double value, int *exp);
  389. extern  double ldexp(double x, int exp);
  390. extern  double log(double x);
  391. extern  double log10(double x);
  392. extern  double modf(double value, double *iptr);
  393. extern  double pow(double x, double y);
  394. extern  double sin(double x);
  395. extern  double sinh(double x);
  396. extern  double sqrt(double x);
  397. extern  double tan(double x);
  398. extern  double tanh(double x);
  399.  
  400. extern int signgam;
  401. extern unsigned int SFPMAX;
  402.  
  403. extern     double   erf(double x);
  404. extern     double   erfc(double x);
  405. extern     int      isnan(double x);
  406. extern     double   hypot(double x,double y);
  407. extern     double   j0(double x);
  408. extern     double   j1(double x);
  409. extern     double   jn(int n, double x);
  410. extern     double   gamma(double x);
  411. extern     double   lgamma(double x);
  412. extern     double   y0(double x);
  413. extern     double   y1(double x);
  414. extern     double   yn(int n, double x);
  415. typedef struct div_t  {            
  416.     int quot;            
  417.     int rem; } div_t;            
  418.  
  419. typedef struct ldiv_t  {        
  420.     long int quot;            
  421.     long int rem; } ldiv_t;        
  422.  
  423. extern double     atof(const char *nptr);
  424. extern int     atoi(const char *nptr);
  425. extern long int atol(const char *nptr);
  426. extern double     strtod(const char *nptr, char * *endptr);
  427. extern long int strtol(const char *nptr, char * *endptr, int base);
  428. extern unsigned long int strtoul(const char *nptr, char * *endptr, int base);
  429. extern int     rand(void);
  430. extern void    srand(unsigned int seed);
  431. extern void     *calloc(size_t nmemb, size_t size);
  432. extern void    free(void *ptr);
  433. extern void    *malloc(size_t size);
  434. extern void     *realloc(void *ptr, size_t size);
  435. extern void    abort(void);
  436. extern int    atexit(void (*func)(void));
  437. extern void    exit(int status);
  438. extern char    *getenv(const char *name);
  439. extern int     system(const char *string);
  440. extern void     *bsearch(const void *key, const void *base, size_t nmemb,                       size_t size, int(*compar)());
  441. extern void     qsort(void *base, size_t nmemb, size_t size, int(*compar)());
  442.  
  443. extern int     abs(int j);
  444. extern struct div_t    div(int numer, int denom);
  445. extern long int    labs(long int j);
  446. extern struct ldiv_t     ldiv(long int numer, long int denom);
  447. extern int     mblen(const char *s, size_t n);
  448. extern int     mbtowc(wchar_t *pwc, const char *s, size_t n);
  449. extern int     wctomb(char *s, wchar_t wchar);
  450. extern size_t     mbstowcs(wchar_t *pwcs, const char *s,size_t n);
  451. extern size_t     wcstombs(char *s, const wchar_t *pwcs,size_t n);
  452.      float    atoff();
  453.      char     *ecvt();
  454.      char     *fcvt();
  455.      char     *gcvt();
  456.      float    strtof();
  457.      void     imul_dbl();
  458.      void     umul_dbl();
  459.  
  460.      struct dbl_hypot {
  461.          double x, y;
  462.      };
  463.  
  464. extern     double   acosh(double x);
  465. extern     double   asinh(double x);
  466. extern     double   atanh(double x);
  467. extern     double   cabs(struct dbl_hypot p_dbl);
  468. extern     double   cbrt(double x);
  469. extern     double   copysign (double x, double y);
  470. extern     double   drem(double x, double y);
  471. extern     double   exp__E(double x, double y);
  472. extern     double   expm1(double x);
  473. extern     double   log1p(double x);
  474. extern     double   log__L(double x);
  475. extern     double   nearest(double x);
  476. extern     double   rint(double x);
  477. extern     double   scalb(double x, int n);
  478. extern     double   trunc(double x);
  479. extern     int      itrunc(double x);
  480. extern     int      unordered(double x, double y);
  481. extern     unsigned  uitrunc(double x);
  482.  
  483. extern     int      dtoi(double x);
  484.  
  485. extern     double   logb();
  486. extern     int      ilogb();
  487. extern     double   nextafter();
  488. extern     int      class();
  489. extern     int      finite();
  490.  
  491. struct exception {
  492.     int type;
  493.     char *name;
  494.     double arg1;
  495.     double arg2;
  496.     double retval;
  497. };
  498. typedef int jmp_buf[64    ];
  499.  
  500. extern void longjmp(jmp_buf env, int val);
  501. extern int setjmp(jmp_buf env);
  502.  
  503. typedef int sigjmp_buf[64    ];
  504.  
  505. extern int sigsetjmp(sigjmp_buf env, int savemask);
  506. extern void siglongjmp(sigjmp_buf env, int val);
  507.  
  508. extern void (*signal(int sig, void (*func)(int)))(int);
  509.  
  510. extern int raise(int sig);
  511.  
  512. typedef volatile int sig_atomic_t;
  513. struct sigaction {
  514.     void    (*sa_handler)(int);    
  515.  
  516.     sigset_t sa_mask;        
  517.     int    sa_flags;        
  518. };
  519.  
  520. extern int kill(pid_t pid, int sig);
  521. extern int sigaction(int sig, struct sigaction *act, struct sigaction *oact);
  522. extern int sigprocmask(int how, sigset_t *set, sigset_t *oset);
  523. extern int sigsuspend(sigset_t *set);
  524.  
  525.  
  526. extern int sigemptyset(sigset_t *set);
  527. extern int sigfillset(sigset_t *set);
  528. extern int sigaddset(sigset_t *set, int signo);
  529. extern int sigdelset(sigset_t *set, int signo);
  530. extern int sigismember(sigset_t *set, int signo);
  531. extern int sigpending(sigset_t *set);
  532. struct mstsave    {
  533.  
  534.     struct mstsave    *prev;        
  535.     label_t        *kjmpbuf;    
  536.     char        *stackfix;    
  537.     char        intpri;     
  538.     char        backt;        
  539.     char        rsvd[2];    
  540.     pid_t        curid;        
  541.  
  542.     int        excp_type;    
  543.     ulong_t        iar;        
  544.     ulong_t        msr;        
  545.     ulong_t        cr;        
  546.     ulong_t        lr;        
  547.     ulong_t        ctr;        
  548.     ulong_t        xer;        
  549.     ulong_t        mq;        
  550.     ulong_t        tid;        
  551.     ulong_t        fpscr;        
  552.     char        fpeu;        
  553.  
  554.     char            pad[3];
  555.     ulong_t         except[5];    
  556.     void        *bus;        
  557.  
  558.     ulong_t         o_iar;
  559.         ulong_t         o_toc;
  560.     ulong_t         o_arg1;
  561.  
  562.     ulong_t        excbranch;    
  563.  
  564.  
  565.  
  566.     ulong_t        cachealign[9];    
  567.  
  568.     adspace_t    as;        
  569.     ulong_t        gpr[32 ];    
  570.     double        fpr[32 ];    
  571. };
  572. struct    jmpbuf    {
  573.     struct    mstsave    jmp_context;
  574. };
  575.  
  576. extern int sigstack();
  577.  
  578.  
  579.  
  580. struct    sigstack {
  581.     char    *ss_sp;            
  582.     int    ss_onstack;        
  583. };
  584.  
  585. struct    sigcontext {
  586.     int        sc_onstack;    
  587.     sigset_t    sc_mask;    
  588.     int        u_error;    
  589.     struct    jmpbuf    sc_jmpbuf;    
  590. };
  591.  
  592. struct    sigvec {
  593.  
  594.  
  595.  
  596.  
  597.  
  598.     void    (*sv_handler)(int);    
  599.  
  600.     int     sv_mask;
  601.     int     sv_flags;
  602. };
  603.  
  604. void va_end (va_list);        
  605. typedef struct {
  606.     unsigned char    *_ptr;
  607.     int    _cnt;
  608.     unsigned char    *_base;
  609.     unsigned char   *_bufendp;
  610.     short    _flag;
  611.     short    _file;
  612.     int    _unused[3];
  613. } FILE;
  614.  
  615. extern FILE    _iob[    20 ];
  616.  
  617. extern size_t     fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  618. extern size_t    fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
  619.  
  620. extern int      _filbuf(FILE *iop);
  621. extern int    _flsbuf(unsigned char c, FILE *iop);
  622. extern int     ferror(FILE *stream);
  623. extern int     feof(FILE *stream);
  624. extern void     clearerr(FILE * stream);
  625. extern int     putchar(int c);
  626. extern int     getchar(void);
  627. extern int     putc(int c, FILE *stream);
  628. extern int     getc(FILE *stream);
  629. extern int    remove(const char *filename);
  630. extern int    rename(const char *old, const char *new);
  631. extern FILE     *tmpfile(void);
  632. extern char     *tmpnam(char *s);
  633. extern int     fclose(FILE *stream);
  634. extern int     fflush(FILE *stream);
  635. extern FILE    *fopen(const char *filename, const char *mode);
  636. extern FILE     *freopen(const char *filename, const char *mode, FILE *stream);
  637. extern void     setbuf(FILE *stream, char *buf);
  638. extern int     setvbuf(FILE *stream, char *buf, int mode, size_t size);
  639. extern int    fprintf(FILE *stream, const char *format, ...);
  640. extern int    fscanf(FILE *stream, const char *format, ...);
  641. extern int    printf(const char *format, ...);
  642. extern int    scanf(const char *format, ...);
  643. extern int    sprintf(char *s, const char *format, ...);
  644. extern int    sscanf(const char *s, const char *format, ...);
  645.  
  646. extern int    vfprintf(FILE *stream, const char *format, va_list arg);
  647. extern int    vprintf(const char *format, va_list arg);
  648. extern int    vsprintf(char *s, const char *format, va_list arg);
  649.  
  650. extern int     fgetc(FILE *stream);
  651. extern char     *fgets(char *s, int n, FILE *stream);
  652. extern int     fputc(int c, FILE *stream);
  653. extern int     fputs(const char *s, FILE *stream);
  654. extern char     *gets(char *s);
  655. extern int     puts(const char *s);
  656. extern int    ungetc(int c, FILE *stream);
  657. extern int    fgetpos(FILE *stream, fpos_t *pos);
  658. extern int     fseek(FILE *stream, long int offset, int whence);
  659. extern int    fsetpos(FILE *stream, const fpos_t *pos);
  660. extern long    ftell(FILE *stream);
  661. extern void    rewind(FILE *stream);
  662. extern void     perror(const char *s);
  663.  
  664. extern int     fileno(FILE *stream);
  665. extern FILE     *fdopen(int fildes, char *type);
  666.  
  667. extern int     getw(FILE *stream);
  668. extern int     putw(int w, FILE *stream);
  669. extern char     *tempnam(char*,char*);
  670. extern FILE     *popen(char *cmd, char *mode);
  671. extern int     pclose(FILE *ptr);
  672. extern char    *ctermid(char *);
  673. extern char     *cuserid(char *);
  674. extern void    *memchr(const void *s, int c, size_t n);
  675. extern void    *memcpy(void *s1, const void *s2, size_t n);
  676. extern void    *memset(void *s, int c, size_t n);
  677. extern size_t     strcspn(const char *s1, const char *s2);
  678. extern size_t    strlen(const char *s);
  679. extern size_t    strspn(const char *s1, const char *s2);
  680.  
  681. extern void     *memmove(void *s1, const void *s2, size_t n);
  682. extern char     *strcpy(char *s1, const char *s2);
  683. extern char     *strncpy(char *s1, const char *s2, size_t n);
  684. extern char     *strcat(char *s1, const char *s2);
  685. extern char    *strncat(char *s1, const char *s2, size_t n);
  686. extern int     memcmp(const void *s1, const void *s2,size_t n);
  687. extern int    strcmp(const char *s1, const char *s2);
  688. extern int    strcoll(const char *s1, const char *s2);
  689. extern int    strncmp(const char *s1,const char *s2,size_t n);
  690. extern size_t     strxfrm(char *s1, const char *s2, size_t n);
  691. extern int    strncollen(const char *, const int );
  692. extern char    *strchr(const char *s, int c);
  693. extern char    *strpbrk(const char *s1, const char *s2);
  694. extern char    *strrchr(const char *s, int c);
  695. extern char    *strstr(const char *s1, const char *s2);
  696. extern char     *strtok(char *s1, const char *s2);
  697. extern char     *strerror(int errnum);
  698.  
  699. extern void    *memccpy(void *target, const void *source, int c, size_t n);
  700. extern char     *index(const char *s, int c);
  701. extern char     *rindex(const char *s, int c);
  702. struct    tm {    
  703.     int    tm_sec;
  704.     int    tm_min;
  705.     int    tm_hour;
  706.     int    tm_mday;
  707.     int    tm_mon;
  708.     int    tm_year;
  709.     int    tm_wday;
  710.     int    tm_yday;
  711.     int    tm_isdst;
  712. };
  713.  
  714. extern clock_t     clock(void);
  715. extern double     difftime(time_t time1, time_t time0);
  716. extern time_t     mktime(struct tm *timeptr);
  717. extern time_t     time(time_t *timer);
  718. extern char     *asctime(const struct tm *timeptr);
  719. extern char     *ctime(const time_t *timer);
  720. extern struct tm *gmtime(const time_t *timer);
  721. extern struct tm *localtime(const time_t *timer);
  722. extern size_t     strftime(char *s, size_t maxsize, const char *format,                           const struct tm *timeptr);
  723.  
  724. extern char *tzname[];
  725. extern void tzset(void);
  726.  
  727. extern long timezone;
  728. extern int daylight;
  729. extern unsigned char *NLctime(long *t);
  730. extern unsigned char *NLasctime(struct tm *t);
  731. extern char *NLstrtime(char *s, size_t maxsize, const char *format,                                    const struct tm *timeptr);
  732.  
  733. typedef unsigned char    UByte;
  734. typedef unsigned short    UShort;
  735. typedef unsigned long    ULong;
  736.  
  737.   typedef long         AInt;
  738.   typedef unsigned long     UAInt;
  739.  
  740. typedef int        Bool;
  741. typedef UAInt        Hash;
  742. typedef size_t        Length;
  743. typedef ULong        Offset;
  744. typedef ULong        Millisec;
  745.  
  746.    typedef void        *Pointer;
  747.    typedef const void    *ConstPointer;
  748.  
  749. typedef char        *String;
  750.  
  751. typedef char        *IOMode;
  752.  
  753. typedef float        SFloat;
  754. typedef double        DFloat;
  755.    typedef long double    LongDouble;
  756.  
  757. typedef double    MostAlignedType;
  758. extern int    osRun        (String);
  759.  
  760. extern Millisec    osCpuTime       (void);
  761.  
  762. extern String    osDate          (void);
  763. extern String    osGetenv    (String envar);
  764. extern String    osExtSep;
  765. extern String    osDirSep;
  766. extern String    osPathSep;
  767. extern String   osCurDirName;
  768. extern String   osDefaultExecutePath;
  769. extern String   osDefaultLibraryPath;
  770. extern String   osDefaultIncludePath;
  771.  
  772. extern String    osExecutePath    (void);
  773. extern String    osLibraryPath    (void);
  774. extern String    osIncludePath    (void);
  775.  
  776. extern void    osFnameParse    (String* partv, String buffer,
  777.                  String fname, String relativeTo);
  778. extern String   osFnameUnparse  (String dir, String name, String type,
  779.                  String buffer);
  780. extern Length   osFnameLength   (String dir, String name, String type);
  781.  
  782. extern IOMode    osIoRdMode;
  783. extern IOMode    osIoWrMode;
  784. extern IOMode    osIoApMode;
  785. extern IOMode    osIoRbMode;
  786. extern IOMode    osIoWbMode;
  787. extern IOMode    osIoAbMode;
  788. extern IOMode    osIoRubMode;
  789. extern IOMode    osIoWubMode;
  790. extern IOMode    osIoAubMode;
  791. extern int    osFileRemove   (String fn);
  792. extern Hash     osFileHash     (String fn);
  793. extern Bool    osIsInteractive(FILE *);
  794.     
  795. typedef    void        (*SignalHandler) (int signal);
  796.  
  797. extern SignalHandler    osSetBreakHandler(SignalHandler);
  798. extern SignalHandler    osSetFaultHandler(SignalHandler);
  799. extern SignalHandler    osSetLimitHandler(SignalHandler);
  800.  
  801. extern Pointer    osAllocBytes     (unsigned align, unsigned long nbytes);
  802.  
  803. struct osMemMap {
  804.     int    use;
  805.     Pointer    lo, hi;
  806. };
  807.  
  808. extern struct osMemMap    *osMemMap(int mask);
  809.  
  810. enum osCcTag {
  811.     OSCC_START,                
  812.     OSCC_LibPath = OSCC_START,    
  813.     OSCC_Library,            
  814.     OSCC_IncPath,            
  815.     OSCC_Define,            
  816.     OSCC_Undefine,            
  817.     OSCC_Optimize,            
  818.     OSCC_DebugInfo,            
  819.     OSCC_ProfileInfo,        
  820.     OSCC_OutputFile,        
  821.     OSCC_LIMIT
  822. };
  823.  
  824. struct osCcOption {
  825.     enum osCcTag        tag;
  826.     String            arg;
  827.     struct osCcOption    *next;
  828. };
  829.  
  830. extern int    osCCompileCommand (String buf, int fnc, String *fnv,
  831.                    struct osCcOption *,
  832.                    String cmd, String xopts);
  833. extern int    osLinkCommand      (String buf , int fnc, String *fnv,
  834.                    struct osCcOption *,
  835.                    String cmd, String xopts);
  836.      
  837. struct osObjectRenumber {
  838.     char *    functionName;
  839.     int    oldStart, newStart;
  840.     int    lnoc;
  841.     struct    {int old, new;} *lnov;
  842. };
  843.  
  844. extern void    osObjectRenumber  (String fname, struct osObjectRenumber *);
  845.  
  846. extern void    testSelf    (String testName);
  847.  
  848.     extern Bool dbFlag;
  849.  
  850. extern int  findent;
  851. extern int  fnewline    (FILE *f);
  852.  
  853. typedef int (*XPutFun)  (const char *s, int n);
  854.  
  855. extern  int  xprintf    (XPutFun, const char *fmt, ...);
  856. extern  int  vxprintf    (XPutFun, const char *fmt, va_list argp);
  857.  
  858. struct fluidCell {
  859.     String        scopeName;    
  860.     int        scopeLevel;    
  861.     Pointer        pglobal,    
  862.             pstack;        
  863.     long        size;        
  864. };
  865.  
  866. typedef struct {
  867.     int        fluidLevel;
  868.     jmp_buf         buf;
  869. } JmpBuf;
  870.  
  871. extern struct fluidCell    *fluidStack;
  872.  
  873. extern int         fluidLevel,    
  874.              fluidLimit,    
  875.              fluidIncrement;
  876.  
  877. extern int         scopeLevel;    
  878.  
  879. extern struct fluidCell    *fluidGrow    (void);
  880. extern void         fluidUnwind    (int toCell, Bool isLongJmp);
  881.  
  882. extern MostAlignedType* stoAlloc        (unsigned code, Length size);
  883. extern void             stoFree         (Pointer p);
  884. extern void             stoGc           (void);
  885.  
  886. extern Length           stoSize         (Pointer p);
  887. extern MostAlignedType* stoResize       (Pointer p, Length size);
  888.  
  889. extern unsigned         stoCode         (Pointer p);
  890. extern MostAlignedType* stoRecode       (Pointer p, unsigned code);
  891.  
  892. extern Bool             stoIsPointer    (Pointer p);
  893.  
  894. extern void             stoAudit        (void);
  895. extern void         stoShow     (void);
  896.  
  897. extern ULong            stoBytesOwn;
  898. extern ULong            stoBytesAlloc;
  899. extern ULong        stoBytesFree;
  900. extern ULong        stoBytesGc;
  901. extern ULong        stoPiecesGc[32 ];
  902.  
  903. typedef MostAlignedType*    (*StoErrorFun)  (int errnum);
  904. extern  StoErrorFun         stoSetHandler   (StoErrorFun);
  905.                 
  906. extern  StoErrorFun        stoSetFreeAgain    (StoErrorFun);
  907. extern void    exitSuccess    ();
  908. extern void    exitFailure    ();
  909.  
  910. typedef void    (*ExitFun)    (int status);
  911. extern ExitFun    exitSetHandler    (ExitFun);    
  912. extern Bool    exitTrap;            
  913.  
  914. extern void    bug        (String fmt, ...);
  915.  
  916. extern ULong    _binPrime[];
  917.  
  918. extern int cielLg (ULong);
  919.  
  920. typedef struct btree     *BTree;
  921. typedef struct btreePart *BTreePart;
  922.  
  923. typedef Length           BTreeKey;
  924. typedef Pointer          BTreeElt;
  925.  
  926. typedef BTreeElt     (*BTreeEltFun)  (BTreeElt);
  927. typedef BTree        (*BTreeAllocFun)(Length nbytes);
  928. typedef void         (*BTreeFreeFun) (BTree);
  929.  
  930. struct btreePart {
  931.     BTree            branch;
  932.     BTreeKey         key;
  933.     BTreeElt         entry;
  934. };
  935.  
  936. struct btree {
  937.     Bool             isLeaf;
  938.     unsigned short   t;
  939.     unsigned short   nKeys;
  940.     struct btreePart part[        10 ];    
  941. };
  942.  
  943. extern BTree    btreeNew        (Length t);
  944. extern void     btreeFree       (BTree);
  945. extern void     btreeInsert     (BTree*, BTreeKey, BTreeElt);
  946. extern void     btreeDelete     (BTree*, BTreeKey, BTreeElt *);
  947.  
  948. extern BTree    btreeNewX       (Length t, BTreeAllocFun);
  949. extern void     btreeFreeX      (BTree,    BTreeFreeFun);
  950. extern void     btreeInsertX    (BTree*, BTreeKey, BTreeElt,  BTreeAllocFun);
  951. extern void     btreeDeleteX    (BTree*, BTreeKey, BTreeElt *,BTreeFreeFun);
  952.  
  953. extern BTree    btreeNMap       (BTreeEltFun, BTree);
  954. extern BTree    btreeSearchEQ   (BTree, BTreeKey, int *pIx);
  955. extern BTree    btreeSearchGE   (BTree, BTreeKey, int *pIx);
  956. extern BTree    btreeSearchMin  (BTree, int *pIx);
  957. extern BTree    btreeSearchMax  (BTree, int *pIx);
  958.  
  959. extern int      btreeCheck      (BTree);
  960. extern int         btreePrint      (FILE *, BTree);
  961. static Length fixedSize[] = {
  962.     4, 8, 16, 24, 32, 40, 48, 64, 80, 96,     128
  963. };
  964.  
  965. static UByte  fixedSizeFor     [    128    +1];
  966.                 
  967. static UByte  fixedSizeIndexFor[    128    +1];
  968. enum PgKind {
  969.         PgFree,
  970.         PgBusyFirst,
  971.         PgBusyFollow,
  972.         PgPgMap,
  973.         PgBTree,
  974.         PgDLL,
  975.         PgForeign
  976. };
  977.  
  978. typedef char        Page[(1L<<         12    )   ];
  979. typedef UByte        PgInfo;
  980. typedef UByte        QmInfo;
  981.  
  982. typedef enum   PgKind    PgKind;        
  983. typedef struct PgMem     PgMem;        
  984.  
  985. typedef struct Section    Section;     
  986. typedef struct FxMem    FxMem;         
  987. typedef struct MxMem    MxMem;         
  988.  
  989. static   MostAlignedType *stoDefaultError  (int errnum);
  990. static StoErrorFun     stoError        = stoDefaultError;
  991. static StoErrorFun     stoFreeAgain        = stoDefaultError;
  992.  
  993. static int      stoIsInit  = 0;
  994.  
  995. static char     *heapStart,
  996.         *heapEnd;
  997.  
  998. static PgInfo   *pgMap;
  999. static Length   pgMapSize;
  1000. static Length    pgMapUses;
  1001.  
  1002. static PgMem    *freePages;
  1003.  
  1004. static FxMem    *fixedPieces[ (sizeof(fixedSize)/sizeof(fixedSize[0])) ];
  1005. static BTree    mixedPieces;
  1006. static MxMem    *mixedFrontier;
  1007.  
  1008. ULong          stoBytesOwn;    
  1009. ULong          stoBytesAlloc;    
  1010. ULong          stoBytesFree;    
  1011. ULong          stoBytesGc;    
  1012. ULong           stoPiecesGc[32 ];    
  1013. struct Section {
  1014.     short           pgCount;
  1015.  
  1016.     short           qmSize;
  1017.     UByte           qmSizeIndex;
  1018.      UByte       isFixed;
  1019.  
  1020.     Length          qmCount;
  1021.     Pointer         data;
  1022.     QmInfo          info[        10 ];
  1023. };
  1024.  
  1025. static  Length
  1026. sectQmCount(Length pageCount, Length qmSize)
  1027. {
  1028.     return (pageCount * (1L<<         12    )    - (sizeof(Section) +  0 * sizeof( QmInfo) -         10  * sizeof( QmInfo))  )/(qmSize + sizeof(QmInfo));
  1029. }
  1030.  
  1031.  
  1032.  
  1033.  
  1034. static  Section *
  1035. sectPrepare(Page *p, Length npages, Length sz, int isFixed)
  1036. {
  1037.     Section *x     = (Section *) p;
  1038.     Length  i, nq;
  1039.  
  1040.     x->pgCount     = npages;
  1041.     x->qmSize      = sz;
  1042.     x->qmSizeIndex = fixedSizeIndexFor[sz <=     128     ? sz : 0];
  1043.     x->isFixed     = isFixed;
  1044.     x->qmCount     = nq = sectQmCount(npages, sz);
  1045.     x->data        = (Pointer)((char *) p + npages * (1L<<         12    )    -nq * sz);
  1046.     
  1047.  
  1048.  
  1049.  
  1050.         x->info[0] =       (  0x40 )     ;
  1051.     if (isFixed)
  1052.         for (i = 1; i < nq; i++)
  1053.                 x->info[i] =       (  0x40 )     ;
  1054.     else
  1055.         for (i = 1; i < nq; i++)
  1056.                 x->info[i] =       (     0x00 )     ;
  1057.  
  1058.     return x;
  1059. }
  1060.  
  1061. static  Section *
  1062. _sectFor(Pointer p)
  1063. {
  1064.     Length  pi;
  1065.  
  1066.     if (!isInHeap(p)) goto error;
  1067.     pi = pgNo(p);
  1068.     if (pgMap[pi] == PgBusyFirst)
  1069.         return (Section *)((Page *) heapStart + pi);
  1070.     if (pgMap[pi] != PgBusyFollow)
  1071.         goto error;
  1072.     while (pgMap[pi] == PgBusyFollow)
  1073.         pi--;
  1074.     if (pgMap[pi] == PgBusyFirst)
  1075.         return (Section *)((Page *) heapStart + pi);
  1076. error:  (*stoError)(2  );
  1077.     {printf("Not supposed to reach line %d in file: %s\n",359, "store.c"); return 0;} ;
  1078. }
  1079.  
  1080. ===============================================================================
  1081. David Edelsohn                                      T.J. Watson Research Center
  1082. c$dje@watson.ibm.com                                P.O. Box 218
  1083. +1 914 945 3011 (Tieline 862)                       Yorktown Heights, NY 10598
  1084. "If G-D had wanted us to vote, he would have given us candidates" -- Jay Leno
  1085.