public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Your recent reload changes
@ 2000-08-22  8:46 Jeffrey A Law
  2000-08-22 11:01 ` Richard Henderson
  2000-08-22 14:26 ` Joern Rennecke
  0 siblings, 2 replies; 9+ messages in thread
From: Jeffrey A Law @ 2000-08-22  8:46 UTC (permalink / raw)
  To: rth; +Cc: gcc

This change has broken the PA port:

        * reload.c (push_secondary_reload): Revert last change.
        If we use a reload_in/out pattern, make the when the same
        as the primary reload.
        (find_reloads): Likewise.

Basically we're running out of reloads for a particular insn.

Basically we have an insn like this:
(insn 1034 1031 1036 (set (mem/f:SI (lo_sum:SI (reg:SI 466)
                (symbol_ref:SI ("warn_std_ptr"))) 110)
        (reg:SI 467)) 69 {pre_ldw-4} (nil)

Neither register will get a hard reg.

(reg:SI 466) is equivalent to (high (symbol_ref ("warn_std_ptr"))
(reg:SI 467) is equivalent to (symbol_ref "whatever")

So we need to reload (high (symbol_ref ("warn_std_ptr")) into GENERAL_REGS,
to do that we need a secondary reload for R1_REGS (loading a symbolic constant
requires %r1 on the PA).  That's going to generate two reloads.

There's an optional reload for the MEM expression as a whole, I don't think
it's important.

Then we need to reload (symbol_ref "whatever") into GENERAL_REGS, again to
do that we need a secondary reload of R1_REGS.

In all there's 5 reloads.  Looking at the toolchain without your patch I
get the following reloads:

Reloads for insn # 1034
Reload 0: R1_REGS, RELOAD_FOR_OPERAND_ADDRESS (opnum = 0), can't combine, 
second
ary_reload_p
        reload_reg_rtx: (reg:SI 1 %r1)
Reload 1: reload_in (SI) = (high:SI (symbol_ref:SI ("warn_std_ptr")))
        GENERAL_REGS, RELOAD_FOR_OPERAND_ADDRESS (opnum = 0), can't combine
        reload_in_reg: (reg:SI 466)
        reload_reg_rtx: (reg:SI 19 %r19)
        secondary_in_reload = 0
Reload 2: reload_out (SI) = (mem/f:SI (lo_sum:SI (reg:SI 466)
                                                        (symbol_ref:SI 
("warn_st
d_ptr"))) 110)
        NO_REGS, RELOAD_FOR_OUTPUT (opnum = 0), optional
        reload_out_reg: (mem/f:SI (lo_sum:SI (reg:SI 466)
                                                        (symbol_ref:SI 
("warn_st
d_ptr"))) 110)
Reload 3: R1_REGS, RELOAD_FOR_INPUT_ADDRESS (opnum = 1), can't combine, 
secondar
y_reload_p
        reload_reg_rtx: (reg:SI 1 %r1)
Reload 4: reload_in (SI) = (symbol_ref:SI ("warn_std"))
        GENERAL_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine
        reload_in_reg: (reg:SI 467)
        reload_reg_rtx: (reg:SI 20 %r20)
        secondary_in_reload = 3

This will result in the reloads being emitted in the following order, note
carefully how the secondary register %r1 is successfully used by two reloads
as they do not have overlapping lifetimes.


#3, #4, #0, #1


However, after your patch we get the following reloads:

Reload 0: R1_REGS, RELOAD_FOR_INPUT (opnum = 0), can't combine, 
secondary_reload_p
Reload 1: reload_in (SI) = (high:SI (symbol_ref:SI ("warn_std_ptr")))
        GENERAL_REGS, RELOAD_FOR_OUTPUT_ADDRESS (opnum = 0), can't combine
        reload_in_reg: (reg:SI 466)
        secondary_in_reload = 0
        secondary_in_icode = reload_insi
Reload 2: reload_out (SI) = (mem/f:SI (lo_sum:SI (reg:SI 466)
                                                        (symbol_ref:SI 
("warn_std_ptr"))) 110)
        NO_REGS, RELOAD_FOR_OUTPUT (opnum = 0), optional
        reload_out_reg: (mem/f:SI (lo_sum:SI (reg:SI 466)
                                                        (symbol_ref:SI 
("warn_std_ptr"))) 110)
Reload 3: R1_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine, 
secondary_reload_p
Reload 4: reload_in (SI) = (symbol_ref:SI ("warn_std"))
        GENERAL_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine
        reload_in_reg: (reg:SI 467)
        secondary_in_reload = 3
        secondary_in_icode = reload_insi

Which gives us the following output order:

#0, #3, #4, #2

OUCH!  The reload reg for #0 is live across the reloads for #3, #4, which
is bad since we can no longer use R1_REGS to satisfy #0 and #3.


Compile with -O2 on the PA (a cross compiler should work fine).  It'll
abort in reload because it's unable to find a free register for spilling
purposes in R1_REGS.

# 1 "j.c"
enum cmp_type
{
  CMP_SI,
  CMP_SF,
  CMP_DF,
  CMP_MAX
};
extern unsigned int total_code_bytes;
enum processor_type
{
  PROCESSOR_700,
  PROCESSOR_7100,
  PROCESSOR_7100LC,
  PROCESSOR_7200,
  PROCESSOR_8000
};
extern const char *pa_cpu_string;
extern enum processor_type pa_cpu;
enum architecture_type
{
  ARCHITECTURE_10,
  ARCHITECTURE_11,
  ARCHITECTURE_20
};
extern const char *pa_arch_string;
extern enum architecture_type pa_arch;
extern int target_flags;
struct hppa_args {int words, nargs_prototype, indirect; };
extern struct rtx_def *hppa_compare_op0, *hppa_compare_op1;
extern enum cmp_type hppa_branch_type;
extern int may_call_alloca;
enum reg_class { NO_REGS, R1_REGS, GENERAL_REGS, FPUPPER_REGS, FP_REGS,
                 GENERAL_OR_FP_REGS, SHIFT_REGS, ALL_REGS, LIM_REG_CLASSES};
typedef __builtin_va_list __gnuc_va_list;
typedef __gnuc_va_list va_list;
typedef char int8_t;
typedef unsigned char uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned int uint32_t;
typedef int intfast_t;
typedef unsigned int uintfast_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef char int_least8_t;
typedef unsigned char uint_least8_t;
typedef int int_fast8_t;
typedef unsigned int uint_fast8_t;
typedef short int_least16_t;
typedef unsigned short uint_least16_t;
typedef int int_fast16_t;
typedef unsigned int uint_fast16_t;
typedef int int_least32_t;
typedef unsigned int uint_least32_t;
typedef int int_fast32_t;
typedef unsigned int uint_fast32_t;
typedef int64_t int_least64_t;
typedef int64_t int_fast64_t;
typedef uint64_t uint_least64_t;
typedef uint64_t uint_fast64_t;
typedef uint32_t ptr32_t;
                typedef int mqd_t;
     typedef int32_t dev_t;
        typedef uint32_t ino32_t;
       typedef uint64_t ino64_t;
         typedef unsigned long ino_t;
     typedef uint16_t mode_t;
     typedef uint16_t nlink_t;
    typedef int32_t fpos32_t;
       typedef int64_t fpos64_t;
       typedef long fpos_t;
     typedef uint32_t fsblkcnt32_t;
       typedef uint64_t fsblkcnt64_t;
       typedef unsigned long fsblkcnt_t;
     typedef int32_t off32_t;
        typedef int64_t off64_t;
        typedef long off_t;
     typedef uint32_t fsfilcnt32_t;
       typedef uint64_t fsfilcnt64_t;
        typedef unsigned long fsfilcnt_t;
     typedef int32_t blkcnt32_t;
       typedef int64_t blkcnt64_t;
        typedef long blkcnt_t;
     typedef int32_t pid_t;
     typedef int32_t lwpid_t;
     typedef int32_t gid_t;
     typedef int32_t uid_t;
     typedef int32_t tid_t;
        typedef long ssize_t;
     typedef uint16_t __site_t;
     typedef uint16_t __cnode_t;
                typedef long time_t;
typedef long unsigned int size_t;
     typedef uint32_t clock_t;
      typedef int32_t key_t;
   typedef unsigned short __ushort;
   typedef int32_t __daddr_t;
   typedef char *__caddr_t;
   typedef int32_t __swblk_t;
     typedef __caddr_t caddr_t;
     typedef int32_t id_t;
     typedef uint32_t useconds_t;
      typedef uint32_t rlim32_t;
        typedef uint64_t rlim64_t;
       typedef unsigned long rlim_t;
   typedef __site_t site_t;
   typedef unsigned char u_char;
   typedef unsigned short u_short;
   typedef unsigned int u_int;
   typedef unsigned long u_long;
   typedef unsigned int uint;
   typedef unsigned short ushort;
   typedef unsigned char ubit8;
   typedef unsigned short ubit16;
   typedef uint32_t ubit32;
   typedef char sbit8;
   typedef short sbit16;
   typedef int32_t sbit32;
   typedef __swblk_t swblk_t;
   typedef __daddr_t daddr_t;
   typedef __cnode_t cnode_t;
   typedef uintptr_t paddr_t;
   typedef intptr_t page_t;
   typedef int32_t pgcnt_t;
   typedef uint32_t physpfn_t;
   typedef uintptr_t iophyspfn_t;
   typedef uintptr_t pgaddr_t;
   typedef uint32_t space_t;
   typedef uint32_t prot_t;
   typedef unsigned long ulong_t;
   typedef int16_t cnt_t;
   typedef uint32_t cdno_t;
   typedef uint16_t use_t;
   typedef struct _physadr { intptr_t r[1]; } *physadr;
   typedef struct _quad { long val[2]; } quad;
   typedef int spu_t;
     typedef short cpu_t;
     typedef struct label_t {
        int32_t lbl_rp;
        int32_t lbl_sp;
        int32_t lbl_s[17];
        int32_t lbl_ss[1];
        double lbl_sf[10];
    } label_t;
typedef struct lkinfo {
       char *lk_name;
       int lk_flags;
       long lk_pad[2];
} lkinfo_t;
typedef unsigned long pl_t;
   typedef char *dm_message;
      typedef int32_t aid_t;
   typedef pid_t sid_t;
typedef int32_t __fd_mask;
   typedef struct fd_set {
     long fds_bits[(((2048)+(((sizeof(long) * 8))-1))/((sizeof(long) * 8)))];
     } fd_set;
     typedef __fd_mask fd_mask;
        typedef int32_t dir_off_t;
   typedef struct {
        int __cnt;
        unsigned char *__ptr;
        unsigned char *__base;
        unsigned short __flag;
        unsigned char __fileL;
        unsigned char __fileH;
   } FILE;
   typedef struct {
        int __cnt;
        unsigned char *__ptr;
        unsigned char *__base;
        unsigned short __flag;
        unsigned char __fileL;
        unsigned char __fileH;
        unsigned char *__bufendp;
        unsigned char *__newbase;
        unsigned char __smbuf[8+2*4];
        void *__unused;
   } _FILEX;
     typedef double *__va_list;
   extern FILE __iob[];
     extern int remove(const char *);
     extern int rename(const char *, const char *);
     extern char *tmpnam(char *);
     extern int fclose(FILE *);
     extern int fflush(FILE *);
     extern void setbuf(FILE *, char *);
     extern int setvbuf(FILE *, char *, int, size_t);
     extern int fprintf(FILE *, const char *, ...);
     extern int fscanf(FILE *, const char *,...);
     extern int printf(const char *,...);
     extern int scanf(const char *,...);
     extern int sprintf(char *, const char *,...);
     extern int sscanf(const char *, const char *,...);
     extern int fgetc(FILE *);
     extern char *fgets(char *, int, FILE *);
     extern int fputc(int, FILE *);
     extern int fputs(const char *, FILE *);
     extern int getc(FILE *);
     extern int getchar(void);
     extern char *gets(char *);
     extern int putc(int, FILE *);
     extern int putchar(int);
     extern int puts(const char *);
     extern int ungetc(int, FILE *);
     extern FILE *tmpfile(void);
     extern int fgetpos(FILE *, fpos_t *);
     extern int fsetpos(FILE *, const fpos_t *);
     extern FILE *fopen(const char *, const char *);
     extern FILE *freopen(const char *, const char *, FILE *);
     extern int fseek(FILE *, long int, int);
     extern long int ftell(FILE *);
     extern void rewind(FILE *);
     extern void clearerr(FILE *);
     extern int feof(FILE *);
     extern int ferror(FILE *);
     extern void perror(const char *);
       extern size_t fread(void *, size_t, size_t, FILE *);
       extern size_t fwrite(const void *, size_t, size_t, FILE *);
     extern int __flsbuf(unsigned char, FILE *);
     extern int __filbuf(FILE *);
     extern char *ctermid(char *);
     extern int fileno(FILE *);
     extern FILE *fdopen(int, const char *);
         typedef double *__not_va_list__;
     extern char *optarg;
     extern int opterr;
     extern int optind;
     extern int optopt;
       extern int getopt(int, char * const [], const char *);
       extern char *cuserid(char *);
     extern int getw(FILE *);
     extern int putw(int, FILE *);
     extern int pclose(FILE *);
     extern FILE *popen(const char *, const char *);
     extern char *tempnam(const char *, const char *);
     extern int vprintf(const char *, __gnuc_va_list);
     extern int vfprintf(FILE *, const char *, __gnuc_va_list);
     extern int vsprintf(char *, const char *, __gnuc_va_list);
     extern int snprintf(char *, size_t, char *,...);
     extern int vsnprintf(char *, size_t, const char *, __gnuc_va_list);
     extern int vscanf(const char *, __gnuc_va_list);
     extern int vfscanf(FILE *, const char *, __gnuc_va_list);
     extern int vsscanf(char *, const char *, __gnuc_va_list);
     extern void flockfile(FILE *);
     extern int ftrylockfile(FILE *);
     extern void funlockfile(FILE *);
   extern unsigned char *__bufendtab[];
     extern int isalnum(int);
     extern int isalpha(int);
     extern int iscntrl(int);
     extern int isdigit(int);
     extern int isgraph(int);
     extern int islower(int);
     extern int isprint(int);
     extern int ispunct(int);
     extern int isspace(int);
     extern int isupper(int);
     extern int isxdigit(int);
     extern unsigned char *__ctype;
     extern unsigned char *__ctype2;
     extern unsigned char *__upshift;
     extern unsigned char *__downshift;
extern int tolower(int);
extern int toupper(int);
     extern int isascii(int);
     extern int toascii(int);
extern int __tolower(int);
extern int __toupper(int);
     extern int isctype(int, unsigned int);
     extern int isblank(int);
     extern unsigned int *__SB_masks;
     extern int _isalnum(int);
     extern int _isalpha(int);
     extern int _iscntrl(int);
     extern int _isdigit(int);
     extern int _isgraph(int);
     extern int _islower(int);
     extern int _isprint(int);
     extern int _ispunct(int);
     extern int _isspace(int);
     extern int _isupper(int);
     extern int _isxdigit(int);
        extern int errno;
         extern int errno;
extern int errno;
     extern int memcmp(const void *, const void *, size_t);
     extern char *strncat(char *, const char *, size_t);
     extern int strncmp(const char *, const char *, size_t);
     extern void *memmove(void *, const void *, size_t);
     extern char *strcpy(char *, const char *);
     extern char *strncpy(char *, const char *, size_t);
     extern char *strcat(char *, const char *);
     extern int strcmp(const char *, const char *);
     extern int strcoll(const char *, const char *);
     extern size_t strxfrm(char *, const char *, size_t);
     extern char *strchr(const char *, int);
     extern char *strpbrk(const char *, const char *);
     extern char *strrchr(const char *, int);
     extern char *strstr(const char *, const char *);
     extern char *strtok(char *, const char *);
     extern char *strerror(int);
       extern void *memcpy(void *, const void *, size_t);
       extern void *memchr(const void *, int, size_t);
       extern void *memset(void *, int, size_t);
       extern size_t strcspn(const char *, const char *);
       extern size_t strspn(const char *, const char *);
          extern size_t strlen(const char *);
       extern void *memccpy(void *, const void *, int, size_t);
     extern char *strdup(const char *);
     extern char *strrstr(const char *, const char *);
     extern int strcasecmp(const char *, const char *);
     extern int strncasecmp(const char *, const char *, size_t);
     extern int nl_strcmp(const char *, const char *);
     extern int nl_strncmp(const char *, const char *, size_t);
     extern char *index(const char *, int);
     extern char *rindex(const char *, int);
     extern void bcopy(const void *, void *, size_t);
     extern int bcmp(const void *, const void *, size_t);
     extern void bzero(void *, size_t);
                        extern int strcasecmp(const char *, const char *);
                        extern int strncasecmp(const char *, const char *, 
size_t);
     extern int ffs(int);
   extern int __nl_char_size;
   typedef struct {
        int quot;
        int rem;
   } div_t;
   typedef struct {
        long int quot;
        long int rem;
   } ldiv_t;
                        typedef unsigned int wchar_t;
       extern double atof(const char *);
     extern int atoi(const char *);
     extern long int atol(const char *);
     extern double strtod(const char *, char **);
     extern long int strtol(const char *, char **, int);
     extern unsigned long int strtoul(const char *, char **, int);
     extern int rand(void);
     extern void srand(unsigned int);
     extern int atexit(void (*) (void));
     extern void exit(int);
     extern char *getenv(const char *);
     extern int system(const char *);
       extern int abs(int);
     extern div_t div(int, int);
     extern ldiv_t ldiv(long int, long int);
     extern long int labs(long int);
     extern int mblen(const char *, size_t);
     extern int mbtowc(wchar_t *, const char *, size_t);
     extern int wctomb(char *, wchar_t);
     extern size_t mbstowcs(wchar_t *, const char *, size_t);
     extern size_t wcstombs(char *, const wchar_t *, size_t);
     extern void free(void *);
     extern void qsort(void *, size_t, size_t, int (*)(const void *, const 
void *));
       extern void abort(void);
       extern void *bsearch(const void *, const void *, size_t, size_t, int 
(*) (const void *, const void *));
       extern void *calloc(size_t, size_t);
       extern void *malloc(size_t);
       extern void *realloc(void *, size_t);
     extern void setkey(const char *);
     extern void lcong48( unsigned short [] );
        extern double drand48(void);
        extern double erand48(unsigned short []);
        extern long jrand48(unsigned short []);
        extern long lrand48(void);
        extern long mrand48(void);
        extern long nrand48(unsigned short []);
        extern void srand48(long);
        extern unsigned short *seed48(unsigned short []);
        extern int putenv(const char *);
       extern int clearenv(void);
       extern int getopt(int, char * const [], const char *);
       extern char *getpass(const char *);
     extern char *optarg;
     extern int optind;
     extern int opterr;
       extern pid_t wait(int *);
       extern pid_t waitpid(pid_t, int *, int);
typedef union sigval {
      struct {
          int __svi_int;
      } __svi_int_s;
      void * __sival_ptr;
   } sigval_t;
typedef int pthread_attr_t;
typedef struct sigevent {
      int __sigev_notify;
      int __sigev_signo;
      sigval_t __sigev_value;
      void (*__sigev_notify_function)(sigval_t);
      pthread_attr_t *__sigev_notify_attributes;
      int __sigev_reserved[8];
   } sigevent_t;
  enum __sigev_types {
          __SIGEV_NONE = 1,
          __SIGEV_SIGNAL
          ,__SIGEV_THREAD
  };
   struct tm {
      int tm_sec;
      int tm_min;
      int tm_hour;
      int tm_mday;
      int tm_mon;
      int tm_year;
      int tm_wday;
      int tm_yday;
      int tm_isdst;
   };
  struct timespec {
        time_t tv_sec;
        long tv_nsec;
};
typedef struct timespec timestruc_t;
struct itimerspec {
        struct timespec it_interval;
        struct timespec it_value;
};
typedef enum __clockid_t {
        CLOCK_INVALID = 0,
        CLOCK_REALTIME = 1,
        CLOCK_VIRTUAL = 2,
        CLOCK_PROFILE = 4,
        RTTIMER0 = 8,
        RTTIMER1 = 16
} clockid_t;
        typedef unsigned long timer_t;
        struct timeval {
                time_t tv_sec;
                long tv_usec;
        };
   struct itimerval {
        struct timeval it_interval;
        struct timeval it_value;
   };
   struct timezone {
        int tz_minuteswest;
        int tz_dsttime;
   };
   typedef struct __cycles {
        uint32_t hi;
        uint32_t lo;
   } cycles_t;
     extern double difftime(time_t, time_t);
     extern time_t mktime(struct tm *);
     extern time_t time(time_t *);
     extern char *asctime(const struct tm *);
     extern char *ctime(const time_t *);
     extern struct tm *gmtime(const time_t *);
     extern struct tm *localtime(const time_t *);
     extern size_t strftime(char *, size_t, const char *, const struct tm *);
       extern clock_t clock(void);
     extern void tzset(void);
   extern char *tzname[2];
     extern int clock_settime(clockid_t, const struct timespec *);
     extern int clock_gettime(clockid_t, struct timespec *);
     extern int clock_getres(clockid_t, struct timespec *);
     extern int timer_create(clockid_t, struct sigevent *, timer_t *);
     extern int timer_delete(timer_t);
     extern int timer_settime(timer_t, int, const struct itimerspec *,
                              struct itimerspec *);
     extern int timer_gettime(timer_t, struct itimerspec *);
     extern int timer_getoverrun(timer_t);
     extern int nanosleep(const struct timespec *, struct timespec *);
         extern char *strptime(const char *, const char *, struct tm *);
       extern long timezone;
       extern int daylight;
     extern int getitimer(int, struct itimerval *);
     extern int setitimer(int, const struct itimerval *, struct itimerval *);
     extern int utimes(const char *path, const struct timeval amtimes[2]);
     extern int gettimeofday(struct timeval *, void *);
       extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
     extern int adjtime(const struct timeval *, struct timeval *);
       extern struct tm *getdate(const char *);
     extern int settimeofday(const struct timeval *, const struct timezone *);
     extern int stime(const time_t *);
     extern void profil(const void *, size_t, size_t, int);
       extern int getdate_err;
    struct ki_timeval {
            uint32_t pad1;
            uint32_t pad2;
    };
typedef uint64_t kt_t;
struct rlimit {
        rlim_t rlim_cur;
        rlim_t rlim_max;
};
struct rusage {
        struct timeval ru_utime;
        struct timeval ru_stime;
        long ru_maxrss;
        long ru_ixrss;
        long ru_idrss;
        long ru_isrss;
        long ru_minflt;
        long ru_majflt;
        long ru_nswap;
        long ru_inblock;
        long ru_oublock;
        long ru_ioch;
        long ru_msgsnd;
        long ru_msgrcv;
        long ru_nsignals;
        long ru_nvcsw;
        long ru_nivcsw;
};
   extern int getpriority (int, id_t);
   extern int getrusage (int, struct rusage *);
   extern int setpriority (int, id_t, int);
   extern int getrlimit (int, struct rlimit *);
   extern int setrlimit (int, const struct rlimit *);
           extern pid_t wait3(int *, int, struct rusage *);
enum __si_codes {
        SI_QUEUE = -2,
        SI_USER = -1,
        SI_TIMER = 1,
        SI_ASYNCIO= 2,
        SI_MESGQ = 3
};
typedef struct __siginfo {
        int si_signo;
        int si_code;
        int si_errno;
        sigval_t si_value;
        union {
                struct {
                        pid_t __pid;
                        union {
                                struct {
                                        uid_t __uid;
                                } __kill;
                                struct {
                                        int __status;
                                } __SIGCLD;
                        } __pdata;
                } __proc;
                struct {
                        void *__addr;
                } __fault;
                struct {
                        int __fd;
                        long __band;
                } __file;
                struct {
                        void *__addr;
                        void *__lockpage;
                        long __dev_id;
                } __gfault;
        } __data;
        long __pad[9];
} siginfo_t;
     typedef struct __sigset_t {
          unsigned int sigset[8];
     } sigset_t;
typedef struct __fp_dbl_block {
        double ss_fp0;
        double ss_fp1;
        double ss_fp2;
        double ss_fp3;
        double ss_fp4;
        double ss_fp5;
        double ss_fp6;
        double ss_fp7;
        double ss_fp8;
        double ss_fp9;
        double ss_fp10;
        double ss_fp11;
        double ss_fp12;
        double ss_fp13;
        double ss_fp14;
        double ss_fp15;
        double ss_fp16;
        double ss_fp17;
        double ss_fp18;
        double ss_fp19;
        double ss_fp20;
        double ss_fp21;
        double ss_fp22;
        double ss_fp23;
        double ss_fp24;
        double ss_fp25;
        double ss_fp26;
        double ss_fp27;
        double ss_fp28;
        double ss_fp29;
        double ss_fp30;
        double ss_fp31;
} fp_dbl_block_t;
typedef struct __fp_int_block {
        int ss_fpstat;
        int ss_fpexcept1;
        int ss_fpexcept2;
        int ss_fpexcept3;
        int ss_fpexcept4;
        int ss_fpexcept5;
        int ss_fpexcept6;
        int ss_fpexcept7;
        int ss_fp4_hi;
        int ss_fp4_lo;
        int ss_fp5_hi;
        int ss_fp5_lo;
        int ss_fp6_hi;
        int ss_fp6_lo;
        int ss_fp7_hi;
        int ss_fp7_lo;
        int ss_fp8_hi;
        int ss_fp8_lo;
        int ss_fp9_hi;
        int ss_fp9_lo;
        int ss_fp10_hi;
        int ss_fp10_lo;
        int ss_fp11_hi;
        int ss_fp11_lo;
        int ss_fp12_hi;
        int ss_fp12_lo;
        int ss_fp13_hi;
        int ss_fp13_lo;
        int ss_fp14_hi;
        int ss_fp14_lo;
        int ss_fp15_hi;
        int ss_fp15_lo;
        int ss_fp16_hi;
        int ss_fp16_lo;
        int ss_fp17_hi;
        int ss_fp17_lo;
        int ss_fp18_hi;
        int ss_fp18_lo;
        int ss_fp19_hi;
        int ss_fp19_lo;
        int ss_fp20_hi;
        int ss_fp20_lo;
        int ss_fp21_hi;
        int ss_fp21_lo;
        int ss_fp22_hi;
        int ss_fp22_lo;
        int ss_fp23_hi;
        int ss_fp23_lo;
        int ss_fp24_hi;
        int ss_fp24_lo;
        int ss_fp25_hi;
        int ss_fp25_lo;
        int ss_fp26_hi;
        int ss_fp26_lo;
        int ss_fp27_hi;
        int ss_fp27_lo;
        int ss_fp28_hi;
        int ss_fp28_lo;
        int ss_fp29_hi;
        int ss_fp29_lo;
        int ss_fp30_hi;
        int ss_fp30_lo;
        int ss_fp31_hi;
        int ss_fp31_lo;
} fp_int_block_t;
typedef struct __reg64 {
        int64_t ss_reserved;
        int64_t ss_gr1;
        int64_t ss_rp;
        int64_t ss_gr3;
        int64_t ss_gr4;
        int64_t ss_gr5;
        int64_t ss_gr6;
        int64_t ss_gr7;
        int64_t ss_gr8;
        int64_t ss_gr9;
        int64_t ss_gr10;
        int64_t ss_gr11;
        int64_t ss_gr12;
        int64_t ss_gr13;
        int64_t ss_gr14;
        int64_t ss_gr15;
        int64_t ss_gr16;
        int64_t ss_gr17;
        int64_t ss_gr18;
        int64_t ss_gr19;
        int64_t ss_gr20;
        int64_t ss_gr21;
        int64_t ss_gr22;
        int64_t ss_arg3;
        int64_t ss_arg2;
        int64_t ss_arg1;
        int64_t ss_arg0;
        uint64_t ss_dp;
        uint64_t ss_ret0;
        uint64_t ss_ret1;
        uint64_t ss_sp;
        uint64_t ss_gr31;
        uint64_t ss_cr11;
        uint64_t ss_pcoq_head;
        uint64_t ss_pcsq_head;
        uint64_t ss_pcoq_tail;
        uint64_t ss_pcsq_tail;
        uint64_t ss_cr15;
        uint64_t ss_cr19;
        uint64_t ss_cr20;
        uint64_t ss_cr21;
        uint64_t ss_cr22;
        uint64_t ss_cpustate;
        uint64_t ss_sr4;
        uint64_t ss_sr0;
        uint64_t ss_sr1;
        uint64_t ss_sr2;
        uint64_t ss_sr3;
        uint64_t ss_sr5;
        uint64_t ss_sr6;
        uint64_t ss_sr7;
        uint64_t ss_cr0;
        uint64_t ss_cr8;
        uint64_t ss_cr9;
        uint64_t ss_cr10;
        uint64_t ss_cr12;
        uint64_t ss_cr13;
        uint64_t ss_cr24;
        uint64_t ss_cr25;
        uint64_t ss_cr26;
        uint64_t ss_cr27;
        uint64_t ss_reserved2[2];
        uint32_t ss_oldcksum;
        uint32_t ss_newcksum;
} __reg64_t;
typedef struct __reg32 {
        uint32_t ss_reserved[2];
        uint32_t ss_gr1_hi;
        uint32_t ss_gr1_lo;
        uint32_t ss_rp_hi;
        uint32_t ss_rp_lo;
        uint32_t ss_gr3_hi;
        uint32_t ss_gr3_lo;
        uint32_t ss_gr4_hi;
        uint32_t ss_gr4_lo;
        uint32_t ss_gr5_hi;
        uint32_t ss_gr5_lo;
        uint32_t ss_gr6_hi;
        uint32_t ss_gr6_lo;
        uint32_t ss_gr7_hi;
        uint32_t ss_gr7_lo;
        uint32_t ss_gr8_hi;
        uint32_t ss_gr8_lo;
        uint32_t ss_gr9_hi;
        uint32_t ss_gr9_lo;
        uint32_t ss_gr10_hi;
        uint32_t ss_gr10_lo;
        uint32_t ss_gr11_hi;
        uint32_t ss_gr11_lo;
        uint32_t ss_gr12_hi;
        uint32_t ss_gr12_lo;
        uint32_t ss_gr13_hi;
        uint32_t ss_gr13_lo;
        uint32_t ss_gr14_hi;
        uint32_t ss_gr14_lo;
        uint32_t ss_gr15_hi;
        uint32_t ss_gr15_lo;
        uint32_t ss_gr16_hi;
        uint32_t ss_gr16_lo;
        uint32_t ss_gr17_hi;
        uint32_t ss_gr17_lo;
        uint32_t ss_gr18_hi;
        uint32_t ss_gr18_lo;
        uint32_t ss_gr19_hi;
        uint32_t ss_gr19_lo;
        uint32_t ss_gr20_hi;
        uint32_t ss_gr20_lo;
        uint32_t ss_gr21_hi;
        uint32_t ss_gr21_lo;
        uint32_t ss_gr22_hi;
        uint32_t ss_gr22_lo;
        uint32_t ss_arg3_hi;
        uint32_t ss_arg3_lo;
        uint32_t ss_arg2_hi;
        uint32_t ss_arg2_lo;
        uint32_t ss_arg1_hi;
        uint32_t ss_arg1_lo;
        uint32_t ss_arg0_hi;
        uint32_t ss_arg0_lo;
        unsigned int ss_dp_hi;
        unsigned int ss_dp_lo;
        unsigned int ss_ret0_hi;
        unsigned int ss_ret0_lo;
        unsigned int ss_ret1_hi;
        unsigned int ss_ret1_lo;
        unsigned int ss_sp_hi;
        unsigned int ss_sp_lo;
        unsigned int ss_gr31_hi;
        unsigned int ss_gr31_lo;
        unsigned int ss_cr11_hi;
        unsigned int ss_cr11_lo;
        unsigned int ss_pcoq_head_hi;
        unsigned int ss_pcoq_head_lo;
        unsigned int ss_pcsq_head_hi;
        unsigned int ss_pcsq_head_lo;
        unsigned int ss_pcoq_tail_hi;
        unsigned int ss_pcoq_tail_lo;
        unsigned int ss_pcsq_tail_hi;
        unsigned int ss_pcsq_tail_lo;
        unsigned int ss_cr15_hi;
        unsigned int ss_cr15_lo;
        unsigned int ss_cr19_hi;
        unsigned int ss_cr19_lo;
        unsigned int ss_cr20_hi;
        unsigned int ss_cr20_lo;
        unsigned int ss_cr21_hi;
        unsigned int ss_cr21_lo;
        unsigned int ss_cr22_hi;
        unsigned int ss_cr22_lo;
        unsigned int ss_cpustate_hi;
        unsigned int ss_cpustate_lo;
        unsigned int ss_sr4_hi;
        unsigned int ss_sr4_lo;
        unsigned int ss_sr0_hi;
        unsigned int ss_sr0_lo;
        unsigned int ss_sr1_hi;
        unsigned int ss_sr1_lo;
        unsigned int ss_sr2_hi;
        unsigned int ss_sr2_lo;
        unsigned int ss_sr3_hi;
        unsigned int ss_sr3_lo;
        unsigned int ss_sr5_hi;
        unsigned int ss_sr5_lo;
        unsigned int ss_sr6_hi;
        unsigned int ss_sr6_lo;
        unsigned int ss_sr7_hi;
        unsigned int ss_sr7_lo;
        unsigned int ss_cr0_hi;
        unsigned int ss_cr0_lo;
        unsigned int ss_cr8_hi;
        unsigned int ss_cr8_lo;
        unsigned int ss_cr9_hi;
        unsigned int ss_cr9_lo;
        unsigned int ss_cr10_hi;
        unsigned int ss_cr10_lo;
        unsigned int ss_cr12_hi;
        unsigned int ss_cr12_lo;
        unsigned int ss_cr13_hi;
        unsigned int ss_cr13_lo;
        unsigned int ss_cr24_hi;
        unsigned int ss_cr24_lo;
        unsigned int ss_cr25_hi;
        unsigned int ss_cr25_lo;
        unsigned int ss_cr26_hi;
        unsigned int ss_cr26_lo;
        unsigned int ss_cr27_hi;
        unsigned int ss_cr27_lo;
        unsigned int ss_reserved2[4];
        unsigned int ss_oldcksum;
        unsigned int ss_newcksum;
} __reg32_t;
typedef struct __ss_narrow {
        int ss_gr1;
        int ss_rp;
        int ss_gr3;
        int ss_gr4;
        int ss_gr5;
        int ss_gr6;
        int ss_gr7;
        int ss_gr8;
        int ss_gr9;
        int ss_gr10;
        int ss_gr11;
        int ss_gr12;
        int ss_gr13;
        int ss_gr14;
        int ss_gr15;
        int ss_gr16;
        int ss_gr17;
        int ss_gr18;
        int ss_gr19;
        int ss_gr20;
        int ss_gr21;
        int ss_gr22;
        int ss_arg3;
        int ss_arg2;
        int ss_arg1;
        int ss_arg0;
        unsigned int ss_dp;
        unsigned int ss_ret0;
        unsigned int ss_ret1;
        unsigned int ss_sp;
        unsigned int ss_gr31;
        unsigned int ss_cr11;
        unsigned int ss_pcoq_head;
        unsigned int ss_pcsq_head;
        unsigned int ss_pcoq_tail;
        unsigned int ss_pcsq_tail;
        unsigned int ss_cr15;
        unsigned int ss_cr19;
        unsigned int ss_cr20;
        unsigned int ss_cr21;
        unsigned int ss_cr22;
        unsigned int ss_cpustate;
        unsigned int ss_sr4;
        unsigned int ss_sr0;
        unsigned int ss_sr1;
        unsigned int ss_sr2;
        unsigned int ss_sr3;
        unsigned int ss_sr5;
        unsigned int ss_sr6;
        unsigned int ss_sr7;
        unsigned int ss_cr0;
        unsigned int ss_cr8;
        unsigned int ss_cr9;
        unsigned int ss_cr10;
        unsigned int ss_cr12;
        unsigned int ss_cr13;
        unsigned int ss_cr24;
        unsigned int ss_cr25;
        unsigned int ss_cr26;
        unsigned int ss_cr27;
        unsigned int ss_mpsfu_low;
        unsigned int ss_mpsfu_ovflo;
} __ss_narrow_t;
typedef struct __save_state {
        int ss_flags;
        __ss_narrow_t ss_narrow;
        int ss_pad;
        union {
                fp_dbl_block_t fpdbl;
                fp_int_block_t fpint;
        } ss_fpblock;
        char ss_xor[4*32];
        union {
                __reg64_t ss_64;
                __reg32_t ss_32;
        } ss_wide;
} save_state_t;
   typedef struct __stack {
        void *ss_sp;
        int ss_flags;
        size_t ss_size;
   } stack_t;
typedef save_state_t mcontext_t;
struct __sub_ctxt {
        struct __ucontext *__uc_link;
        sigset_t __uc_sigmask;
        stack_t __uc_stack;
};
typedef struct __sub_ctxt __sub_ctxt_t;
typedef struct __ucontext {
        mcontext_t uc_mcontext;
        int uc_spares[8];
        unsigned int uc_created_by_getcontext:1;
        unsigned int uc_reserved_flags:31;
        struct __sub_ctxt uc_subcontext;
} ucontext_t;
  typedef unsigned int sig_atomic_t;
   struct sigaction {
      union {
              void (*__sa_sigaction)(int, siginfo_t *, void *);
              void (*__sa_handler)(int);
      } __handler;
      sigset_t sa_mask;
      int sa_flags;
   };
typedef int pthread_t;
   struct sigstack {
        void *ss_sp;
        int ss_onstack;
   };
   struct sigvec {
      void (*sv_handler)(int);
      int sv_mask;
      int sv_flags;
   };
     extern void (*signal(int, void (*) (int)))(int);
     extern int raise(int);
     extern int kill(pid_t, int);
     extern int sigemptyset(sigset_t *);
     extern int sigfillset(sigset_t *);
     extern int sigaddset(sigset_t *, int);
     extern int sigdelset(sigset_t *, int);
     extern int sigismember(const sigset_t *, int);
     extern int sigaction(int, const struct sigaction *, struct sigaction *);
     extern int sigprocmask(int, const sigset_t *, sigset_t *);
     extern int sigsuspend(const sigset_t *);
     extern int sigpending(sigset_t *);
     extern int sigwait(const sigset_t *set, int *sig);
     extern int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset);
     extern int pthread_kill(pthread_t thread, int sig);
     extern int sigwaitinfo(const sigset_t *set, siginfo_t *info);
     extern int sigtimedwait(const sigset_t *set, siginfo_t * info,
                             const struct timespec *timeout);
     extern int sigqueue(pid_t pid, int signo,
                         const union sigval value);
        extern void (*bsd_signal(int, void(*)(int)))(int);
        extern int killpg(pid_t, int);
        extern int sigstack(struct sigstack *, struct sigstack *);
        extern int sigaltstack(const stack_t *, stack_t *);
        extern int siginterrupt(int, int);
           extern void (*sigset(int, void (*)(int)))(int);
           extern int sighold(int);
           extern int sigrelse(int);
           extern int sigignore(int);
           extern int sigpause(int);
     extern long sigblock(long);
     extern long sigsetmask(long);
     extern int sigvector(int, const struct sigvec *, struct sigvec *);
     extern int (*ssignal(int, int (*) (int)))(int);
     extern ssize_t sigspace(ssize_t);
     extern int gsignal(int);
        extern long ___sysconf(int);
typedef struct frame_marker {
        int fm_edp;
        int fm_esr4;
        int fm_erp;
        int fm_crp;
        int fm_sl;
        int fm_clup;
        int fm_ep;
        int fm_psp;
} frame_marker_t;
       struct siglocal_misc {
                int sm_syscall;
                int sm_onstack;
                int sm_omask;
                char sm_syscall_action;
                char sm_eosys;
                unsigned short sm_error;
                long sm_rval1;
                long sm_rval2;
                long sm_arg[4];
       };
       typedef struct siglocal_misc siglocal_misc_t;
       struct siglocal {
                struct siglocal_misc sl_misc;
                save_state_t sl_ss;
       };
       struct siglocalx {
                struct siglocal_misc sl_misc;
                ucontext_t sl_uc;
                siginfo_t sl_si;
       };
        struct __xsi {
                struct __sub_ctxt sc;
                int __padding;
                siginfo_t si;
        };
        typedef struct __xsi __xsi_t;
       struct sigcontext {
                union {
                        struct siglocal sl;
                        struct siglocalx sx;
                } sc_ctxt;
                long sc_args[4];
                struct frame_marker sc_sfm;
       };
typedef enum {
        P_PID,
        P_PGID,
        P_SID,
        P_UID,
        P_GID,
        P_CID,
        P_ALL
} idtype_t;
        extern int waitid(idtype_t, id_t, siginfo_t *, int);
   union wait {
        int w_status;
        struct {
                unsigned short w_pad;
                unsigned int w_Retcode:8;
                unsigned int w_Coredump:1;
                unsigned int w_Termsig:7;
        } w_T;
        struct {
                unsigned short w_pad;
                unsigned int w_Stopsig:8;
                unsigned int w_Stopval:8;
        } w_S;
   };
                extern int mkstemp(char *);
                extern char *mktemp(char *);
                extern int ttyslot(void);
        extern long a64l(const char *);
        extern char *l64a(long);
       extern char *fcvt(double, int, int *, int *);
       extern char *ecvt(double, int, int *, int *);
        extern char *gcvt(double, int, char *);
        extern int getsubopt(char **, char * const *, char **);
        extern int grantpt(int);
        extern char *ptsname(int);
        extern char *realpath(const char *, char *);
        extern int unlockpt(int);
        extern void *valloc(size_t);
    extern char *initstate(unsigned int, char *, size_t);
    extern char *setstate(const char *);
    extern void srandom(unsigned int);
        extern long random(void);
  struct mallinfo {
        int32_t arena;
        int32_t ordblks;
        int32_t smblks;
        int32_t hblks;
        int32_t hblkhd;
        int32_t usmblks;
        int32_t fsmblks;
        int32_t uordblks;
        int32_t fordblks;
        int32_t keepcost;
  };
     typedef struct {
       uint32_t word1, word2, word3, word4;
     } long_double;
   struct passwd {
        char *pw_name;
        char *pw_passwd;
        uid_t pw_uid;
        gid_t pw_gid;
        char *pw_age;
        char *pw_comment;
        char *pw_gecos;
        char *pw_dir;
        char *pw_shell;
        int32_t pw_audid;
        int pw_audflg;
   };
     extern struct passwd *getpwuid(uid_t);
     extern struct passwd *getpwnam(const char *);
     extern void endpwent(void);
     extern struct passwd *getpwent(void);
     extern void setpwent(void);
   struct s_passwd {
       char *pw_name;
       char *pw_passwd;
       char *pw_age;
       int32_t pw_audid;
       int pw_audflg;
   };
         extern int putpwent(const struct passwd *, FILE *);
     extern struct passwd *fgetpwent(FILE *);
     extern struct s_passwd *getspwent(void);
     extern struct s_passwd *getspwuid(uid_t);
     extern struct s_passwd *getspwaid(int32_t);
     extern struct s_passwd *getspwnam(char *);
     extern struct s_passwd *fgetspwent(FILE *);
     extern void setspwent(void);
     extern void endspwent(void);
     extern char *_ldecvt(long_double, int, int *, int *);
     extern char *_ldfcvt(long_double, int, int *, int *);
     extern char *_ldgcvt(long_double, int, char *);
     extern int getpw(int, char *);
     extern void l3tol(long *, const char *, int);
     extern void ltol3(char *, const long *, int);
     extern char *ltostr(long, int);
     extern char *ultostr(unsigned long, int);
     extern char *ltoa(long);
     extern char *ultoa(unsigned long);
     extern void memorymap(int);
     extern struct mallinfo mallinfo(void);
     extern int mallopt(int, int);
     extern long_double strtold(const char *, char **);
   struct utimbuf {
        time_t actime;
        time_t modtime;
   };
           extern int utime(const char *, const struct utimbuf *);
     extern void _exit (int);
     extern int access (const char *, int);
     extern int chdir (const char *);
     extern int chown (const char *, uid_t, gid_t);
     extern int close (int);
     extern char *ctermid (char *);
     extern char *cuserid (char *);
     extern int dup (int);
     extern int dup2 (int, int);
     extern int execl (const char *, const char *, ...);
     extern int execle (const char *, const char *, ...);
     extern int execlp (const char *, const char *, ...);
     extern int execv (const char *, char *const []);
     extern int execve (const char *, char *const [], char *const []);
     extern int execvp (const char *, char *const []);
     extern long fpathconf (int, int);
     extern char *getcwd (char *, size_t);
     extern int getgroups (int, gid_t []);
     extern char *getlogin (void);
     extern int isatty (int);
     extern int link (const char *, const char *);
     extern off_t lseek (int, off_t, int);
     extern long pathconf (const char *, int);
     extern int pause (void);
     extern int pipe (int *);
     extern ssize_t read (int, void *, size_t);
     extern int rmdir (const char *);
     extern int setgid (gid_t);
     extern int setpgid (pid_t, pid_t);
     extern pid_t setsid (void);
     extern int setuid (uid_t);
     extern unsigned int sleep (unsigned int);
     extern long sysconf (int);
     extern pid_t tcgetpgrp (int);
     extern int tcsetpgrp (int, pid_t);
     extern char *ttyname (int);
     extern int unlink (const char *);
     extern ssize_t write (int, const void *, size_t);
     extern unsigned int alarm (unsigned int);
     extern pid_t fork (void);
     extern gid_t getegid (void);
     extern uid_t geteuid (void);
     extern gid_t getgid (void);
     extern pid_t getpgrp (void);
     extern pid_t getpid (void);
     extern pid_t getppid (void);
     extern uid_t getuid (void);
     extern char *optarg;
     extern int opterr;
     extern int optind;
     extern int optopt;
     extern int getopt (int, char * const [], const char *);
     extern size_t confstr (int, char *, size_t);
     extern int pthread_atfork(void (*prepare)(), void (*parent)(),
                                                           void (*child)());
        extern int chroot (const char *);
        extern char *crypt (const char *, const char *);
        extern void encrypt (char [64], int);
        extern int fsync (int);
        extern char *getpass (const char *);
        extern int nice (int);
        extern int rename (const char *, const char *);
        extern void swab (const void *, void *, ssize_t);
     extern char **environ;
       extern int readlink (const char *, char *, size_t);
     extern int fchown (int, uid_t, gid_t);
     extern int ftruncate (int, off_t);
     extern int truncate (const char *, off_t);
       extern int setgroups (int, gid_t []);
     extern int symlink (const char *, const char *);
        extern pid_t setpgrp (void);
        extern pid_t vfork (void);
        extern int brk (void *);
        extern int fchdir (int);
        extern int getdtablesize (void);
        extern long gethostid (void);
        extern int gethostname (char *, size_t);
        extern int getpagesize (void);
        extern pid_t getpgid (pid_t);
        extern pid_t getsid (pid_t);
        extern char *getwd (char *);
        extern int lockf (int, int, off_t);
        extern int lchown (const char *, uid_t, gid_t);
        extern void *sbrk (int);
        extern int setregid (gid_t, gid_t);
        extern int setreuid (uid_t, uid_t);
        extern void sync (void);
        extern useconds_t ualarm (useconds_t, useconds_t);
        extern int usleep (useconds_t);
     extern void endusershell (void);
     extern int fsctl (int, int, void *, size_t);
     extern char *getcdf (const char *, char *, size_t);
     extern char *gethcwd (char *, size_t);
     extern int getpgrp2 (pid_t);
     extern char *getusershell (void);
     extern char *hidecdf (const char *, char *, size_t);
     extern int initgroups (const char *, gid_t);
     extern char *logname (void);
     extern void lsync (void);
     extern int prealloc (int, off_t);
     extern int sethostname (const char *, size_t);
     extern int setpgrp2 (pid_t, pid_t);
     extern int setresgid (gid_t, gid_t, gid_t);
     extern int setresuid (uid_t, uid_t, uid_t);
     extern void setusershell (void);
     extern long sgetl (const char *);
     extern void sputl (long, char *);
     extern int swapon (const char *, ...);
     extern int swapoff (const char *, int);
     extern char *ttyname (int);
     extern int64_t __sysconfx (int, int);
     extern int set_userthreadid (int);
           extern pid_t setpgrp3 (void);
extern int serialize (int, pid_t);
extern char *ustk_addr_q2_32bit;
extern char *ustk_addr_32bit;
           extern int get_expiration_time (struct timespec *,struct timespec 
*);
   struct flock {
      short l_type;
      short l_whence;
      off_t l_start;
      off_t l_len;
      pid_t l_pid;
   };
       extern int fcntl (int, int, ...);
       extern int creat (const char *, mode_t);
       extern int open (const char *, int, ...);
   void free(void *);
   int mallopt(int, int);
   struct mallinfo mallinfo(void);
   void memorymap(int);
     void *calloc(size_t, size_t);
     void *malloc(size_t);
     void *realloc(void *, size_t);
extern const char *strsignal (int);
   struct stat
   {
        dev_t st_dev;
        ino_t st_ino;
        mode_t st_mode;
        nlink_t st_nlink;
        unsigned short st_reserved1;
        unsigned short st_reserved2;
        dev_t st_rdev;
        off_t st_size;
        time_t st_atime;
        int st_spare1;
        time_t st_mtime;
        int st_spare2;
        time_t st_ctime;
        int st_spare3;
        long st_blksize;
        blkcnt_t st_blocks;
        unsigned int st_pad:29;
        unsigned int st_sysVacl:1;
        unsigned int st_acl:1;
        unsigned int st_remote:1;
        dev_t st_netdev;
        ino_t st_netino;
        __cnode_t st_cnode;
        __cnode_t st_rcnode;
        __site_t st_netsite;
        short st_fstype;
        dev_t st_realdev;
        unsigned short st_basemode;
        unsigned short st_spareshort;
        uid_t st_uid;
        gid_t st_gid;
        int32_t st_spare4[3];
   };
     extern int chmod (const char *, mode_t);
     extern int mkdir (const char *, mode_t);
     extern int mkfifo (const char *, mode_t);
     extern int fstat (int, struct stat *);
     extern int stat (const char *, struct stat *);
       extern mode_t umask (mode_t);
      extern int fchmod (int, mode_t);
      extern int lstat (const char *, struct stat *);
      extern int mknod (const char *, mode_t, dev_t);
extern char **buildargv (char *) __attribute__ ((__malloc__));
extern void freeargv (char **);
extern char **dupargv (char **) __attribute__ ((__malloc__));
extern char *concat (const char *, ...) __attribute__ ((__malloc__));
extern int fdmatch (int fd1, int fd2);
extern char * getpwd (void);
extern long get_run_time (void);
extern char *choose_temp_base (void) __attribute__ ((__malloc__));
extern char *make_temp_file (const char *) __attribute__ ((__malloc__));
extern const char *spaces (int count);
extern int errno_max (void);
extern const char *strerrno (int);
extern int strtoerrno (const char *);
extern char *xstrerror (int);
extern int signo_max (void);
extern const char *strsigno (int);
extern int strtosigno (const char *);
extern int xatexit (void (*fn) (void));
extern void xexit (int status) __attribute__ ((__noreturn__));
extern void xmalloc_set_program_name (const char *);
typedef long int ptrdiff_t;
extern void * xmalloc (size_t) __attribute__ ((__malloc__));
extern void * xrealloc (void *, size_t);
extern void * xcalloc (size_t, size_t) __attribute__ ((__malloc__));
extern char *xstrdup (const char *) __attribute__ ((__malloc__));
extern void * xmemdup (const void *, size_t, size_t) __attribute__ 
((__malloc__));
extern char _hex_value[256];
extern void hex_init (void);
extern int pexecute (const char *, char * const *, const char *,
                            const char *, char **, char **, int);
extern int pwait (int, int *, int);
extern int asprintf (char **, const char *, ...) __attribute__ ((__format__ 
(__printf__, 2, 3)));
extern int vasprintf (char **, const char *, va_list)
  __attribute__ ((__format__ (__printf__, 2, 0)));
extern void *alloca (long unsigned int);
struct _obstack_chunk
{
  char *limit;
  struct _obstack_chunk *prev;
  char contents[4];
};
struct obstack
{
  long chunk_size;
  struct _obstack_chunk *chunk;
  char *object_base;
  char *next_free;
  char *chunk_limit;
  long int temp;
  int alignment_mask;
  struct _obstack_chunk *(*chunkfun) (void *, long);
  void (*freefun) (void *, struct _obstack_chunk *);
  void *extra_arg;
  unsigned use_extra_arg:1;
  unsigned maybe_empty_object:1;
  unsigned alloc_failed:1;
};
extern void _obstack_newchunk (struct obstack *, int);
extern void _obstack_free (struct obstack *, void *);
extern int _obstack_begin (struct obstack *, int, int,
                            void *(*) (long), void (*) (void *));
extern int _obstack_begin_1 (struct obstack *, int, int,
                             void *(*) (void *, long),
                             void (*) (void *, void *), void *);
extern int _obstack_memory_used (struct obstack *);
void obstack_init (struct obstack *obstack);
void * obstack_alloc (struct obstack *obstack, int size);
void * obstack_copy (struct obstack *obstack, void *address, int size);
void * obstack_copy0 (struct obstack *obstack, void *address, int size);
void obstack_free (struct obstack *obstack, void *block);
void obstack_blank (struct obstack *obstack, int size);
void obstack_grow (struct obstack *obstack, void *data, int size);
void obstack_grow0 (struct obstack *obstack, void *data, int size);
void obstack_1grow (struct obstack *obstack, int data_char);
void obstack_ptr_grow (struct obstack *obstack, void *data);
void obstack_int_grow (struct obstack *obstack, int data);
void * obstack_finish (struct obstack *obstack);
int obstack_object_size (struct obstack *obstack);
int obstack_room (struct obstack *obstack);
void obstack_make_room (struct obstack *obstack, int size);
void obstack_1grow_fast (struct obstack *obstack, int data_char);
void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
void obstack_int_grow_fast (struct obstack *obstack, int data);
void obstack_blank_fast (struct obstack *obstack, int size);
void * obstack_base (struct obstack *obstack);
void * obstack_next_free (struct obstack *obstack);
int obstack_alignment_mask (struct obstack *obstack);
int obstack_chunk_size (struct obstack *obstack);
int obstack_memory_used (struct obstack *obstack);
extern void (*obstack_alloc_failed_handler) (void);
extern int obstack_exit_failure;
  struct lconv {
        char *decimal_point;
        char *thousands_sep;
        char *grouping;
        char *int_curr_symbol;
        char *currency_symbol;
        char *mon_decimal_point;
        char *mon_thousands_sep;
        char *mon_grouping;
        char *positive_sign;
        char *negative_sign;
        char int_frac_digits;
        char frac_digits;
        char p_cs_precedes;
        char p_sep_by_space;
        char n_cs_precedes;
        char n_sep_by_space;
        char p_sign_posn;
        char n_sign_posn;
        };
     extern char *setlocale(int, const char *);
     extern struct lconv *localeconv(void);
   extern char *_errlocale();
   extern char __locale_names[6+1][255+1];
  struct locale_data {
    char LC_ALL_D[59];
    char LC_COLLATE_D[59];
    char LC_CTYPE_D[59];
    char LC_MONETARY_D[59];
    char LC_NUMERIC_D[59];
    char LC_TIME_D[59];
    char LC_MESSAGES_D[59];
    };
     extern struct locale_data *getlocale(int);
extern char *__err_string;
extern const char *update_path (const char *, const char *);
extern void set_std_prefix (const char *, int);
extern const char *const version_string;
extern int do_spec (const char *);
extern void fancy_abort (void) __attribute__ ((__noreturn__));
extern const char *input_filename;
extern size_t input_filename_length;
extern void fatal (const char *, ...)
     __attribute__ ((__format__ (__printf__, 1, 2))) __attribute__ 
((__noreturn__));
extern void lang_specific_driver (int *, const char *const **, int *);
extern int lang_specific_pre_link (void);
extern int lang_specific_extra_outfiles;
static char dir_separator_str[] = {'/', 0};
static int pass_exit_codes;
static int print_search_dirs;
static const char *print_file_name = ((void *)0);
static const char *print_prog_name = ((void *)0);
static int print_multi_directory;
static int print_multi_lib;
static int print_help_list;
static int verbose_flag;
static int report_times;
static int save_temps_flag;
static const char *compiler_version;
static const char *spec_version = "2.96";
static const char *spec_machine = "hppa2.0w-hp-hpux11.00";
static const char *cross_compile = "0";
static int error_count = 0;
static int greatest_status = 1;
static struct obstack obstack;
static struct obstack collect_obstack;
static struct rusage rus, prus;
struct path_prefix;
static void init_spec (void);
static char **split_directories (const char *, int *);
static void free_split_directories (char **);
static char *make_relative_prefix (const char *, const char *, const char *);
static void store_arg (const char *, int, int);
static char *load_specs (const char *);
static void read_specs (const char *, int);
static void set_spec (const char *, const char *);
static struct compiler *lookup_compiler (const char *, size_t, const char *);
static char *build_search_list (struct path_prefix *, const char *, int);
static void putenv_from_prefixes (struct path_prefix *, const char *);
static int access_check (const char *, int);
static char *find_a_file (struct path_prefix *, const char *, int);
static void add_prefix (struct path_prefix *, const char *,
                                         const char *, int, int, int *);
static void translate_options (int *, const char *const **);
static char *skip_whitespace (char *);
static void record_temp_file (const char *, int, int);
static void delete_if_ordinary (const char *);
static void delete_temp_files (void);
static void delete_failure_queue (void);
static void clear_failure_queue (void);
static int check_live_switch (int, int);
static const char *handle_braces (const char *);
static char *save_string (const char *, int);
static int do_spec_1 (const char *, int, const char *);
static const char *find_file (const char *);
static int is_directory (const char *, const char *, int);
static void validate_switches (const char *);
static void validate_all_switches (void);
static void give_switch (int, int, int);
static int used_arg (const char *, int);
static int default_arg (const char *, int);
static void set_multilib_dir (void);
static void print_multilib_info (void);
static void pfatal_with_name (const char *) __attribute__ ((__noreturn__));
static void perror_with_name (const char *);
static void pfatal_pexecute (const char *, const char *)
  __attribute__ ((__noreturn__));
static void error (const char *, ...)
  __attribute__ ((__format__ (__printf__, 1, 2)));
static void notice (const char *, ...)
  __attribute__ ((__format__ (__printf__, 1, 2)));
static void display_help (void);
static void add_preprocessor_option (const char *, int);
static void add_assembler_option (const char *, int);
static void add_linker_option (const char *, int);
static void process_command (int, const char *const *);
static int execute (void);
static void unused_prefix_warnings (struct path_prefix *);
static void clear_args (void);
static void fatal_error (int);
static void set_input (const char *);
static const char *cpp_spec = "%{mpa-risc-1-0:%(cpp_pa10)} 
%{mpa-risc-1-1:%(cpp_pa11)} %{msnake:%(cpp_pa11)} %{mpa-risc-2-0:%(cpp_pa20)} 
%{!mpa-risc-1-0:%{!mpa-risc-1-1:%{!mpa-risc-2-0:%{!msnake:%(cpp_cpu_default)}}}
} %{m64bit:%(cpp_64bit)} %{!m64bit:%(cpp_64bit_default)} %{!ansi: 
-D_HPUX_SOURCE -D_HIUX_SOURCE -D__STDC_EXT__} %{threads: -D_REENTRANT 
-D_DCE_THREADS}";
static const char *cpp_predefines = "-Dhppa -Dhp9000s800 -D__hp9000s800 
-Dhp9k8 -DPWB -Dhpux -Dunix -Asystem(unix) -Asystem(hpux) -Acpu(hppa) 
-Amachine(hppa)";
static const char *cc1_spec = "%{pg:} %{p:}";
static const char *cc1plus_spec = "";
static const char *signed_char_spec = "%{funsigned-char:-D__CHAR_UNSIGNED__}";
static const char *asm_spec = "";
static const char *asm_final_spec = "";
static const char *link_spec = "%{!mpa-risc-1-0:%{!shared:-L/lib/pa1.1 
-L/usr/lib/pa1.1 }} -z %{mlinker-opt:-O} %{!shared:-u main} %{static:-a 
archive} %{shared:-b}";
static const char *lib_spec = "%{!shared:     %{!p:%{!pg:       
%{!threads:-lc}       %{threads:-lcma -lc_r}}}     %{p: -L/lib/libp/ -lc}     
%{pg: -L/lib/libp/ -lc}}";
static const char *libgcc_spec = "-lgcc";
static const char *endfile_spec = "";
static const char *startfile_spec = "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O
%s}%{!p:crt0%O%s}}}";
static const char *switches_need_spaces = "";
static const char *linker_name_spec = "collect2";
static const char *link_command_spec = "%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{
!S:    %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t}    
%{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}    %{static:} 
%{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%G %L %G}}    
%{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}";
static const char *link_libgcc_spec = "%D";
static const char *trad_capable_cpp =
"%{traditional|ftraditional|traditional-cpp:trad}cpp0";
static const char *cpp_options =
"%{C:%{!E:%eGNU C does not support -C without using -E}} %{std*} %{nostdinc*} 
%{C} %{v} %{A*} %{I*} %{P} %{$} %I %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} 
%{MG} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} 
%{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %c 
%{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}} 
%{ffast-math:-D__FAST_MATH__} %{fshort-wchar:-D__WCHAR_TYPE__=short\\ 
unsigned\\ int} %{fshow-column} %{fno-show-column} %{fleading-underscore} 
%{fno-leading-underscore} %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} 
%{U*} %{i*} %Z %i %{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}}";
static const char *cc1_options =
"%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} 
%1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{g*} %{O*} %{W*} %{w} 
%{pedantic*} %{std*} %{ansi} %{traditional} %{v:-version} %{pg:-p} %{p} %{f*} 
%{aux-info*} %{Qn:-fno-ident} %{--help:--help} %{S:%W{o*}%{!o*:-o %b.s}}";
static const char *asm_options =
"%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
static struct obstack multilib_obstack;
static const char *multilib_select;
static const char *multilib_matches;
static const char *multilib_defaults;
static const char *multilib_exclusions;
static const char *const multilib_raw[] = {
". ;",
((void *)0)
};
static const char *const multilib_matches_raw[] = {
((void *)0)
};
static const char *multilib_extra = "";
static const char *const multilib_exclusions_raw[] = {
((void *)0)
};
static const char *const multilib_defaults_raw[] = { "" };
struct user_specs
{
  struct user_specs *next;
  const char *filename;
};
static struct user_specs *user_specs_head, *user_specs_tail;
struct compiler
{
  const char *suffix;
  const char *spec;
};
static struct compiler *compilers;
static int n_compilers;
static struct compiler default_compilers[] =
{
  {".m", "#Objective-C"},
  {".cc", "#C++"}, {".cxx", "#C++"}, {".cpp", "#C++"},
  {".c++", "#C++"}, {".C", "#C++"},
  {".ads", "#Ada"}, {".adb", "#Ada"}, {".ada", "#Ada"},
  {".f", "#Fortran"}, {".for", "#Fortran"}, {".F", "#Fortran"},
  {".fpp", "#Fortran"}, {".r", "#Ratfor"},
  {".p", "#Pascal"}, {".pas", "#Pascal"},
  {".ch", "#Chill"}, {".chi", "#Chill"},
  {".java", "#Java"}, {".class", "#Java"},
  {".zip", "#Java"}, {".jar", "#Java"},
  {".c", "@c"},
  {"@c",
     "%(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options) 			  
%{!M:%{!MM:%{!E:%{!pipe:%g.i} |\n      cc1 %{!pipe:%g.i} %(cc1_options)  
%{!S:-o %{|!pipe:%g.s} |\n      as %(asm_options) %{!pipe:%g.s} %A }}}}\n"
  },
  {"-",
   "%{!E:%e-E required when input is from standard input}    
%(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)"},
  {".h", "@c-header"},
  {"@c-header",
   "%{!E:%eCompilation of header file requested}     %(trad_capable_cpp) 
-lang-c %{ansi:-std=c89} %(cpp_options)"},
  {".i", "@cpp-output"},
  {"@cpp-output",
   "%{!M:%{!MM:%{!E:    cc1 %i %(cc1_options) %{!S:-o %{|!pipe:%g.s} |\n    as 
%(asm_options) %{!pipe:%g.s} %A }}}}"},
  {".s", "@assembler"},
  {"@assembler",
   "%{!M:%{!MM:%{!E:%{!S:as %(asm_options) %i %A }}}}"},
  {".S", "@assembler-with-cpp"},
  {"@assembler-with-cpp",
   "%(trad_capable_cpp) -lang-asm %(cpp_options) 			%{!M:%{!MM:%{!E:%{!S: 
%{!pipe:%g.s} |\n    as %(asm_options) %{!pipe:%g.s} %A }}}}"},
  {".ch", "@chill"},
  {".chi", "@chill"},
  {"@chill",
     "tradcpp0 -lang-chill %{!no-gcc:-D__GNUCHILL__=%v1} %(cpp_options)	      
%{!M:%{!MM:%{!E:%{!pipe:%g.i} |\n      cc1chill %{!pipe:%g.i} %(cc1_options) 
%{!S:-o %{|!pipe:%g.s} |\n      as %(asm_options) %{!pipe:%g.s} %A }}}}\n"},
  {".cc", "@c++"},
  {".cp", "@c++"},
  {".cxx", "@c++"},
  {".cpp", "@c++"},
  {".c++", "@c++"},
  {".C", "@c++"},
  {"@c++",
    "cpp0 -lang-c++ %{!no-gcc:-D__GNUG__=%v1}       
%{fnew-abi:-D__GXX_ABI_VERSION=100}       %{ansi:-trigraphs -$ 
-D__STRICT_ANSI__} %(cpp_options)       %{!M:%{!MM:%{!E:%{!pipe:%g.ii} |\n     
cc1plus %{!pipe:%g.ii} %(cc1_options) %{+e*} %{!S:-o %{|!pipe:%g.s} |\n     as 
%(asm_options) %{!pipe:%g.s} %A }}}}\n"
  },
  {".ii", "@c++-cpp-output"},
  {"@c++-cpp-output",
   "%{!M:%{!MM:%{!E:    cc1plus -fpreprocessed %i %(cc1_options) %{+e*}    
%{!S:-o %{|!pipe:%g.s} |\n as %(asm_options) %{!pipe:%g.s} %A }}}}"},
  {".F", "@f77-cpp-input"},
  {".fpp", "@f77-cpp-input"},
  {".FPP", "@f77-cpp-input"},
  {"@f77-cpp-input",
   "tradcpp0 -lang-fortran %(cpp_options) %{!M:%{!MM:%{!E:%{!pipe:%g.f |\n    
f771 %{!pipe:%g.f} %(cc1_options) %{!S:-o %{|!pipe:%g.s} |\n    as 
%(asm_options) %{!pipe:%g.s} %A }}}}}\n"},
  {".r", "@ratfor"},
  {"@ratfor",
   "%{C:%{!E:%eGNU C does not support -C without using -E}}    ratfor %{C} 
%{v} %i %{E:%W{o*}} %{!E: %{!pipe:-o %g.f} |\n    f771 %{!pipe:%g.f} 
%(cc1_options) %{!S:-o %{|!pipe:%g.s} |\n    as %(asm_options) %{!pipe:%g.s} 
%A }}\n"},
  {".f", "@f77"},
  {".for", "@f77"},
  {".FOR", "@f77"},
  {"@f77",
   "%{!M:%{!MM:%{!E:f771 %i %(cc1_options) %{!S:-o %{|!pipe:%g.s} |\n     as 
%(asm_options) %{!pipe:%g.s} %A }}}}\n"},
  {"@f77-version",
   "tradcpp0 -lang-fortran %(cpp_options) /dev/null \n    f771 -fnull-version 
%1       %{!Q:-quiet} -dumpbase g77-version.f %{d*} %{m*} %{a*}       %{g*} 
%{O*} %{W*} %{w} %{pedantic*}       -version -fversion %{f*} %{I*} -o %g.s 
/dev/null \n     as %a %Y -o %g%O %g.s %A \n     ld %l %X -o %g %g%O %{A} %{d} 
%{e*} %{m} %{N} %{n}       %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}       
%{!A:%{!nostdlib:%{!nostartfiles:%S}}}       %{static:} %{L*} %D -lg2c -lm     
  %{!nostdlib:%{!nodefaultlibs:%G %L %G}}       %{!A:%{!nostdlib:%{!nostartfile
s:%E}}}       %{T*} \n     %g \n"},
  {".java", "@java" },
  {".class", "@java" },
  {".zip", "@java" },
  {".jar", "@java" },
  {"@java",
   "%{fjni:%{femit-class-file:%e-fjni and -femit-class-file are incompatible}} 
   %{!E:jc1 %i %(jc1) %(cc1_options) %{+e*} %{I*} %{MD} %{MMD} %{M} %{MM}      
       %{!S:-o %{|!pipe:%g.s} |\n    as %(asm_options) %{!pipe:%g.s} %A }}"},
  {".m", "@objective-c"},
  {"@objective-c",
     "%(trad_capable_cpp) -lang-objc %{ansi:-std=c89} %(cpp_options)			  
%{!M:%{!MM:%{!E:%{!pipe:%g.mi} |\n      cc1obj -lang-objc %{!pipe:%g.mi} 
%(cc1_options) %{gen-decls}	     %{!S:-o %{|!pipe:%g.s} |\n      as 
%(asm_options) %{!pipe:%g.s} %A }}}}\n"
    },
  {".mi", "@objc-cpp-output"},
  {"@objc-cpp-output",
     "%{!M:%{!MM:%{!E:cc1obj -lang-objc %i %(cc1_options) %{gen-decls}			     
%{!S:-o %{|!pipe:%g.s} |\n      as %(asm_options) %{!pipe:%g.s} %A }}}}"},
  {0, 0}
};
static int n_default_compilers
  = (sizeof default_compilers / sizeof (struct compiler)) - 1;
static int n_linker_options;
static char **linker_options;
static int n_assembler_options;
static char **assembler_options;
static int n_preprocessor_options;
static char **preprocessor_options;
struct option_map
{
  const char *name;
  const char *equivalent;
  const char *arg_info;
};
struct option_map option_map[] =
 {
   {"--all-warnings", "-Wall", 0},
   {"--ansi", "-ansi", 0},
   {"--assemble", "-S", 0},
   {"--assert", "-A", "a"},
   {"--classpath", "-fclasspath=", "aj"},
   {"--CLASSPATH", "-fCLASSPATH=", "aj"},
   {"--comments", "-C", 0},
   {"--compile", "-c", 0},
   {"--debug", "-g", "oj"},
   {"--define-macro", "-D", "aj"},
   {"--dependencies", "-M", 0},
   {"--dump", "-d", "a"},
   {"--dumpbase", "-dumpbase", "a"},
   {"--entry", "-e", 0},
   {"--extra-warnings", "-W", 0},
   {"--for-assembler", "-Wa", "a"},
   {"--for-linker", "-Xlinker", "a"},
   {"--force-link", "-u", "a"},
   {"--imacros", "-imacros", "a"},
   {"--include", "-include", "a"},
   {"--include-barrier", "-I-", 0},
   {"--include-directory", "-I", "aj"},
   {"--include-directory-after", "-idirafter", "a"},
   {"--include-prefix", "-iprefix", "a"},
   {"--include-with-prefix", "-iwithprefix", "a"},
   {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
   {"--include-with-prefix-after", "-iwithprefix", "a"},
   {"--language", "-x", "a"},
   {"--library-directory", "-L", "a"},
   {"--machine", "-m", "aj"},
   {"--machine-", "-m", "*j"},
   {"--no-line-commands", "-P", 0},
   {"--no-precompiled-includes", "-noprecomp", 0},
   {"--no-standard-includes", "-nostdinc", 0},
   {"--no-standard-libraries", "-nostdlib", 0},
   {"--no-warnings", "-w", 0},
   {"--optimize", "-O", "oj"},
   {"--output", "-o", "a"},
   {"--output-class-directory", "-foutput-class-dir=", "ja"},
   {"--pedantic", "-pedantic", 0},
   {"--pedantic-errors", "-pedantic-errors", 0},
   {"--pipe", "-pipe", 0},
   {"--prefix", "-B", "a"},
   {"--preprocess", "-E", 0},
   {"--print-search-dirs", "-print-search-dirs", 0},
   {"--print-file-name", "-print-file-name=", "aj"},
   {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
   {"--print-missing-file-dependencies", "-MG", 0},
   {"--print-multi-lib", "-print-multi-lib", 0},
   {"--print-multi-directory", "-print-multi-directory", 0},
   {"--print-prog-name", "-print-prog-name=", "aj"},
   {"--profile", "-p", 0},
   {"--profile-blocks", "-a", 0},
   {"--quiet", "-q", 0},
   {"--save-temps", "-save-temps", 0},
   {"--shared", "-shared", 0},
   {"--silent", "-q", 0},
   {"--specs", "-specs=", "aj"},
   {"--static", "-static", 0},
   {"--std", "-std=", "aj"},
   {"--symbolic", "-symbolic", 0},
   {"--target", "-b", "a"},
   {"--time", "-time", 0},
   {"--trace-includes", "-H", 0},
   {"--traditional", "-traditional", 0},
   {"--traditional-cpp", "-traditional-cpp", 0},
   {"--trigraphs", "-trigraphs", 0},
   {"--undefine-macro", "-U", "aj"},
   {"--use-version", "-V", "a"},
   {"--user-dependencies", "-MM", 0},
   {"--verbose", "-v", 0},
   {"--version", "-dumpversion", 0},
   {"--warn-", "-W", "*j"},
   {"--write-dependencies", "-MD", 0},
   {"--write-user-dependencies", "-MMD", 0},
   {"--", "-f", "*j"}
 };
struct spec_list
{
  const char *name;
  const char *ptr;
  const char **ptr_spec;
  struct spec_list *next;
  int name_len;
  int alloc_p;
};
static struct spec_list static_specs[] =
{
  { "asm", ((void *) 0), &asm_spec, (struct spec_list *)0, sizeof ("asm")-1, 0 
},
  { "asm_final", ((void *) 0), &asm_final_spec, (struct spec_list *)0, sizeof 
("asm_final")-1, 0 },
  { "asm_options", ((void *) 0), &asm_options, (struct spec_list *)0, sizeof 
("asm_options")-1, 0 },
  { "cpp", ((void *) 0), &cpp_spec, (struct spec_list *)0, sizeof ("cpp")-1, 0 
},
  { "cpp_options", ((void *) 0), &cpp_options, (struct spec_list *)0, sizeof 
("cpp_options")-1, 0 },
  { "trad_capable_cpp", ((void *) 0), &trad_capable_cpp, (struct spec_list 
*)0, sizeof ("trad_capable_cpp")-1, 0 },
  { "cc1", ((void *) 0), &cc1_spec, (struct spec_list *)0, sizeof ("cc1")-1, 0 
},
  { "cc1_options", ((void *) 0), &cc1_options, (struct spec_list *)0, sizeof 
("cc1_options")-1, 0 },
  { "cc1plus", ((void *) 0), &cc1plus_spec, (struct spec_list *)0, sizeof 
("cc1plus")-1, 0 },
  { "endfile", ((void *) 0), &endfile_spec, (struct spec_list *)0, sizeof 
("endfile")-1, 0 },
  { "link", ((void *) 0), &link_spec, (struct spec_list *)0, sizeof 
("link")-1, 0 },
  { "lib", ((void *) 0), &lib_spec, (struct spec_list *)0, sizeof ("lib")-1, 0 
},
  { "libgcc", ((void *) 0), &libgcc_spec, (struct spec_list *)0, sizeof 
("libgcc")-1, 0 },
  { "startfile", ((void *) 0), &startfile_spec, (struct spec_list *)0, sizeof 
("startfile")-1, 0 },
  { "switches_need_spaces", ((void *) 0), &switches_need_spaces, (struct 
spec_list *)0, sizeof ("switches_need_spaces")-1, 0 },
  { "signed_char", ((void *) 0), &signed_char_spec, (struct spec_list *)0, 
sizeof ("signed_char")-1, 0 },
  { "predefines", ((void *) 0), &cpp_predefines, (struct spec_list *)0, sizeof 
("predefines")-1, 0 },
  { "cross_compile", ((void *) 0), &cross_compile, (struct spec_list *)0, 
sizeof ("cross_compile")-1, 0 },
  { "version", ((void *) 0), &compiler_version, (struct spec_list *)0, sizeof 
("version")-1, 0 },
  { "multilib", ((void *) 0), &multilib_select, (struct spec_list *)0, sizeof 
("multilib")-1, 0 },
  { "multilib_defaults", ((void *) 0), &multilib_defaults, (struct spec_list 
*)0, sizeof ("multilib_defaults")-1, 0 },
  { "multilib_extra", ((void *) 0), &multilib_extra, (struct spec_list *)0, 
sizeof ("multilib_extra")-1, 0 },
  { "multilib_matches", ((void *) 0), &multilib_matches, (struct spec_list 
*)0, sizeof ("multilib_matches")-1, 0 },
  { "multilib_exclusions", ((void *) 0), &multilib_exclusions, (struct 
spec_list *)0, sizeof ("multilib_exclusions")-1, 0 },
  { "linker", ((void *) 0), &linker_name_spec, (struct spec_list *)0, sizeof 
("linker")-1, 0 },
  { "link_libgcc", ((void *) 0), &link_libgcc_spec, (struct spec_list *)0, 
sizeof ("link_libgcc")-1, 0 },
};
struct spec_list_1
{
  const char *name;
  const char *ptr;
};
static struct spec_list_1 extra_specs_1[] = { { "cpp_pa10", ""}, { "cpp_pa11", 
"-D_PA_RISC1_1 -D__hp9000s700"}, { "cpp_pa20", "-D_PA_RISC2_0 
-D__hp9000s800"}, { "cpp_64bit", "-D__LP64__ -D__LONG_MAX__=9223372036854775807
L"}, { "cpp_cpu_default", "%(cpp_pa11)" }, { "cpp_64bit_default", "" }, };
static struct spec_list * extra_specs = (struct spec_list *)0;
static struct spec_list *specs = (struct spec_list *)0;
static const char **argbuf;
static int argbuf_length;
static int argbuf_index;
static struct temp_name {
  const char *suffix;
  int length;
  int unique;
  const char *filename;
  int filename_length;
  struct temp_name *next;
} *temp_names;
static int execution_count;
static int signal_count;
static const char *programname;
struct prefix_list
{
  char *prefix;
  struct prefix_list *next;
  int require_machine_suffix;
  int *used_flag_ptr;
  int priority;
};
struct path_prefix
{
  struct prefix_list *plist;
  int max_len;
  const char *name;
};
static struct path_prefix exec_prefixes = { 0, 0, "exec" };
static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
static struct path_prefix include_prefixes = { 0, 0, "include" };
static const char *machine_suffix = 0;
static const char *just_machine_suffix = 0;
static const char *gcc_exec_prefix;
static const char *standard_exec_prefix = "/usr/egcs/lib/gcc-lib/";
static const char *standard_exec_prefix_1 = "/usr/lib/gcc/";
static const char *md_exec_prefix = "/usr/ccs/bin/";
static const char *md_startfile_prefix = "/usr/ccs/lib/";
static const char *md_startfile_prefix_1 = "/opt/langtools/lib/";
static const char *standard_startfile_prefix = "../../../";
static const char *standard_startfile_prefix_1 = "/lib/";
static const char *standard_startfile_prefix_2 = "/usr/lib/";
static const char *tooldir_base_prefix = "../../../../";
static const char *tooldir_prefix;
static const char *standard_bindir_prefix = "/usr/egcs/bin/";
static const char *multilib_dir;
static const char *temp_filename;
static int temp_filename_length;
struct temp_file
{
  const char *name;
  struct temp_file *next;
};
static struct temp_file *always_delete_queue;
static struct temp_file *failure_delete_queue;
struct switchstr
{
  const char *part1;
  const char **args;
  int live_cond;
  int validated;
};
static struct switchstr *switches;
static int n_switches;
struct infile
{
  const char *name;
  const char *language;
};
static struct infile *infiles;
static int n_infiles;
static int added_libraries;
static const char **outfiles;
static int warn_B;
static int warn_std;
static int *warn_std_ptr = 0;
static void
process_command (argc, argv)
     int argc;
     const char *const *argv;
{
  register int i;
  const char *temp;
  char *temp1;
  const char *spec_lang = 0;
  int last_language_n_infiles;
  int have_c = 0;
  int have_o = 0;
  int lang_n_infiles = 0;


  for (i = 1; i < argc; i++)
    {
      if (! strcmp (argv[i], "-dumpspecs"))
        {
          struct spec_list *sl;
          init_spec ();
          for (sl = specs; sl; sl = sl->next)
            printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
          if (link_command_spec)
            printf ("*link_command:\n%s\n\n", link_command_spec);
          exit (0);
        }
      else if (! strcmp (argv[i], "-dumpversion"))
        {
          printf ("%s\n", spec_version);
          exit (0);
        }
      else if (! strcmp (argv[i], "-dumpmachine"))
        {
          printf ("%s\n", spec_machine);
          exit (0);
        }
      else if (strcmp (argv[i], "-fhelp") == 0)
        {
          print_help_list = 1;
          n_infiles++;
          n_switches++;
          add_preprocessor_option ("--help", 6);
          add_assembler_option ("--help", 6);
          add_linker_option ("--help", 6);
        }
      else if (! strcmp (argv[i], "-pass-exit-codes"))
        {
          pass_exit_codes = 1;
          n_switches++;
        }
      else if (! strcmp (argv[i], "-print-search-dirs"))
        print_search_dirs = 1;
      else if (! strcmp (argv[i], "-print-libgcc-file-name"))
        print_file_name = "libgcc.a";
      else if (! strncmp (argv[i], "-print-file-name=", 17))
        print_file_name = argv[i] + 17;
      else if (! strncmp (argv[i], "-print-prog-name=", 17))
        print_prog_name = argv[i] + 17;
      else if (! strcmp (argv[i], "-print-multi-lib"))
        print_multi_lib = 1;
      else if (! strcmp (argv[i], "-print-multi-directory"))
        print_multi_directory = 1;
      else if (! strncmp (argv[i], "-Wa,", 4))
        {
          int prev, j;
          prev = 4;
          for (j = 4; argv[i][j]; j++)
            if (argv[i][j] == ',')
              {
                add_assembler_option (argv[i] + prev, j - prev);
                prev = j + 1;
              }
          add_assembler_option (argv[i] + prev, j - prev);
        }
      else if (! strncmp (argv[i], "-Wp,", 4))
        {
          int prev, j;
          prev = 4;
          for (j = 4; argv[i][j]; j++)
            if (argv[i][j] == ',')
              {
                add_preprocessor_option (argv[i] + prev, j - prev);
                prev = j + 1;
              }
          add_preprocessor_option (argv[i] + prev, j - prev);
        }
      else if (strncmp (argv[i], "-Wl,", 4) == 0)
        {
          int j;
          for (j = 3; argv[i][j]; j++)
            n_infiles += (argv[i][j] == ',');
        }
      else if (strcmp (argv[i], "-Xlinker") == 0)
        {
          if (i + 1 == argc)
            fatal ("argument to `-Xlinker' is missing");
          n_infiles++;
          i++;
        }
      else if (argv[i][0] == '-' && argv[i][1] != 0)
        {
          register const char *p = &argv[i][1];
          register int c = *p;
          switch (c)
            {
            case 'b':
              n_switches++;
              if (p[1] == 0 && i + 1 == argc)
                fatal ("argument to `-b' is missing");
              if (p[1] == 0)
                spec_machine = argv[++i];
              else
                spec_machine = p + 1;
              warn_std_ptr = &warn_std;
              break;
            case 'B':
              {
                const char *value;
                if (p[1] == 0 && i + 1 == argc)
                  fatal ("argument to `-B' is missing");
                if (p[1] == 0)
                  value = argv[++i];
                else
                  value = p + 1;
                {
                  int len = strlen (value);
                  if ((len == 7
                       || (len > 7
                           && (((value[len - 8]) == '/'))))
                      && strncmp (value + len - 7, "stage", 5) == 0
                      && ((unsigned) (value[len - 2]) - '0' <= 9)
                      && (((value[len - 1]) == '/')))
                    {
                      if (len == 7)
                        add_prefix (&include_prefixes, "include", ((void *) 0),
                                    128, 0, ((void *) 0));
                      else
                        {
                          char *string = xmalloc (len + 1);
                          strncpy (string, value, len-7);
                          strcpy (string+len-7, "include");
                          add_prefix (&include_prefixes, string, ((void *) 0),
                                      128, 0, ((void *) 0));
                        }
                    }
                }
                add_prefix (&exec_prefixes, value, ((void *) 0),
                            128, 0, &warn_B);
                add_prefix (&startfile_prefixes, value, ((void *) 0),
                            128, 0, &warn_B);
                add_prefix (&include_prefixes, concat (value, "include",
                                                       ((void *) 0)),
                            ((void *) 0),
                            128, 0, ((void *) 0));
                n_switches++;
              }
              break;
            case 'v':
              n_switches++;
              if (p[1] != 0)
                break;
              verbose_flag++;
              break;
            case 'V':
              n_switches++;
              if (p[1] == 0 && i + 1 == argc)
                fatal ("argument to `-V' is missing");
              if (p[1] == 0)
                spec_version = argv[++i];
              else
                spec_version = p + 1;
              warn_std_ptr = &warn_std;
              {
                const char *v = compiler_version;
                while (! ((unsigned) (*v) - '0' <= 9))
                  v++;
                if (v > compiler_version && v[-1] != '-')
                  fatal ("invalid version number format");
                while (((unsigned) (*v) - '0' <= 9))
                  v++;
                if (*v != '.')
                  fatal ("invalid version number format");
                v++;
                while (((unsigned) (*v) - '0' <= 9))
                  v++;
                if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
                  fatal ("invalid version number format");
              }
              if (p[1] == 0)
                {
                  n_switches++;
                }
            case 'o':
              have_o = 1;
            default:
            normal_switch:
              if (((c) == 'D' || (c) == 'U' || (c) == 'o' || (c) == 'e' || (c) 
== 'T' || (c) == 'u' || (c) == 'I' || (c) == 'm' || (c) == 'x' || (c) == 'L' 
|| (c) == 'A' || (c) == 'V' || (c) == 'B' || (c) == 'b') > (p[1] != 0))
                i += ((c) == 'D' || (c) == 'U' || (c) == 'o' || (c) == 'e' || 
(c) == 'T' || (c) == 'u' || (c) == 'I' || (c) == 'm' || (c) == 'x' || (c) == 
'L' || (c) == 'A' || (c) == 'V' || (c) == 'B' || (c) == 'b') - (p[1] != 0);
              else if ((!strcmp (p, "Tdata") || !strcmp (p, "Ttext") || 
!strcmp (p, "Tbss") || !strcmp (p, "include") || !strcmp (p, "imacros") || 
!strcmp (p, "aux-info") || !strcmp (p, "idirafter") || !strcmp (p, "iprefix") 
|| !strcmp (p, "iwithprefix") || !strcmp (p, "iwithprefixbefore") || !strcmp 
(p, "isystem") || !strcmp (p, "specs")))
                i += (!strcmp (p, "Tdata") || !strcmp (p, "Ttext") || !strcmp 
(p, "Tbss") || !strcmp (p, "include") || !strcmp (p, "imacros") || !strcmp (p, 
"aux-info") || !strcmp (p, "idirafter") || !strcmp (p, "iprefix") || !strcmp 
(p, "iwithprefix") || !strcmp (p, "iwithprefixbefore") || !strcmp (p, 
"isystem") || !strcmp (p, "specs"));
            }
        }
    }
    {
      if (gcc_exec_prefix)
        {
          char *gcc_exec_tooldir_prefix
            = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
                      spec_version, dir_separator_str, tooldir_prefix, ((void 
*) 0));
          add_prefix (&exec_prefixes,
                      concat (gcc_exec_tooldir_prefix, "bin",
                              dir_separator_str, ((void *) 0)),
                      ((void *) 0), 255, 0, ((void *) 0));
        }
      tooldir_prefix = concat (standard_exec_prefix, spec_machine,
                               dir_separator_str, spec_version,
                               dir_separator_str, tooldir_prefix, ((void *) 
0));
    }
  add_prefix (&exec_prefixes,
              concat (tooldir_prefix, "bin", dir_separator_str, ((void *) 0)),
              "BINUTILS", 255, 0, ((void *) 0));
}








^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Your recent reload changes
  2000-08-22  8:46 Your recent reload changes Jeffrey A Law
@ 2000-08-22 11:01 ` Richard Henderson
  2000-08-22 14:03   ` Richard Henderson
  2000-08-22 14:26 ` Joern Rennecke
  1 sibling, 1 reply; 9+ messages in thread
From: Richard Henderson @ 2000-08-22 11:01 UTC (permalink / raw)
  To: Jeffrey A Law; +Cc: gcc

On Tue, Aug 22, 2000 at 09:45:01AM -0600, Jeffrey A Law wrote:
> However, after your patch we get the following reloads:
> 
> Reload 0: R1_REGS, RELOAD_FOR_INPUT (opnum = 0), can't combine, 
> secondary_reload_p
> Reload 1: reload_in (SI) = (high:SI (symbol_ref:SI ("warn_std_ptr")))
>         GENERAL_REGS, RELOAD_FOR_OUTPUT_ADDRESS (opnum = 0), can't combine

This is the problem.  The secondary reload should have the same
lifetime as its primary, but doesn't.  I'll see about fixing this.



r~

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Your recent reload changes
  2000-08-22 11:01 ` Richard Henderson
@ 2000-08-22 14:03   ` Richard Henderson
  2000-08-22 15:59     ` Jeffrey A Law
  0 siblings, 1 reply; 9+ messages in thread
From: Richard Henderson @ 2000-08-22 14:03 UTC (permalink / raw)
  To: Jeffrey A Law; +Cc: gcc

On Tue, Aug 22, 2000 at 11:01:07AM -0700, Richard Henderson wrote:
> On Tue, Aug 22, 2000 at 09:45:01AM -0600, Jeffrey A Law wrote:
> > However, after your patch we get the following reloads:
> > 
> > Reload 0: R1_REGS, RELOAD_FOR_INPUT (opnum = 0), can't combine, 
> > secondary_reload_p
> > Reload 1: reload_in (SI) = (high:SI (symbol_ref:SI ("warn_std_ptr")))
> >         GENERAL_REGS, RELOAD_FOR_OUTPUT_ADDRESS (opnum = 0), can't combine
> 
> This is the problem.  The secondary reload should have the same
> lifetime as its primary, but doesn't.  I'll see about fixing this.

Bother.  Even after fixing this it still doesn't work.  We've got

Reload 0: R1_REGS, RELOAD_FOR_OPERAND_ADDRESS (opnum = 0),
	can't combine, secondary_reload_p
Reload 1: reload_in (SI) = (high:SI (symbol_ref:SI ("warn_std_ptr")))
        GENERAL_REGS, RELOAD_FOR_OPERAND_ADDRESS (opnum = 0), can't combine
        reload_in_reg: (reg:SI 466)
        secondary_in_reload = 0
        secondary_in_icode = reload_insi
Reload 2: reload_out (SI) = (mem/f:SI (lo_sum:SI (reg:SI 466)
                                (symbol_ref:SI ("warn_std_ptr"))) 110)
        NO_REGS, RELOAD_FOR_OUTPUT (opnum = 0), optional
        reload_out_reg: (mem/f:SI (lo_sum:SI (reg:SI 466)
                            (symbol_ref:SI ("warn_std_ptr"))) 110)
Reload 3: R1_REGS, RELOAD_FOR_INPUT (opnum = 1),
	can't combine, secondary_reload_p
Reload 4: reload_in (SI) = (symbol_ref:SI ("warn_std"))
        GENERAL_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine
        reload_in_reg: (reg:SI 467)
        secondary_in_reload = 3
        secondary_in_icode = reload_insi

I'm not quite sure the distinction between OPERAND_ADDRESS and INPUT,
as they're both inputs, of a sort.  But what it means is that we've
still got overlapping lifetimes for the R1 secondary reloads.

The Problem here is that we've gone from one extreme to another.  From
no overlapping lifetimes between the secondary and primary to completely
overlapping lifetimes.  But that's just as inaccurate.  What we need is
for secondary reloads (with reload_in/out) to be live until the end of
the reload insn.  When using something like INPUT_ADDRESS they're
considered live until the beginning of the reload insn.

So, whaddaya wanna do?  Revert the whole thing and find some other
workaround for ia64 (OImode reloads?  Eek.), add yet another lifetime,
or see how much work finishing Bernd's reload dependancy bit would take?


r~

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Your recent reload changes
  2000-08-22  8:46 Your recent reload changes Jeffrey A Law
  2000-08-22 11:01 ` Richard Henderson
@ 2000-08-22 14:26 ` Joern Rennecke
  2000-08-22 14:30   ` Richard Henderson
  2000-08-22 14:31   ` Jeffrey A Law
  1 sibling, 2 replies; 9+ messages in thread
From: Joern Rennecke @ 2000-08-22 14:26 UTC (permalink / raw)
  To: law; +Cc: rth, gcc

> Reload 3: R1_REGS, RELOAD_FOR_INPUT_ADDRESS (opnum = 1), can't combine, 
> secondar
> y_reload_p
>         reload_reg_rtx: (reg:SI 1 %r1)

Looking at the reload_insi pattern of the pa, I see that it applies to all
destinations of all register classes, and is used with any source that is
not a hard register.  Couldn't you make this pattern restrictive, so that
it only triggers when you genuinely need a scratch register?
Reload is perfectly capable of dealing with intermediary registers on its
own.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Your recent reload changes
  2000-08-22 14:26 ` Joern Rennecke
@ 2000-08-22 14:30   ` Richard Henderson
  2000-08-22 14:31   ` Jeffrey A Law
  1 sibling, 0 replies; 9+ messages in thread
From: Richard Henderson @ 2000-08-22 14:30 UTC (permalink / raw)
  To: Joern Rennecke; +Cc: law, gcc

On Tue, Aug 22, 2000 at 10:25:20PM +0100, Joern Rennecke wrote:
> Looking at the reload_insi pattern of the pa, I see that it applies to all
> destinations of all register classes, and is used with any source that is
> not a hard register.  Couldn't you make this pattern restrictive, so that
> it only triggers when you genuinely need a scratch register?
> Reload is perfectly capable of dealing with intermediary registers on its
> own.

And, also relevant, I only changed the lifetimes for scratch
registers, not intermediates.


r~

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Your recent reload changes
  2000-08-22 14:26 ` Joern Rennecke
  2000-08-22 14:30   ` Richard Henderson
@ 2000-08-22 14:31   ` Jeffrey A Law
  1 sibling, 0 replies; 9+ messages in thread
From: Jeffrey A Law @ 2000-08-22 14:31 UTC (permalink / raw)
  To: Joern Rennecke; +Cc: rth, gcc

  In message < 200008222125.WAA31259@phal.cygnus.co.uk >you write:
  > > Reload 3: R1_REGS, RELOAD_FOR_INPUT_ADDRESS (opnum = 1), can't combine, 
  > > secondar
  > > y_reload_p
  > >         reload_reg_rtx: (reg:SI 1 %r1)
  > 
  > Looking at the reload_insi pattern of the pa, I see that it applies to all
  > destinations of all register classes, and is used with any source that is
  > not a hard register.  Couldn't you make this pattern restrictive, so that
  > it only triggers when you genuinely need a scratch register?
  > Reload is perfectly capable of dealing with intermediary registers on its
  > own.
Sometimes we need an intermediate, sometimes we need a scratch.  Find a way
to rewrite it to handle both with a more restrictive pattern and I'll happily
use it.

Not surprisingly it's been tried multiple times, and every time we've come
back to the code you see in pa.md/pa.c.  Good luck.


jeff

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Your recent reload changes
  2000-08-22 14:03   ` Richard Henderson
@ 2000-08-22 15:59     ` Jeffrey A Law
  2000-08-22 17:52       ` Richard Henderson
  0 siblings, 1 reply; 9+ messages in thread
From: Jeffrey A Law @ 2000-08-22 15:59 UTC (permalink / raw)
  To: Richard Henderson; +Cc: gcc

  In message < 20000822140310.A25650@cygnus.com >you write:
  > On Tue, Aug 22, 2000 at 11:01:07AM -0700, Richard Henderson wrote:
  > > On Tue, Aug 22, 2000 at 09:45:01AM -0600, Jeffrey A Law wrote:
  > > > However, after your patch we get the following reloads:
  > > > 
  > > > Reload 0: R1_REGS, RELOAD_FOR_INPUT (opnum = 0), can't combine, 
  > > > secondary_reload_p
  > > > Reload 1: reload_in (SI) = (high:SI (symbol_ref:SI ("warn_std_ptr")))
  > > >         GENERAL_REGS, RELOAD_FOR_OUTPUT_ADDRESS (opnum = 0), can't comb
  > ine
  > > 
  > > This is the problem.  The secondary reload should have the same
  > > lifetime as its primary, but doesn't.  I'll see about fixing this.
  > 
  > Bother.  Even after fixing this it still doesn't work.  We've got
  > 
  > Reload 0: R1_REGS, RELOAD_FOR_OPERAND_ADDRESS (opnum = 0),
  > 	can't combine, secondary_reload_p
  > Reload 1: reload_in (SI) = (high:SI (symbol_ref:SI ("warn_std_ptr")))
  >         GENERAL_REGS, RELOAD_FOR_OPERAND_ADDRESS (opnum = 0), can't combine
  >         reload_in_reg: (reg:SI 466)
  >         secondary_in_reload = 0
  >         secondary_in_icode = reload_insi
  > Reload 2: reload_out (SI) = (mem/f:SI (lo_sum:SI (reg:SI 466)
  >                                 (symbol_ref:SI ("warn_std_ptr"))) 110)
  >         NO_REGS, RELOAD_FOR_OUTPUT (opnum = 0), optional
  >         reload_out_reg: (mem/f:SI (lo_sum:SI (reg:SI 466)
  >                             (symbol_ref:SI ("warn_std_ptr"))) 110)
  > Reload 3: R1_REGS, RELOAD_FOR_INPUT (opnum = 1),
  > 	can't combine, secondary_reload_p
  > Reload 4: reload_in (SI) = (symbol_ref:SI ("warn_std"))
  >         GENERAL_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine
  >         reload_in_reg: (reg:SI 467)
  >         secondary_in_reload = 3
  >         secondary_in_icode = reload_insi
  > 
  > I'm not quite sure the distinction between OPERAND_ADDRESS and INPUT,
  > as they're both inputs, of a sort.  But what it means is that we've
  > still got overlapping lifetimes for the R1 secondary reloads.
Hmmm, based on my quick reading of reload1.c, I would think that would
work.  Reloads #3 & #4 would occur, then #1, #2.  Is it the case that
we don't realize the RELOAD_FOR_INPUT reload in #3 dies before the
reload for #1?


  > The Problem here is that we've gone from one extreme to another.  From
  > no overlapping lifetimes between the secondary and primary to completely
  > overlapping lifetimes.  But that's just as inaccurate.  What we need is
  > for secondary reloads (with reload_in/out) to be live until the end of
  > the reload insn.  When using something like INPUT_ADDRESS they're
  > considered live until the beginning of the reload insn.
OK. I get it.

I wonder why #0 & #1 aren't RELOAD_FOR_OUTPUT_ADDRESS or something like
that since they're for the output value.


  > So, whaddaya wanna do?  Revert the whole thing and find some other
  > workaround for ia64 (OImode reloads?  Eek.), add yet another lifetime,
  > or see how much work finishing Bernd's reload dependancy bit would take?
I'm not sure.  The reload dependency stuff is really the right way to go
to describe all this stuff.  But I'm not sure if we've got the time right
now to tackle that kind of redesign.  I haven't looked at it in the last
month or so, but my understanding was most of the basic bits where ready,
but that we were going to need a fair amount of test & benchmark time
(the former simply because it significantly revamps how we allocate
reload regs, the latter because it zapps all the code which tried to
optimize reloads).

jeff

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Your recent reload changes
  2000-08-22 15:59     ` Jeffrey A Law
@ 2000-08-22 17:52       ` Richard Henderson
  2000-08-28 21:04         ` Richard Henderson
  0 siblings, 1 reply; 9+ messages in thread
From: Richard Henderson @ 2000-08-22 17:52 UTC (permalink / raw)
  To: Jeffrey A Law; +Cc: gcc

On Tue, Aug 22, 2000 at 04:57:21PM -0600, Jeffrey A Law wrote:
> I wonder why #0 & #1 aren't RELOAD_FOR_OUTPUT_ADDRESS or something like
> that since they're for the output value.

Because we didn't reload the entire mem for output.  We reloaded the
memory address, which is of course an input to the insn.  Which is
why I was wondering why we wern't just using RELOAD_FOR_INPUT.

Guessing wildly, I'd say we have INPUT and OUTPUT_ADDRESS for some
optional reload nastiness.  But I'm not sure I really want to know.

> I'm not sure.  The reload dependency stuff is really the right way to go
> to describe all this stuff.  But I'm not sure if we've got the time right
> now to tackle that kind of redesign.  I haven't looked at it in the last
> month or so, but my understanding was most of the basic bits where ready,
> but that we were going to need a fair amount of test & benchmark time

Ug.  Ok, so it sounds like option 1 (hack ia64) is the only option.
I'll look at doing that tomorrow.


r~

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Your recent reload changes
  2000-08-22 17:52       ` Richard Henderson
@ 2000-08-28 21:04         ` Richard Henderson
  0 siblings, 0 replies; 9+ messages in thread
From: Richard Henderson @ 2000-08-28 21:04 UTC (permalink / raw)
  To: Jeffrey A Law; +Cc: gcc

On Tue, Aug 22, 2000 at 04:54:42PM -0700, Richard Henderson wrote:
> Ug.  Ok, so it sounds like option 1 (hack ia64) is the only option.
> I'll look at doing that tomorrow.

"Tomorrow" of course being a euphamism for "next week".

I've just reverted the two changes I've made in this area.
I'll take care of the IA-64 issues separately.


r~


        * reload.c (push_secondary_reload): Revert 2000-08-16 change.
        (find_reloads): Likewise.
        * config/alpha/alpha.md (reload_inqi): Revert 2000-08-11 change.
        (reload_inhi): Likewise.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2000-08-28 21:04 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-08-22  8:46 Your recent reload changes Jeffrey A Law
2000-08-22 11:01 ` Richard Henderson
2000-08-22 14:03   ` Richard Henderson
2000-08-22 15:59     ` Jeffrey A Law
2000-08-22 17:52       ` Richard Henderson
2000-08-28 21:04         ` Richard Henderson
2000-08-22 14:26 ` Joern Rennecke
2000-08-22 14:30   ` Richard Henderson
2000-08-22 14:31   ` Jeffrey A Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).