OSDN Git Service

* config/m68k/m68k.c (m68k_output_mi_thunk): delete obsolete code
[pf3gnuchains/gcc-fork.git] / gcc / emit-rtl.c
index 03ee0ca..45ff41c 100644 (file)
@@ -1,4 +1,4 @@
-/* Emit RTL for the GNU C-Compiler expander.
+/* Emit RTL for the GCC expander.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
    1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
@@ -170,40 +170,32 @@ static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
 #define first_insn (cfun->emit->x_first_insn)
 #define last_insn (cfun->emit->x_last_insn)
 #define cur_insn_uid (cfun->emit->x_cur_insn_uid)
-#define last_linenum (cfun->emit->x_last_linenum)
-#define last_filename (cfun->emit->x_last_filename)
+#define last_location (cfun->emit->x_last_location)
 #define first_label_num (cfun->emit->x_first_label_num)
 
-static rtx make_jump_insn_raw          PARAMS ((rtx));
-static rtx make_call_insn_raw          PARAMS ((rtx));
-static rtx find_line_note              PARAMS ((rtx));
-static rtx change_address_1            PARAMS ((rtx, enum machine_mode, rtx,
-                                                int));
-static void unshare_all_rtl_1          PARAMS ((rtx));
-static void unshare_all_decls          PARAMS ((tree));
-static void reset_used_decls           PARAMS ((tree));
-static void mark_label_nuses           PARAMS ((rtx));
-static hashval_t const_int_htab_hash    PARAMS ((const void *));
-static int const_int_htab_eq            PARAMS ((const void *,
-                                                const void *));
-static hashval_t const_double_htab_hash PARAMS ((const void *));
-static int const_double_htab_eq                PARAMS ((const void *,
-                                                const void *));
-static rtx lookup_const_double         PARAMS ((rtx));
-static hashval_t mem_attrs_htab_hash    PARAMS ((const void *));
-static int mem_attrs_htab_eq            PARAMS ((const void *,
-                                                const void *));
-static mem_attrs *get_mem_attrs                PARAMS ((HOST_WIDE_INT, tree, rtx,
-                                                rtx, unsigned int,
-                                                enum machine_mode));
-static hashval_t reg_attrs_htab_hash    PARAMS ((const void *));
-static int reg_attrs_htab_eq            PARAMS ((const void *,
-                                                const void *));
-static reg_attrs *get_reg_attrs                PARAMS ((tree, int));
-static tree component_ref_for_mem_expr PARAMS ((tree));
-static rtx gen_const_vector_0          PARAMS ((enum machine_mode));
-static rtx gen_complex_constant_part   PARAMS ((enum machine_mode,
-                                                rtx, int));
+static rtx make_jump_insn_raw (rtx);
+static rtx make_call_insn_raw (rtx);
+static rtx find_line_note (rtx);
+static rtx change_address_1 (rtx, enum machine_mode, rtx, int);
+static void unshare_all_rtl_1 (rtx);
+static void unshare_all_decls (tree);
+static void reset_used_decls (tree);
+static void mark_label_nuses (rtx);
+static hashval_t const_int_htab_hash (const void *);
+static int const_int_htab_eq (const void *, const void *);
+static hashval_t const_double_htab_hash (const void *);
+static int const_double_htab_eq (const void *, const void *);
+static rtx lookup_const_double (rtx);
+static hashval_t mem_attrs_htab_hash (const void *);
+static int mem_attrs_htab_eq (const void *, const void *);
+static mem_attrs *get_mem_attrs (HOST_WIDE_INT, tree, rtx, rtx, unsigned int,
+                                enum machine_mode);
+static hashval_t reg_attrs_htab_hash (const void *);
+static int reg_attrs_htab_eq (const void *, const void *);
+static reg_attrs *get_reg_attrs (tree, int);
+static tree component_ref_for_mem_expr (tree);
+static rtx gen_const_vector_0 (enum machine_mode);
+static rtx gen_complex_constant_part (enum machine_mode, rtx, int);
 
 /* Probability of the conditional branch currently proceeded by try_split.
    Set to -1 otherwise.  */
@@ -212,10 +204,9 @@ int split_branch_probability = -1;
 /* Returns a hash code for X (which is a really a CONST_INT).  */
 
 static hashval_t
-const_int_htab_hash (x)
-     const void *x;
+const_int_htab_hash (const void *x)
 {
-  return (hashval_t) INTVAL ((struct rtx_def *) x);
+  return (hashval_t) INTVAL ((rtx) x);
 }
 
 /* Returns nonzero if the value represented by X (which is really a
@@ -223,17 +214,14 @@ const_int_htab_hash (x)
    HOST_WIDE_INT *).  */
 
 static int
-const_int_htab_eq (x, y)
-     const void *x;
-     const void *y;
+const_int_htab_eq (const void *x, const void *y)
 {
   return (INTVAL ((rtx) x) == *((const HOST_WIDE_INT *) y));
 }
 
 /* Returns a hash code for X (which is really a CONST_DOUBLE).  */
 static hashval_t
-const_double_htab_hash (x)
-     const void *x;
+const_double_htab_hash (const void *x)
 {
   rtx value = (rtx) x;
   hashval_t h;
@@ -252,9 +240,7 @@ const_double_htab_hash (x)
 /* Returns nonzero if the value represented by X (really a ...)
    is the same as that represented by Y (really a ...) */
 static int
-const_double_htab_eq (x, y)
-     const void *x;
-     const void *y;
+const_double_htab_eq (const void *x, const void *y)
 {
   rtx a = (rtx)x, b = (rtx)y;
 
@@ -271,8 +257,7 @@ const_double_htab_eq (x, y)
 /* Returns a hash code for X (which is a really a mem_attrs *).  */
 
 static hashval_t
-mem_attrs_htab_hash (x)
-     const void *x;
+mem_attrs_htab_hash (const void *x)
 {
   mem_attrs *p = (mem_attrs *) x;
 
@@ -287,9 +272,7 @@ mem_attrs_htab_hash (x)
    mem_attrs *).  */
 
 static int
-mem_attrs_htab_eq (x, y)
-     const void *x;
-     const void *y;
+mem_attrs_htab_eq (const void *x, const void *y)
 {
   mem_attrs *p = (mem_attrs *) x;
   mem_attrs *q = (mem_attrs *) y;
@@ -303,13 +286,8 @@ mem_attrs_htab_eq (x, y)
    MEM of mode MODE.  */
 
 static mem_attrs *
-get_mem_attrs (alias, expr, offset, size, align, mode)
-     HOST_WIDE_INT alias;
-     tree expr;
-     rtx offset;
-     rtx size;
-     unsigned int align;
-     enum machine_mode mode;
+get_mem_attrs (HOST_WIDE_INT alias, tree expr, rtx offset, rtx size,
+              unsigned int align, enum machine_mode mode)
 {
   mem_attrs attrs;
   void **slot;
@@ -343,8 +321,7 @@ get_mem_attrs (alias, expr, offset, size, align, mode)
 /* Returns a hash code for X (which is a really a reg_attrs *).  */
 
 static hashval_t
-reg_attrs_htab_hash (x)
-     const void *x;
+reg_attrs_htab_hash (const void *x)
 {
   reg_attrs *p = (reg_attrs *) x;
 
@@ -356,9 +333,7 @@ reg_attrs_htab_hash (x)
    reg_attrs *).  */
 
 static int
-reg_attrs_htab_eq (x, y)
-     const void *x;
-     const void *y;
+reg_attrs_htab_eq (const void *x, const void *y)
 {
   reg_attrs *p = (reg_attrs *) x;
   reg_attrs *q = (reg_attrs *) y;
@@ -370,9 +345,7 @@ reg_attrs_htab_eq (x, y)
    MEM of mode MODE.  */
 
 static reg_attrs *
-get_reg_attrs (decl, offset)
-     tree decl;
-     int offset;
+get_reg_attrs (tree decl, int offset)
 {
   reg_attrs attrs;
   void **slot;
@@ -399,9 +372,7 @@ get_reg_attrs (decl, offset)
    frame_pointer_rtx).  */
 
 rtx
-gen_raw_REG (mode, regno)
-     enum machine_mode mode;
-     int regno;
+gen_raw_REG (enum machine_mode mode, int regno)
 {
   rtx x = gen_rtx_raw_REG (mode, regno);
   ORIGINAL_REGNO (x) = regno;
@@ -413,9 +384,7 @@ gen_raw_REG (mode, regno)
    special_rtx in gengenrtl.c as well.  */
 
 rtx
-gen_rtx_CONST_INT (mode, arg)
-     enum machine_mode mode ATTRIBUTE_UNUSED;
-     HOST_WIDE_INT arg;
+gen_rtx_CONST_INT (enum machine_mode mode ATTRIBUTE_UNUSED, HOST_WIDE_INT arg)
 {
   void **slot;
 
@@ -437,9 +406,7 @@ gen_rtx_CONST_INT (mode, arg)
 }
 
 rtx
-gen_int_mode (c, mode)
-     HOST_WIDE_INT c;
-     enum machine_mode mode;
+gen_int_mode (HOST_WIDE_INT c, enum machine_mode mode)
 {
   return GEN_INT (trunc_int_for_mode (c, mode));
 }
@@ -452,8 +419,7 @@ gen_int_mode (c, mode)
    hash table.  If so, return its counterpart; otherwise add it
    to the hash table and return it.  */
 static rtx
-lookup_const_double (real)
-     rtx real;
+lookup_const_double (rtx real)
 {
   void **slot = htab_find_slot (const_double_htab, real, INSERT);
   if (*slot == 0)
@@ -465,9 +431,7 @@ lookup_const_double (real)
 /* Return a CONST_DOUBLE rtx for a floating-point value specified by
    VALUE in mode MODE.  */
 rtx
-const_double_from_real_value (value, mode)
-     REAL_VALUE_TYPE value;
-     enum machine_mode mode;
+const_double_from_real_value (REAL_VALUE_TYPE value, enum machine_mode mode)
 {
   rtx real = rtx_alloc (CONST_DOUBLE);
   PUT_MODE (real, mode);
@@ -483,9 +447,7 @@ const_double_from_real_value (value, mode)
    REAL_VALUE_TYPE and use CONST_DOUBLE_FROM_REAL_VALUE.  */
 
 rtx
-immed_double_const (i0, i1, mode)
-     HOST_WIDE_INT i0, i1;
-     enum machine_mode mode;
+immed_double_const (HOST_WIDE_INT i0, HOST_WIDE_INT i1, enum machine_mode mode)
 {
   rtx value;
   unsigned int i;
@@ -568,9 +530,7 @@ immed_double_const (i0, i1, mode)
 }
 
 rtx
-gen_rtx_REG (mode, regno)
-     enum machine_mode mode;
-     unsigned int regno;
+gen_rtx_REG (enum machine_mode mode, unsigned int regno)
 {
   /* In case the MD file explicitly references the frame pointer, have
      all such references point to the same frame pointer.  This is
@@ -635,9 +595,7 @@ gen_rtx_REG (mode, regno)
 }
 
 rtx
-gen_rtx_MEM (mode, addr)
-     enum machine_mode mode;
-     rtx addr;
+gen_rtx_MEM (enum machine_mode mode, rtx addr)
 {
   rtx rt = gen_rtx_raw_MEM (mode, addr);
 
@@ -649,10 +607,7 @@ gen_rtx_MEM (mode, addr)
 }
 
 rtx
-gen_rtx_SUBREG (mode, reg, offset)
-     enum machine_mode mode;
-     rtx reg;
-     int offset;
+gen_rtx_SUBREG (enum machine_mode mode, rtx reg, int offset)
 {
   /* This is the most common failure type.
      Catch it early so we can see who does it.  */
@@ -674,9 +629,7 @@ gen_rtx_SUBREG (mode, reg, offset)
    is smaller than mode of REG, otherwise paradoxical SUBREG.  */
 
 rtx
-gen_lowpart_SUBREG (mode, reg)
-     enum machine_mode mode;
-     rtx reg;
+gen_lowpart_SUBREG (enum machine_mode mode, rtx reg)
 {
   enum machine_mode inmode;
 
@@ -819,7 +772,7 @@ gen_rtvec (int n, ...)
   if (n == 0)
     return NULL_RTVEC;         /* Don't allocate an empty rtvec...     */
 
-  vector = (rtx *) alloca (n * sizeof (rtx));
+  vector = alloca (n * sizeof (rtx));
 
   for (i = 0; i < n; i++)
     vector[i] = va_arg (p, rtx);
@@ -832,9 +785,7 @@ gen_rtvec (int n, ...)
 }
 
 rtvec
-gen_rtvec_v (n, argp)
-     int n;
-     rtx *argp;
+gen_rtvec_v (int n, rtx *argp)
 {
   int i;
   rtvec rt_val;
@@ -854,8 +805,7 @@ gen_rtvec_v (n, argp)
    This pseudo is assigned the next sequential register number.  */
 
 rtx
-gen_reg_rtx (mode)
-     enum machine_mode mode;
+gen_reg_rtx (enum machine_mode mode)
 {
   struct function *f = cfun;
   rtx val;
@@ -895,8 +845,8 @@ gen_reg_rtx (mode)
       memset (new + old_size, 0, old_size);
       f->emit->regno_pointer_align = (unsigned char *) new;
 
-      new1 = (rtx *) ggc_realloc (f->emit->x_regno_reg_rtx,
-                                 old_size * 2 * sizeof (rtx));
+      new1 = ggc_realloc (f->emit->x_regno_reg_rtx,
+                         old_size * 2 * sizeof (rtx));
       memset (new1 + old_size, 0, old_size * sizeof (rtx));
       regno_reg_rtx = new1;
 
@@ -912,24 +862,18 @@ gen_reg_rtx (mode)
    but offsetted by OFFSET.  */
 
 rtx
-gen_rtx_REG_offset (reg, mode, regno, offset)
-     enum machine_mode mode;
-     unsigned int regno;
-     int offset;
-     rtx reg;
+gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno, int offset)
 {
   rtx new = gen_rtx_REG (mode, regno);
   REG_ATTRS (new) = get_reg_attrs (REG_EXPR (reg),
-                                  REG_OFFSET (reg) + offset);
+                                  REG_OFFSET (reg) + offset);
   return new;
 }
 
 /* Set the decl for MEM to DECL.  */
 
 void
-set_reg_attrs_from_mem (reg, mem)
-     rtx reg;
-     rtx mem;
+set_reg_attrs_from_mem (rtx reg, rtx mem)
 {
   if (MEM_OFFSET (mem) && GET_CODE (MEM_OFFSET (mem)) == CONST_INT)
     REG_ATTRS (reg)
@@ -940,9 +884,7 @@ set_reg_attrs_from_mem (reg, mem)
    Use needed values from memory attributes of MEM.  */
 
 void
-set_reg_attrs_for_parm (parm_rtx, mem)
-     rtx parm_rtx;
-     rtx mem;
+set_reg_attrs_for_parm (rtx parm_rtx, rtx mem)
 {
   if (GET_CODE (parm_rtx) == REG)
     set_reg_attrs_from_mem (parm_rtx, mem);
@@ -964,15 +906,13 @@ set_reg_attrs_for_parm (parm_rtx, mem)
 
 /* Assign the RTX X to declaration T.  */
 void
-set_decl_rtl (t, x)
-     tree t;
-     rtx x;
+set_decl_rtl (tree t, rtx x)
 {
   DECL_CHECK (t)->decl.rtl = x;
 
   if (!x)
     return;
-  /* For register, we maitain the reverse information too.  */
+  /* For register, we maintain the reverse information too.  */
   if (GET_CODE (x) == REG)
     REG_ATTRS (x) = get_reg_attrs (t, 0);
   else if (GET_CODE (x) == SUBREG)
@@ -1001,8 +941,7 @@ set_decl_rtl (t, x)
 /* Identify REG (which may be a CONCAT) as a user register.  */
 
 void
-mark_user_reg (reg)
-     rtx reg;
+mark_user_reg (rtx reg)
 {
   if (GET_CODE (reg) == CONCAT)
     {
@@ -1019,9 +958,7 @@ mark_user_reg (reg)
    as ALIGN, if nonzero.  */
 
 void
-mark_reg_pointer (reg, align)
-     rtx reg;
-     int align;
+mark_reg_pointer (rtx reg, int align)
 {
   if (! REG_POINTER (reg))
     {
@@ -1038,7 +975,7 @@ mark_reg_pointer (reg, align)
 /* Return 1 plus largest pseudo reg number used in the current function.  */
 
 int
-max_reg_num ()
+max_reg_num (void)
 {
   return reg_rtx_no;
 }
@@ -1046,7 +983,7 @@ max_reg_num ()
 /* Return 1 + the largest label number used so far in the current function.  */
 
 int
-max_label_num ()
+max_label_num (void)
 {
   if (last_label_num && label_num == base_label_num)
     return last_label_num;
@@ -1056,7 +993,7 @@ max_label_num ()
 /* Return first label number used in this function (if any were used).  */
 
 int
-get_first_label_num ()
+get_first_label_num (void)
 {
   return first_label_num;
 }
@@ -1064,9 +1001,7 @@ get_first_label_num ()
 /* Return the final regno of X, which is a SUBREG of a hard
    register.  */
 int
-subreg_hard_regno (x, check_mode)
-     rtx x;
-     int check_mode;
+subreg_hard_regno (rtx x, int check_mode)
 {
   enum machine_mode mode = GET_MODE (x);
   unsigned int byte_offset, base_regno, final_regno;
@@ -1084,7 +1019,7 @@ subreg_hard_regno (x, check_mode)
     abort ();
 #ifdef ENABLE_CHECKING
   if (!subreg_offset_representable_p (REGNO (reg), GET_MODE (reg),
-                                     SUBREG_BYTE (x), mode))
+                                     SUBREG_BYTE (x), mode))
     abort ();
 #endif
   /* Catch non-congruent offsets too.  */
@@ -1109,9 +1044,7 @@ subreg_hard_regno (x, check_mode)
    If this is not a case we can handle, return 0.  */
 
 rtx
-gen_lowpart_common (mode, x)
-     enum machine_mode mode;
-     rtx x;
+gen_lowpart_common (enum machine_mode mode, rtx x)
 {
   int msize = GET_MODE_SIZE (mode);
   int xsize = GET_MODE_SIZE (GET_MODE (x));
@@ -1155,9 +1088,7 @@ gen_lowpart_common (mode, x)
   else if (GET_CODE (x) == SUBREG || GET_CODE (x) == REG
           || GET_CODE (x) == CONCAT || GET_CODE (x) == CONST_VECTOR)
     return simplify_gen_subreg (mode, x, GET_MODE (x), offset);
-  else if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
-           || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
-          && GET_MODE (x) == VOIDmode)
+  else if (VECTOR_MODE_P (mode) && GET_MODE (x) == VOIDmode)
     return simplify_gen_subreg (mode, x, int_mode_for_mode (mode), offset);
   /* If X is a CONST_INT or a CONST_DOUBLE, extract the appropriate bits
      from the low-order part of the constant.  */
@@ -1308,10 +1239,7 @@ gen_lowpart_common (mode, x)
    returns NULL_RTX if the component isn't a constant.  */
 
 static rtx
-gen_complex_constant_part (mode, x, imagpart_p)
-     enum machine_mode mode;
-     rtx x;
-     int imagpart_p;
+gen_complex_constant_part (enum machine_mode mode, rtx x, int imagpart_p)
 {
   tree decl, part;
 
@@ -1334,9 +1262,7 @@ gen_complex_constant_part (mode, x, imagpart_p)
    This always comes at the low address in memory.  */
 
 rtx
-gen_realpart (mode, x)
-     enum machine_mode mode;
-     rtx x;
+gen_realpart (enum machine_mode mode, rtx x)
 {
   rtx part;
 
@@ -1361,9 +1287,7 @@ gen_realpart (mode, x)
    This always comes at the high address in memory.  */
 
 rtx
-gen_imagpart (mode, x)
-     enum machine_mode mode;
-     rtx x;
+gen_imagpart (enum machine_mode mode, rtx x)
 {
   rtx part;
 
@@ -1390,8 +1314,7 @@ gen_imagpart (mode, x)
    regardless of WORDS_BIG_ENDIAN.  */
 
 int
-subreg_realpart_p (x)
-     rtx x;
+subreg_realpart_p (rtx x)
 {
   if (GET_CODE (x) != SUBREG)
     abort ();
@@ -1408,9 +1331,7 @@ subreg_realpart_p (x)
    If X is a MEM whose address is a QUEUED, the value may be so also.  */
 
 rtx
-gen_lowpart (mode, x)
-     enum machine_mode mode;
-     rtx x;
+gen_lowpart (enum machine_mode mode, rtx x)
 {
   rtx result = gen_lowpart_common (mode, x);
 
@@ -1457,9 +1378,7 @@ gen_lowpart (mode, x)
    This is used to access the imaginary part of a complex number.  */
 
 rtx
-gen_highpart (mode, x)
-     enum machine_mode mode;
-     rtx x;
+gen_highpart (enum machine_mode mode, rtx x)
 {
   unsigned int msize = GET_MODE_SIZE (mode);
   rtx result;
@@ -1487,9 +1406,7 @@ gen_highpart (mode, x)
 /* Like gen_highpart, but accept mode of EXP operand in case EXP can
    be VOIDmode constant.  */
 rtx
-gen_highpart_mode (outermode, innermode, exp)
-     enum machine_mode outermode, innermode;
-     rtx exp;
+gen_highpart_mode (enum machine_mode outermode, enum machine_mode innermode, rtx exp)
 {
   if (GET_MODE (exp) != VOIDmode)
     {
@@ -1505,8 +1422,7 @@ gen_highpart_mode (outermode, innermode, exp)
    of the value in mode INNERMODE stored in memory in target format.  */
 
 unsigned int
-subreg_lowpart_offset (outermode, innermode)
-     enum machine_mode outermode, innermode;
+subreg_lowpart_offset (enum machine_mode outermode, enum machine_mode innermode)
 {
   unsigned int offset = 0;
   int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
@@ -1525,8 +1441,7 @@ subreg_lowpart_offset (outermode, innermode)
 /* Return offset in bytes to get OUTERMODE high part
    of the value in mode INNERMODE stored in memory in target format.  */
 unsigned int
-subreg_highpart_offset (outermode, innermode)
-     enum machine_mode outermode, innermode;
+subreg_highpart_offset (enum machine_mode outermode, enum machine_mode innermode)
 {
   unsigned int offset = 0;
   int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
@@ -1550,8 +1465,7 @@ subreg_highpart_offset (outermode, innermode)
    If X is not a SUBREG, always return 1 (it is its own low part!).  */
 
 int
-subreg_lowpart_p (x)
-     rtx x;
+subreg_lowpart_p (rtx x)
 {
   if (GET_CODE (x) != SUBREG)
     return 1;
@@ -1567,10 +1481,7 @@ subreg_lowpart_p (x)
    Some places invoke this directly.  */
 
 rtx
-constant_subword (op, offset, mode)
-     rtx op;
-     int offset;
-     enum machine_mode mode;
+constant_subword (rtx op, int offset, enum machine_mode mode)
 {
   int size_ratio = HOST_BITS_PER_WIDE_INT / BITS_PER_WORD;
   HOST_WIDE_INT val;
@@ -1747,11 +1658,7 @@ constant_subword (op, offset, mode)
  */
 
 rtx
-operand_subword (op, offset, validate_address, mode)
-     rtx op;
-     unsigned int offset;
-     int validate_address;
-     enum machine_mode mode;
+operand_subword (rtx op, unsigned int offset, int validate_address, enum machine_mode mode)
 {
   if (mode == VOIDmode)
     mode = GET_MODE (op);
@@ -1797,10 +1704,7 @@ operand_subword (op, offset, validate_address, mode)
    MODE is the mode of OP, in case it is CONST_INT.  */
 
 rtx
-operand_subword_force (op, offset, mode)
-     rtx op;
-     unsigned int offset;
-     enum machine_mode mode;
+operand_subword_force (rtx op, unsigned int offset, enum machine_mode mode)
 {
   rtx result = operand_subword (op, offset, 1, mode);
 
@@ -1828,8 +1732,7 @@ operand_subword_force (op, offset, mode)
    A test instruction is changed into a compare of 0 against the operand.  */
 
 void
-reverse_comparison (insn)
-     rtx insn;
+reverse_comparison (rtx insn)
 {
   rtx body = PATTERN (insn);
   rtx comp;
@@ -1862,8 +1765,7 @@ reverse_comparison (insn)
    a NULL expression.  */
 
 static tree
-component_ref_for_mem_expr (ref)
-     tree ref;
+component_ref_for_mem_expr (tree ref)
 {
   tree inner = TREE_OPERAND (ref, 0);
 
@@ -1902,11 +1804,8 @@ component_ref_for_mem_expr (ref)
    there is an offset outstanding on T that will be applied later.  */
 
 void
-set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
-     rtx ref;
-     tree t;
-     int objectp;
-     HOST_WIDE_INT bitpos;
+set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
+                                HOST_WIDE_INT bitpos)
 {
   HOST_WIDE_INT alias = MEM_ALIAS_SET (ref);
   tree expr = MEM_EXPR (ref);
@@ -2016,11 +1915,14 @@ set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
       else if (TREE_CODE (t) == ARRAY_REF)
        {
          tree off_tree = size_zero_node;
+         /* We can't modify t, because we use it at the end of the
+            function.  */
+         tree t2 = t;
 
          do
            {
-             tree index = TREE_OPERAND (t, 1);
-             tree array = TREE_OPERAND (t, 0);
+             tree index = TREE_OPERAND (t2, 1);
+             tree array = TREE_OPERAND (t2, 0);
              tree domain = TYPE_DOMAIN (TREE_TYPE (array));
              tree low_bound = (domain ? TYPE_MIN_VALUE (domain) : 0);
              tree unit_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (array)));
@@ -2037,7 +1939,7 @@ set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
                 WITH_RECORD_EXPR; if the component size is, pass our
                 component to one.  */
              if (CONTAINS_PLACEHOLDER_P (index))
-               index = build (WITH_RECORD_EXPR, TREE_TYPE (index), index, t);
+               index = build (WITH_RECORD_EXPR, TREE_TYPE (index), index, t2);
              if (CONTAINS_PLACEHOLDER_P (unit_size))
                unit_size = build (WITH_RECORD_EXPR, sizetype,
                                   unit_size, array);
@@ -2048,28 +1950,28 @@ set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
                                            index,
                                            unit_size)),
                               off_tree));
-             t = TREE_OPERAND (t, 0);
+             t2 = TREE_OPERAND (t2, 0);
            }
-         while (TREE_CODE (t) == ARRAY_REF);
+         while (TREE_CODE (t2) == ARRAY_REF);
 
-         if (DECL_P (t))
+         if (DECL_P (t2))
            {
-             expr = t;
+             expr = t2;
              offset = NULL;
              if (host_integerp (off_tree, 1))
                {
                  HOST_WIDE_INT ioff = tree_low_cst (off_tree, 1);
                  HOST_WIDE_INT aoff = (ioff & -ioff) * BITS_PER_UNIT;
-                 align = DECL_ALIGN (t);
+                 align = DECL_ALIGN (t2);
                  if (aoff && (unsigned HOST_WIDE_INT) aoff < align)
                    align = aoff;
                  offset = GEN_INT (ioff);
                  apply_bitpos = bitpos;
                }
            }
-         else if (TREE_CODE (t) == COMPONENT_REF)
+         else if (TREE_CODE (t2) == COMPONENT_REF)
            {
-             expr = component_ref_for_mem_expr (t);
+             expr = component_ref_for_mem_expr (t2);
              if (host_integerp (off_tree, 1))
                {
                  offset = GEN_INT (tree_low_cst (off_tree, 1));
@@ -2079,10 +1981,10 @@ set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
                 the size we got from the type?  */
            }
          else if (flag_argument_noalias > 1
-                  && TREE_CODE (t) == INDIRECT_REF
-                  && TREE_CODE (TREE_OPERAND (t, 0)) == PARM_DECL)
+                  && TREE_CODE (t2) == INDIRECT_REF
+                  && TREE_CODE (TREE_OPERAND (t2, 0)) == PARM_DECL)
            {
-             expr = t;
+             expr = t2;
              offset = NULL;
            }
        }
@@ -2125,10 +2027,7 @@ set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
 }
 
 void
-set_mem_attributes (ref, t, objectp)
-     rtx ref;
-     tree t;
-     int objectp;
+set_mem_attributes (rtx ref, tree t, int objectp)
 {
   set_mem_attributes_minus_bitpos (ref, t, objectp, 0);
 }
@@ -2136,9 +2035,7 @@ set_mem_attributes (ref, t, objectp)
 /* Set the decl for MEM to DECL.  */
 
 void
-set_mem_attrs_from_reg (mem, reg)
-     rtx mem;
-     rtx reg;
+set_mem_attrs_from_reg (rtx mem, rtx reg)
 {
   MEM_ATTRS (mem)
     = get_mem_attrs (MEM_ALIAS_SET (mem), REG_EXPR (reg),
@@ -2149,9 +2046,7 @@ set_mem_attrs_from_reg (mem, reg)
 /* Set the alias set of MEM to SET.  */
 
 void
-set_mem_alias_set (mem, set)
-     rtx mem;
-     HOST_WIDE_INT set;
+set_mem_alias_set (rtx mem, HOST_WIDE_INT set)
 {
 #ifdef ENABLE_CHECKING
   /* If the new and old alias sets don't conflict, something is wrong.  */
@@ -2167,9 +2062,7 @@ set_mem_alias_set (mem, set)
 /* Set the alignment of MEM to ALIGN bits.  */
 
 void
-set_mem_align (mem, align)
-     rtx mem;
-     unsigned int align;
+set_mem_align (rtx mem, unsigned int align)
 {
   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
                                   MEM_OFFSET (mem), MEM_SIZE (mem), align,
@@ -2179,9 +2072,7 @@ set_mem_align (mem, align)
 /* Set the expr for MEM to EXPR.  */
 
 void
-set_mem_expr (mem, expr)
-     rtx mem;
-     tree expr;
+set_mem_expr (rtx mem, tree expr)
 {
   MEM_ATTRS (mem)
     = get_mem_attrs (MEM_ALIAS_SET (mem), expr, MEM_OFFSET (mem),
@@ -2191,8 +2082,7 @@ set_mem_expr (mem, expr)
 /* Set the offset of MEM to OFFSET.  */
 
 void
-set_mem_offset (mem, offset)
-     rtx mem, offset;
+set_mem_offset (rtx mem, rtx offset)
 {
   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
                                   offset, MEM_SIZE (mem), MEM_ALIGN (mem),
@@ -2202,8 +2092,7 @@ set_mem_offset (mem, offset)
 /* Set the size of MEM to SIZE.  */
 
 void
-set_mem_size (mem, size)
-     rtx mem, size;
+set_mem_size (rtx mem, rtx size)
 {
   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
                                   MEM_OFFSET (mem), size, MEM_ALIGN (mem),
@@ -2217,11 +2106,7 @@ set_mem_size (mem, size)
    attributes are not changed.  */
 
 static rtx
-change_address_1 (memref, mode, addr, validate)
-     rtx memref;
-     enum machine_mode mode;
-     rtx addr;
-     int validate;
+change_address_1 (rtx memref, enum machine_mode mode, rtx addr, int validate)
 {
   rtx new;
 
@@ -2255,10 +2140,7 @@ change_address_1 (memref, mode, addr, validate)
    way we are changing MEMREF, so we only preserve the alias set.  */
 
 rtx
-change_address (memref, mode, addr)
-     rtx memref;
-     enum machine_mode mode;
-     rtx addr;
+change_address (rtx memref, enum machine_mode mode, rtx addr)
 {
   rtx new = change_address_1 (memref, mode, addr, 1);
   enum machine_mode mmode = GET_MODE (new);
@@ -2280,11 +2162,8 @@ change_address (memref, mode, addr)
    and caller is responsible for adjusting MEMREF base register.  */
 
 rtx
-adjust_address_1 (memref, mode, offset, validate, adjust)
-     rtx memref;
-     enum machine_mode mode;
-     HOST_WIDE_INT offset;
-     int validate, adjust;
+adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
+                 int validate, int adjust)
 {
   rtx addr = XEXP (memref, 0);
   rtx new;
@@ -2346,12 +2225,8 @@ adjust_address_1 (memref, mode, offset, validate, adjust)
    nonzero, the memory address is forced to be valid.  */
 
 rtx
-adjust_automodify_address_1 (memref, mode, addr, offset, validate)
-     rtx memref;
-     enum machine_mode mode;
-     rtx addr;
-     HOST_WIDE_INT offset;
-     int validate;
+adjust_automodify_address_1 (rtx memref, enum machine_mode mode, rtx addr,
+                            HOST_WIDE_INT offset, int validate)
 {
   memref = change_address_1 (memref, VOIDmode, addr, validate);
   return adjust_address_1 (memref, mode, offset, validate, 0);
@@ -2362,17 +2237,14 @@ adjust_automodify_address_1 (memref, mode, addr, offset, validate)
    known to be in OFFSET (possibly 1).  */
 
 rtx
-offset_address (memref, offset, pow2)
-     rtx memref;
-     rtx offset;
-     unsigned HOST_WIDE_INT pow2;
+offset_address (rtx memref, rtx offset, unsigned HOST_WIDE_INT pow2)
 {
   rtx new, addr = XEXP (memref, 0);
 
   new = simplify_gen_binary (PLUS, Pmode, addr, offset);
 
   /* At this point we don't know _why_ the address is invalid.  It
-     could have secondary memory refereces, multiplies or anything.
+     could have secondary memory references, multiplies or anything.
 
      However, if we did go and rearrange things, we can wind up not
      being able to recognize the magic around pic_offset_table_rtx.
@@ -2404,9 +2276,7 @@ offset_address (memref, offset, pow2)
    by putting something into a register.  */
 
 rtx
-replace_equiv_address (memref, addr)
-     rtx memref;
-     rtx addr;
+replace_equiv_address (rtx memref, rtx addr)
 {
   /* change_address_1 copies the memory attribute structure without change
      and that's exactly what we want here.  */
@@ -2417,9 +2287,7 @@ replace_equiv_address (memref, addr)
 /* Likewise, but the reference is not required to be valid.  */
 
 rtx
-replace_equiv_address_nv (memref, addr)
-     rtx memref;
-     rtx addr;
+replace_equiv_address_nv (rtx memref, rtx addr)
 {
   return change_address_1 (memref, VOIDmode, addr, 0);
 }
@@ -2430,10 +2298,7 @@ replace_equiv_address_nv (memref, addr)
    operations plus masking logic.  */
 
 rtx
-widen_memory_access (memref, mode, offset)
-     rtx memref;
-     enum machine_mode mode;
-     HOST_WIDE_INT offset;
+widen_memory_access (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset)
 {
   rtx new = adjust_address_1 (memref, mode, offset, 1, 1);
   tree expr = MEM_EXPR (new);
@@ -2507,10 +2372,10 @@ widen_memory_access (memref, mode, offset)
 /* Return a newly created CODE_LABEL rtx with a unique label number.  */
 
 rtx
-gen_label_rtx ()
+gen_label_rtx (void)
 {
   return gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX, NULL_RTX,
-                            NULL, label_num++, NULL);
+                            NULL, label_num++, NULL);
 }
 \f
 /* For procedure integration.  */
@@ -2520,8 +2385,7 @@ gen_label_rtx ()
    Used for an inline-procedure after copying the insn chain.  */
 
 void
-set_new_first_and_last_insn (first, last)
-     rtx first, last;
+set_new_first_and_last_insn (rtx first, rtx last)
 {
   rtx insn;
 
@@ -2539,8 +2403,7 @@ set_new_first_and_last_insn (first, last)
    This is used when belatedly compiling an inline function.  */
 
 void
-set_new_first_and_last_label_num (first, last)
-     int first, last;
+set_new_first_and_last_label_num (int first, int last)
 {
   base_label_num = label_num;
   first_label_num = first;
@@ -2551,8 +2414,7 @@ set_new_first_and_last_label_num (first, last)
    This is used when belatedly compiling an inline function.  */
 
 void
-set_new_last_label_num (last)
-     int last;
+set_new_last_label_num (int last)
 {
   base_label_num = label_num;
   last_label_num = last;
@@ -2562,8 +2424,7 @@ set_new_last_label_num (last)
    This is used after a nested function.  */
 
 void
-restore_emit_status (p)
-     struct function *p ATTRIBUTE_UNUSED;
+restore_emit_status (struct function *p ATTRIBUTE_UNUSED)
 {
   last_label_num = 0;
 }
@@ -2572,9 +2433,7 @@ restore_emit_status (p)
    structure.  This routine should only be called once.  */
 
 void
-unshare_all_rtl (fndecl, insn)
-     tree fndecl;
-     rtx insn;
+unshare_all_rtl (tree fndecl, rtx insn)
 {
   tree decl;
 
@@ -2603,8 +2462,7 @@ unshare_all_rtl (fndecl, insn)
    should be done sparingly.  */
 
 void
-unshare_all_rtl_again (insn)
-     rtx insn;
+unshare_all_rtl_again (rtx insn)
 {
   rtx p;
   tree decl;
@@ -2633,8 +2491,7 @@ unshare_all_rtl_again (insn)
    Assumes the mark bits are cleared at entry.  */
 
 static void
-unshare_all_rtl_1 (insn)
-     rtx insn;
+unshare_all_rtl_1 (rtx insn)
 {
   for (; insn; insn = NEXT_INSN (insn))
     if (INSN_P (insn))
@@ -2648,8 +2505,7 @@ unshare_all_rtl_1 (insn)
 /* Go through all virtual stack slots of a function and copy any
    shared structure.  */
 static void
-unshare_all_decls (blk)
-     tree blk;
+unshare_all_decls (tree blk)
 {
   tree t;
 
@@ -2666,8 +2522,7 @@ unshare_all_decls (blk)
 /* Go through all virtual stack slots of a function and mark them as
    not shared.  */
 static void
-reset_used_decls (blk)
-     tree blk;
+reset_used_decls (tree blk)
 {
   tree t;
 
@@ -2686,9 +2541,7 @@ reset_used_decls (blk)
    either a MEM of an EXPR_LIST of MEMs.  */
 
 rtx
-copy_most_rtx (orig, may_share)
-     rtx orig;
-     rtx may_share;
+copy_most_rtx (rtx orig, rtx may_share)
 {
   rtx copy;
   int i, j;
@@ -2788,8 +2641,7 @@ copy_most_rtx (orig, may_share)
    Recursively does the same for subexpressions.  */
 
 rtx
-copy_rtx_if_shared (orig)
-     rtx orig;
+copy_rtx_if_shared (rtx orig)
 {
   rtx x = orig;
   int i;
@@ -2906,8 +2758,7 @@ copy_rtx_if_shared (orig)
    to look for shared sub-parts.  */
 
 void
-reset_used_flags (x)
-     rtx x;
+reset_used_flags (rtx x)
 {
   int i, j;
   enum rtx_code code;
@@ -2971,8 +2822,7 @@ reset_used_flags (x)
    OTHER must be valid as a SET_DEST.  */
 
 rtx
-make_safe_from (x, other)
-     rtx x, other;
+make_safe_from (rtx x, rtx other)
 {
   while (1)
     switch (GET_CODE (other))
@@ -3009,7 +2859,7 @@ make_safe_from (x, other)
 /* Return the first insn of the current sequence or current function.  */
 
 rtx
-get_insns ()
+get_insns (void)
 {
   return first_insn;
 }
@@ -3017,8 +2867,7 @@ get_insns ()
 /* Specify a new insn as the first in the chain.  */
 
 void
-set_first_insn (insn)
-     rtx insn;
+set_first_insn (rtx insn)
 {
   if (PREV_INSN (insn) != 0)
     abort ();
@@ -3028,7 +2877,7 @@ set_first_insn (insn)
 /* Return the last insn emitted in current sequence or current function.  */
 
 rtx
-get_last_insn ()
+get_last_insn (void)
 {
   return last_insn;
 }
@@ -3036,8 +2885,7 @@ get_last_insn ()
 /* Specify a new insn as the last in the chain.  */
 
 void
-set_last_insn (insn)
-     rtx insn;
+set_last_insn (rtx insn)
 {
   if (NEXT_INSN (insn) != 0)
     abort ();
@@ -3047,7 +2895,7 @@ set_last_insn (insn)
 /* Return the last insn emitted, even if it is in a sequence now pushed.  */
 
 rtx
-get_last_insn_anywhere ()
+get_last_insn_anywhere (void)
 {
   struct sequence_stack *stack;
   if (last_insn)
@@ -3062,7 +2910,7 @@ get_last_insn_anywhere ()
    function.  This routine looks inside SEQUENCEs.  */
 
 rtx
-get_first_nonnote_insn ()
+get_first_nonnote_insn (void)
 {
   rtx insn = first_insn;
 
@@ -3080,7 +2928,7 @@ get_first_nonnote_insn ()
    function.  This routine looks inside SEQUENCEs.  */
 
 rtx
-get_last_nonnote_insn ()
+get_last_nonnote_insn (void)
 {
   rtx insn = last_insn;
 
@@ -3097,7 +2945,7 @@ get_last_nonnote_insn ()
 /* Return a number larger than any instruction's uid in this function.  */
 
 int
-get_max_uid ()
+get_max_uid (void)
 {
   return cur_insn_uid;
 }
@@ -3105,8 +2953,7 @@ get_max_uid ()
 /* Renumber instructions so that no instruction UIDs are wasted.  */
 
 void
-renumber_insns (stream)
-     FILE *stream;
+renumber_insns (FILE *stream)
 {
   rtx insn;
 
@@ -3134,8 +2981,7 @@ renumber_insns (stream)
    of the sequence.  */
 
 rtx
-next_insn (insn)
-     rtx insn;
+next_insn (rtx insn)
 {
   if (insn)
     {
@@ -3152,8 +2998,7 @@ next_insn (insn)
    of the sequence.  */
 
 rtx
-previous_insn (insn)
-     rtx insn;
+previous_insn (rtx insn)
 {
   if (insn)
     {
@@ -3170,8 +3015,7 @@ previous_insn (insn)
    look inside SEQUENCEs.  */
 
 rtx
-next_nonnote_insn (insn)
-     rtx insn;
+next_nonnote_insn (rtx insn)
 {
   while (insn)
     {
@@ -3187,8 +3031,7 @@ next_nonnote_insn (insn)
    not look inside SEQUENCEs.  */
 
 rtx
-prev_nonnote_insn (insn)
-     rtx insn;
+prev_nonnote_insn (rtx insn)
 {
   while (insn)
     {
@@ -3205,8 +3048,7 @@ prev_nonnote_insn (insn)
    SEQUENCEs.  */
 
 rtx
-next_real_insn (insn)
-     rtx insn;
+next_real_insn (rtx insn)
 {
   while (insn)
     {
@@ -3224,8 +3066,7 @@ next_real_insn (insn)
    SEQUENCEs.  */
 
 rtx
-prev_real_insn (insn)
-     rtx insn;
+prev_real_insn (rtx insn)
 {
   while (insn)
     {
@@ -3242,7 +3083,7 @@ prev_real_insn (insn)
    This routine does not look inside SEQUENCEs.  */
 
 rtx
-last_call_insn ()
+last_call_insn (void)
 {
   rtx insn;
 
@@ -3259,8 +3100,7 @@ last_call_insn ()
    same as next_real_insn.  */
 
 int
-active_insn_p (insn)
-     rtx insn;
+active_insn_p (rtx insn)
 {
   return (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
          || (GET_CODE (insn) == INSN
@@ -3270,8 +3110,7 @@ active_insn_p (insn)
 }
 
 rtx
-next_active_insn (insn)
-     rtx insn;
+next_active_insn (rtx insn)
 {
   while (insn)
     {
@@ -3288,8 +3127,7 @@ next_active_insn (insn)
    same as prev_real_insn.  */
 
 rtx
-prev_active_insn (insn)
-     rtx insn;
+prev_active_insn (rtx insn)
 {
   while (insn)
     {
@@ -3304,8 +3142,7 @@ prev_active_insn (insn)
 /* Return the next CODE_LABEL after the insn INSN, or 0 if there is none.  */
 
 rtx
-next_label (insn)
-     rtx insn;
+next_label (rtx insn)
 {
   while (insn)
     {
@@ -3320,8 +3157,7 @@ next_label (insn)
 /* Return the last CODE_LABEL before the insn INSN, or 0 if there is none.  */
 
 rtx
-prev_label (insn)
-     rtx insn;
+prev_label (rtx insn)
 {
   while (insn)
     {
@@ -3338,8 +3174,7 @@ prev_label (insn)
    and REG_CC_USER notes so we can find it.  */
 
 void
-link_cc0_insns (insn)
-     rtx insn;
+link_cc0_insns (rtx insn)
 {
   rtx user = next_nonnote_insn (insn);
 
@@ -3361,8 +3196,7 @@ link_cc0_insns (insn)
    Return 0 if we can't find the insn.  */
 
 rtx
-next_cc0_user (insn)
-     rtx insn;
+next_cc0_user (rtx insn)
 {
   rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
 
@@ -3383,8 +3217,7 @@ next_cc0_user (insn)
    note, it is the previous insn.  */
 
 rtx
-prev_cc0_setter (insn)
-     rtx insn;
+prev_cc0_setter (rtx insn)
 {
   rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
 
@@ -3402,8 +3235,7 @@ prev_cc0_setter (insn)
 /* Increment the label uses for all labels present in rtx.  */
 
 static void
-mark_label_nuses (x)
-     rtx x;
+mark_label_nuses (rtx x)
 {
   enum rtx_code code;
   int i, j;
@@ -3435,9 +3267,7 @@ mark_label_nuses (x)
    returns TRIAL.  If the insn to be returned can be split, it will be.  */
 
 rtx
-try_split (pat, trial, last)
-     rtx pat, trial;
-     int last;
+try_split (rtx pat, rtx trial, int last)
 {
   rtx before = PREV_INSN (trial);
   rtx after = NEXT_INSN (trial);
@@ -3513,8 +3343,10 @@ try_split (pat, trial, last)
       for (insn = insn_last; insn ; insn = PREV_INSN (insn))
        if (GET_CODE (insn) == CALL_INSN)
          {
-           CALL_INSN_FUNCTION_USAGE (insn)
-             = CALL_INSN_FUNCTION_USAGE (trial);
+           rtx *p = &CALL_INSN_FUNCTION_USAGE (insn);
+           while (*p)
+             p = &XEXP (*p, 1);
+           *p = CALL_INSN_FUNCTION_USAGE (trial);
            SIBLING_CALL_P (insn) = SIBLING_CALL_P (trial);
          }
     }
@@ -3612,8 +3444,7 @@ try_split (pat, trial, last)
    Store PATTERN in the pattern slots.  */
 
 rtx
-make_insn_raw (pattern)
-     rtx pattern;
+make_insn_raw (rtx pattern)
 {
   rtx insn;
 
@@ -3645,8 +3476,7 @@ make_insn_raw (pattern)
 /* Like `make_insn_raw' but make a JUMP_INSN instead of an insn.  */
 
 static rtx
-make_jump_insn_raw (pattern)
-     rtx pattern;
+make_jump_insn_raw (rtx pattern)
 {
   rtx insn;
 
@@ -3667,8 +3497,7 @@ make_jump_insn_raw (pattern)
 /* Like `make_insn_raw' but make a CALL_INSN instead of an insn.  */
 
 static rtx
-make_call_insn_raw (pattern)
-     rtx pattern;
+make_call_insn_raw (rtx pattern)
 {
   rtx insn;
 
@@ -3690,8 +3519,7 @@ make_call_insn_raw (pattern)
    INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE.  */
 
 void
-add_insn (insn)
-     rtx insn;
+add_insn (rtx insn)
 {
   PREV_INSN (insn) = last_insn;
   NEXT_INSN (insn) = 0;
@@ -3711,8 +3539,7 @@ add_insn (insn)
    SEQUENCE.  */
 
 void
-add_insn_after (insn, after)
-     rtx insn, after;
+add_insn_after (rtx insn, rtx after)
 {
   rtx next = NEXT_INSN (after);
   basic_block bb;
@@ -3777,8 +3604,7 @@ add_insn_after (insn, after)
    SEQUENCE.  */
 
 void
-add_insn_before (insn, before)
-     rtx insn, before;
+add_insn_before (rtx insn, rtx before)
 {
   rtx prev = PREV_INSN (before);
   basic_block bb;
@@ -3840,8 +3666,7 @@ add_insn_before (insn, before)
 /* Remove an insn from its doubly-linked list.  This function knows how
    to handle sequences.  */
 void
-remove_insn (insn)
-     rtx insn;
+remove_insn (rtx insn)
 {
   rtx next = NEXT_INSN (insn);
   rtx prev = PREV_INSN (insn);
@@ -3916,8 +3741,7 @@ remove_insn (insn)
 /* Append CALL_FUSAGE to the CALL_INSN_FUNCTION_USAGE for CALL_INSN.  */
 
 void
-add_function_usage_to (call_insn, call_fusage)
-     rtx call_insn, call_fusage;
+add_function_usage_to (rtx call_insn, rtx call_fusage)
 {
   if (! call_insn || GET_CODE (call_insn) != CALL_INSN)
     abort ();
@@ -3942,8 +3766,7 @@ add_function_usage_to (call_insn, call_fusage)
    FROM becomes the new last instruction.  */
 
 void
-delete_insns_since (from)
-     rtx from;
+delete_insns_since (rtx from)
 {
   if (from == 0)
     first_insn = 0;
@@ -3963,8 +3786,7 @@ delete_insns_since (from)
    called after delay-slot filling has been done.  */
 
 void
-reorder_insns_nobb (from, to, after)
-     rtx from, to, after;
+reorder_insns_nobb (rtx from, rtx to, rtx after)
 {
   /* Splice this bunch out of where it is now.  */
   if (PREV_INSN (from))
@@ -3989,8 +3811,7 @@ reorder_insns_nobb (from, to, after)
 
 /* Same as function above, but take care to update BB boundaries.  */
 void
-reorder_insns (from, to, after)
-     rtx from, to, after;
+reorder_insns (rtx from, rtx to, rtx after)
 {
   rtx prev = PREV_INSN (from);
   basic_block bb, bb2;
@@ -4022,8 +3843,7 @@ reorder_insns (from, to, after)
 /* Return the line note insn preceding INSN.  */
 
 static rtx
-find_line_note (insn)
-     rtx insn;
+find_line_note (rtx insn)
 {
   if (no_line_numbers)
     return 0;
@@ -4041,8 +3861,7 @@ find_line_note (insn)
    and FROM, and another one after TO.  */
 
 void
-reorder_insns_with_line_notes (from, to, after)
-     rtx from, to, after;
+reorder_insns_with_line_notes (rtx from, rtx to, rtx after)
 {
   rtx from_line = find_line_note (from);
   rtx after_line = find_line_note (after);
@@ -4053,19 +3872,15 @@ reorder_insns_with_line_notes (from, to, after)
     return;
 
   if (from_line)
-    emit_line_note_after (NOTE_SOURCE_FILE (from_line),
-                         NOTE_LINE_NUMBER (from_line),
-                         after);
+    emit_note_copy_after (from_line, after);
   if (after_line)
-    emit_line_note_after (NOTE_SOURCE_FILE (after_line),
-                         NOTE_LINE_NUMBER (after_line),
-                         to);
+    emit_note_copy_after (after_line, to);
 }
 
 /* Remove unnecessary notes from the instruction stream.  */
 
 void
-remove_unnecessary_notes ()
+remove_unnecessary_notes (void)
 {
   rtx block_stack = NULL_RTX;
   rtx eh_stack = NULL_RTX;
@@ -4203,8 +4018,7 @@ remove_unnecessary_notes ()
 /* Make X be output before the instruction BEFORE.  */
 
 rtx
-emit_insn_before (x, before)
-     rtx x, before;
+emit_insn_before (rtx x, rtx before)
 {
   rtx last = before;
   rtx insn;
@@ -4254,8 +4068,7 @@ emit_insn_before (x, before)
    and output it before the instruction BEFORE.  */
 
 rtx
-emit_jump_insn_before (x, before)
-     rtx x, before;
+emit_jump_insn_before (rtx x, rtx before)
 {
   rtx insn, last = NULL_RTX;
 
@@ -4301,8 +4114,7 @@ emit_jump_insn_before (x, before)
    and output it before the instruction BEFORE.  */
 
 rtx
-emit_call_insn_before (x, before)
-     rtx x, before;
+emit_call_insn_before (rtx x, rtx before)
 {
   rtx last = NULL_RTX, insn;
 
@@ -4348,8 +4160,7 @@ emit_call_insn_before (x, before)
    and output it before the insn BEFORE.  */
 
 rtx
-emit_barrier_before (before)
-     rtx before;
+emit_barrier_before (rtx before)
 {
   rtx insn = rtx_alloc (BARRIER);
 
@@ -4362,8 +4173,7 @@ emit_barrier_before (before)
 /* Emit the label LABEL before the insn BEFORE.  */
 
 rtx
-emit_label_before (label, before)
-     rtx label, before;
+emit_label_before (rtx label, rtx before)
 {
   /* This can be called twice for the same label as a result of the
      confusion that follows a syntax error!  So make it harmless.  */
@@ -4379,9 +4189,7 @@ emit_label_before (label, before)
 /* Emit a note of subtype SUBTYPE before the insn BEFORE.  */
 
 rtx
-emit_note_before (subtype, before)
-     int subtype;
-     rtx before;
+emit_note_before (int subtype, rtx before)
 {
   rtx note = rtx_alloc (NOTE);
   INSN_UID (note) = cur_insn_uid++;
@@ -4396,11 +4204,10 @@ emit_note_before (subtype, before)
 /* Helper for emit_insn_after, handles lists of instructions
    efficiently.  */
 
-static rtx emit_insn_after_1 PARAMS ((rtx, rtx));
+static rtx emit_insn_after_1 (rtx, rtx);
 
 static rtx
-emit_insn_after_1 (first, after)
-     rtx first, after;
+emit_insn_after_1 (rtx first, rtx after)
 {
   rtx last;
   rtx after_after;
@@ -4438,8 +4245,7 @@ emit_insn_after_1 (first, after)
 /* Make X be output after the insn AFTER.  */
 
 rtx
-emit_insn_after (x, after)
-     rtx x, after;
+emit_insn_after (rtx x, rtx after)
 {
   rtx last = after;
 
@@ -4481,30 +4287,24 @@ emit_insn_after (x, after)
    as to act as if this insn were at FROM.  */
 
 void
-emit_insn_after_with_line_notes (x, after, from)
-     rtx x, after, from;
+emit_insn_after_with_line_notes (rtx x, rtx after, rtx from)
 {
   rtx from_line = find_line_note (from);
   rtx after_line = find_line_note (after);
   rtx insn = emit_insn_after (x, after);
 
   if (from_line)
-    emit_line_note_after (NOTE_SOURCE_FILE (from_line),
-                         NOTE_LINE_NUMBER (from_line),
-                         after);
+    emit_note_copy_after (from_line, after);
 
   if (after_line)
-    emit_line_note_after (NOTE_SOURCE_FILE (after_line),
-                         NOTE_LINE_NUMBER (after_line),
-                         insn);
+    emit_note_copy_after (after_line, insn);
 }
 
 /* Make an insn of code JUMP_INSN with body X
    and output it after the insn AFTER.  */
 
 rtx
-emit_jump_insn_after (x, after)
-     rtx x, after;
+emit_jump_insn_after (rtx x, rtx after)
 {
   rtx last;
 
@@ -4543,8 +4343,7 @@ emit_jump_insn_after (x, after)
    and output it after the instruction AFTER.  */
 
 rtx
-emit_call_insn_after (x, after)
-     rtx x, after;
+emit_call_insn_after (rtx x, rtx after)
 {
   rtx last;
 
@@ -4583,8 +4382,7 @@ emit_call_insn_after (x, after)
    and output it after the insn AFTER.  */
 
 rtx
-emit_barrier_after (after)
-     rtx after;
+emit_barrier_after (rtx after)
 {
   rtx insn = rtx_alloc (BARRIER);
 
@@ -4597,8 +4395,7 @@ emit_barrier_after (after)
 /* Emit the label LABEL after the insn AFTER.  */
 
 rtx
-emit_label_after (label, after)
-     rtx label, after;
+emit_label_after (rtx label, rtx after)
 {
   /* This can be called twice for the same label
      as a result of the confusion that follows a syntax error!
@@ -4615,9 +4412,7 @@ emit_label_after (label, after)
 /* Emit a note of subtype SUBTYPE after the insn AFTER.  */
 
 rtx
-emit_note_after (subtype, after)
-     int subtype;
-     rtx after;
+emit_note_after (int subtype, rtx after)
 {
   rtx note = rtx_alloc (NOTE);
   INSN_UID (note) = cur_insn_uid++;
@@ -4628,17 +4423,14 @@ emit_note_after (subtype, after)
   return note;
 }
 
-/* Emit a line note for FILE and LINE after the insn AFTER.  */
+/* Emit a copy of note ORIG after the insn AFTER.  */
 
 rtx
-emit_line_note_after (file, line, after)
-     const char *file;
-     int line;
-     rtx after;
+emit_note_copy_after (rtx orig, rtx after)
 {
   rtx note;
 
-  if (no_line_numbers && line > 0)
+  if (NOTE_LINE_NUMBER (orig) >= 0 && no_line_numbers)
     {
       cur_insn_uid++;
       return 0;
@@ -4646,8 +4438,8 @@ emit_line_note_after (file, line, after)
 
   note = rtx_alloc (NOTE);
   INSN_UID (note) = cur_insn_uid++;
-  NOTE_SOURCE_FILE (note) = file;
-  NOTE_LINE_NUMBER (note) = line;
+  NOTE_LINE_NUMBER (note) = NOTE_LINE_NUMBER (orig);
+  NOTE_DATA (note) = NOTE_DATA (orig);
   BLOCK_FOR_INSN (note) = NULL;
   add_insn_after (note, after);
   return note;
@@ -4655,9 +4447,7 @@ emit_line_note_after (file, line, after)
 \f
 /* Like emit_insn_after, but set INSN_LOCATOR according to SCOPE.  */
 rtx
-emit_insn_after_setloc (pattern, after, loc)
-     rtx pattern, after;
-     int loc;
+emit_insn_after_setloc (rtx pattern, rtx after, int loc)
 {
   rtx last = emit_insn_after (pattern, after);
 
@@ -4675,9 +4465,7 @@ emit_insn_after_setloc (pattern, after, loc)
 
 /* Like emit_jump_insn_after, but set INSN_LOCATOR according to SCOPE.  */
 rtx
-emit_jump_insn_after_setloc (pattern, after, loc)
-     rtx pattern, after;
-     int loc;
+emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc)
 {
   rtx last = emit_jump_insn_after (pattern, after);
 
@@ -4695,9 +4483,7 @@ emit_jump_insn_after_setloc (pattern, after, loc)
 
 /* Like emit_call_insn_after, but set INSN_LOCATOR according to SCOPE.  */
 rtx
-emit_call_insn_after_setloc (pattern, after, loc)
-     rtx pattern, after;
-     int loc;
+emit_call_insn_after_setloc (rtx pattern, rtx after, int loc)
 {
   rtx last = emit_call_insn_after (pattern, after);
 
@@ -4715,9 +4501,7 @@ emit_call_insn_after_setloc (pattern, after, loc)
 
 /* Like emit_insn_before, but set INSN_LOCATOR according to SCOPE.  */
 rtx
-emit_insn_before_setloc (pattern, before, loc)
-     rtx pattern, before;
-     int loc;
+emit_insn_before_setloc (rtx pattern, rtx before, int loc)
 {
   rtx first = PREV_INSN (before);
   rtx last = emit_insn_before (pattern, before);
@@ -4740,8 +4524,7 @@ emit_insn_before_setloc (pattern, before, loc)
    Returns the last insn emitted.  */
 
 rtx
-emit_insn (x)
-     rtx x;
+emit_insn (rtx x)
 {
   rtx last = last_insn;
   rtx insn;
@@ -4786,8 +4569,7 @@ emit_insn (x)
    and add it to the end of the doubly-linked list.  */
 
 rtx
-emit_jump_insn (x)
-     rtx x;
+emit_jump_insn (rtx x)
 {
   rtx last = NULL_RTX, insn;
 
@@ -4828,8 +4610,7 @@ emit_jump_insn (x)
    and add it to the end of the doubly-linked list.  */
 
 rtx
-emit_call_insn (x)
-     rtx x;
+emit_call_insn (rtx x)
 {
   rtx insn;
 
@@ -4862,8 +4643,7 @@ emit_call_insn (x)
 /* Add the label LABEL to the end of the doubly-linked list.  */
 
 rtx
-emit_label (label)
-     rtx label;
+emit_label (rtx label)
 {
   /* This can be called twice for the same label
      as a result of the confusion that follows a syntax error!
@@ -4880,7 +4660,7 @@ emit_label (label)
    and add it to the end of the doubly-linked list.  */
 
 rtx
-emit_barrier ()
+emit_barrier (void)
 {
   rtx barrier = rtx_alloc (BARRIER);
   INSN_UID (barrier) = cur_insn_uid++;
@@ -4888,90 +4668,90 @@ emit_barrier ()
   return barrier;
 }
 
-/* Make an insn of code NOTE
-   with data-fields specified by FILE and LINE
-   and add it to the end of the doubly-linked list,
-   but only if line-numbers are desired for debugging info.  */
+/* Make line numbering NOTE insn for LOCATION add it to the end
+   of the doubly-linked list, but only if line-numbers are desired for
+   debugging info and it doesn't match the previous one.  */
 
 rtx
-emit_line_note (file, line)
-     const char *file;
-     int line;
+emit_line_note (location_t location)
 {
-  set_file_and_line_for_stmt (file, line);
-
-#if 0
+  rtx note;
+  
+  set_file_and_line_for_stmt (location);
+  
+  if (location.file && last_location.file
+      && !strcmp (location.file, last_location.file)
+      && location.line == last_location.line)
+    return NULL_RTX;
+  last_location = location;
+  
   if (no_line_numbers)
-    return 0;
-#endif
+    {
+      cur_insn_uid++;
+      return NULL_RTX;
+    }
 
-  return emit_note (file, line);
+  note = emit_note (location.line);
+  NOTE_SOURCE_FILE (note) = location.file;
+  
+  return note;
 }
 
-/* Make an insn of code NOTE
-   with data-fields specified by FILE and LINE
-   and add it to the end of the doubly-linked list.
-   If it is a line-number NOTE, omit it if it matches the previous one.  */
+/* Emit a copy of note ORIG.  */
 
 rtx
-emit_note (file, line)
-     const char *file;
-     int line;
+emit_note_copy (rtx orig)
 {
   rtx note;
-
-  if (line > 0)
-    {
-      if (file && last_filename && !strcmp (file, last_filename)
-         && line == last_linenum)
-       return 0;
-      last_filename = file;
-      last_linenum = line;
-    }
-
-  if (no_line_numbers && line > 0)
+  
+  if (NOTE_LINE_NUMBER (orig) >= 0 && no_line_numbers)
     {
       cur_insn_uid++;
-      return 0;
+      return NULL_RTX;
     }
-
+  
   note = rtx_alloc (NOTE);
+  
   INSN_UID (note) = cur_insn_uid++;
-  NOTE_SOURCE_FILE (note) = file;
-  NOTE_LINE_NUMBER (note) = line;
+  NOTE_DATA (note) = NOTE_DATA (orig);
+  NOTE_LINE_NUMBER (note) = NOTE_LINE_NUMBER (orig);
   BLOCK_FOR_INSN (note) = NULL;
   add_insn (note);
+  
   return note;
 }
 
-/* Emit a NOTE, and don't omit it even if LINE is the previous note.  */
+/* Make an insn of code NOTE or type NOTE_NO
+   and add it to the end of the doubly-linked list.  */
 
 rtx
-emit_line_note_force (file, line)
-     const char *file;
-     int line;
+emit_note (int note_no)
 {
-  last_linenum = -1;
-  return emit_line_note (file, line);
+  rtx note;
+
+  note = rtx_alloc (NOTE);
+  INSN_UID (note) = cur_insn_uid++;
+  NOTE_LINE_NUMBER (note) = note_no;
+  memset (&NOTE_DATA (note), 0, sizeof (NOTE_DATA (note)));
+  BLOCK_FOR_INSN (note) = NULL;
+  add_insn (note);
+  return note;
 }
 
 /* Cause next statement to emit a line note even if the line number
-   has not changed.  This is used at the beginning of a function.  */
+   has not changed.  */
 
 void
-force_next_line_note ()
+force_next_line_note (void)
 {
-  last_linenum = -1;
+  last_location.line = -1;
 }
 
 /* Place a note of KIND on insn INSN with DATUM as the datum. If a
    note of this type already exists, remove it first.  */
 
 rtx
-set_unique_reg_note (insn, kind, datum)
-     rtx insn;
-     enum reg_note kind;
-     rtx datum;
+set_unique_reg_note (rtx insn, enum reg_note kind, rtx datum)
 {
   rtx note = find_reg_note (insn, kind, NULL_RTX);
 
@@ -5014,8 +4794,7 @@ set_unique_reg_note (insn, kind, datum)
    The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN.  */
 
 enum rtx_code
-classify_insn (x)
-     rtx x;
+classify_insn (rtx x)
 {
   if (GET_CODE (x) == CODE_LABEL)
     return CODE_LABEL;
@@ -5052,8 +4831,7 @@ classify_insn (x)
    If X is a label, it is simply added into the insn chain.  */
 
 rtx
-emit (x)
-     rtx x;
+emit (rtx x)
 {
   enum rtx_code code = classify_insn (x);
 
@@ -5086,7 +4864,7 @@ static GTY ((deletable (""))) struct sequence_stack *free_sequence_stack;
    emitted in the middle of this sequence.  */
 
 void
-start_sequence ()
+start_sequence (void)
 {
   struct sequence_stack *tem;
 
@@ -5096,7 +4874,7 @@ start_sequence ()
       free_sequence_stack = tem->next;
     }
   else
-    tem = (struct sequence_stack *) ggc_alloc (sizeof (struct sequence_stack));
+    tem = ggc_alloc (sizeof (struct sequence_stack));
 
   tem->next = seq_stack;
   tem->first = first_insn;
@@ -5114,8 +4892,7 @@ start_sequence ()
    information about how to use this function.  */
 
 void
-start_sequence_for_rtl_expr (t)
-     tree t;
+start_sequence_for_rtl_expr (tree t)
 {
   start_sequence ();
 
@@ -5127,8 +4904,7 @@ start_sequence_for_rtl_expr (t)
    start_sequence for more information about how to use this function.  */
 
 void
-push_to_sequence (first)
-     rtx first;
+push_to_sequence (rtx first)
 {
   rtx last;
 
@@ -5143,8 +4919,7 @@ push_to_sequence (first)
 /* Set up the insn chain from a chain stort in FIRST to LAST.  */
 
 void
-push_to_full_sequence (first, last)
-     rtx first, last;
+push_to_full_sequence (rtx first, rtx last)
 {
   start_sequence ();
   first_insn = first;
@@ -5158,7 +4933,7 @@ push_to_full_sequence (first, last)
    as the current sequence, saving the previously current one.  */
 
 void
-push_topmost_sequence ()
+push_topmost_sequence (void)
 {
   struct sequence_stack *stack, *top = NULL;
 
@@ -5176,7 +4951,7 @@ push_topmost_sequence ()
    insn chain, and restore the previous saved state.  */
 
 void
-pop_topmost_sequence ()
+pop_topmost_sequence (void)
 {
   struct sequence_stack *stack, *top = NULL;
 
@@ -5204,7 +4979,7 @@ pop_topmost_sequence ()
    information about deferred popping of arguments.  */
 
 void
-end_sequence ()
+end_sequence (void)
 {
   struct sequence_stack *tem = seq_stack;
 
@@ -5222,8 +4997,7 @@ end_sequence ()
    and LAST.  */
 
 void
-end_full_sequence (first, last)
-     rtx *first, *last;
+end_full_sequence (rtx *first, rtx *last)
 {
   *first = first_insn;
   *last = last_insn;
@@ -5233,7 +5007,7 @@ end_full_sequence (first, last)
 /* Return 1 if currently emitting into a sequence.  */
 
 int
-in_sequence_p ()
+in_sequence_p (void)
 {
   return seq_stack != 0;
 }
@@ -5241,8 +5015,7 @@ in_sequence_p ()
 /* Put the various virtual registers into REGNO_REG_RTX.  */
 
 void
-init_virtual_regs (es)
-     struct emit_status *es;
+init_virtual_regs (struct emit_status *es)
 {
   rtx *ptr = es->x_regno_reg_rtx;
   ptr[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
@@ -5281,8 +5054,7 @@ static rtvec copy_asm_constraints_vector;
    SCRATCHes.  */
 
 rtx
-copy_insn_1 (orig)
-     rtx orig;
+copy_insn_1 (rtx orig)
 {
   rtx copy;
   int i, j;
@@ -5415,8 +5187,7 @@ copy_insn_1 (orig)
    INSN doesn't really have to be a full INSN; it could be just the
    pattern.  */
 rtx
-copy_insn (insn)
-     rtx insn;
+copy_insn (rtx insn)
 {
   copy_insn_n_scratches = 0;
   orig_asm_operands_vector = 0;
@@ -5430,18 +5201,18 @@ copy_insn (insn)
    before generating rtl for each function.  */
 
 void
-init_emit ()
+init_emit (void)
 {
   struct function *f = cfun;
 
-  f->emit = (struct emit_status *) ggc_alloc (sizeof (struct emit_status));
+  f->emit = ggc_alloc (sizeof (struct emit_status));
   first_insn = NULL;
   last_insn = NULL;
   seq_rtl_expr = NULL;
   cur_insn_uid = 1;
   reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
-  last_linenum = 0;
-  last_filename = 0;
+  last_location.line = 0;
+  last_location.file = 0;
   first_label_num = label_num;
   last_label_num = 0;
   seq_stack = NULL;
@@ -5451,11 +5222,11 @@ init_emit ()
   f->emit->regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
 
   f->emit->regno_pointer_align
-    = (unsigned char *) ggc_alloc_cleared (f->emit->regno_pointer_align_length
-                                          * sizeof (unsigned char));
+    = ggc_alloc_cleared (f->emit->regno_pointer_align_length
+                        * sizeof (unsigned char));
 
   regno_reg_rtx
-    = (rtx *) ggc_alloc (f->emit->regno_pointer_align_length * sizeof (rtx));
+    = ggc_alloc (f->emit->regno_pointer_align_length * sizeof (rtx));
 
   /* Put copies of all the hard registers into regno_reg_rtx.  */
   memcpy (regno_reg_rtx,
@@ -5499,8 +5270,7 @@ init_emit ()
 /* Generate the constant 0.  */
 
 static rtx
-gen_const_vector_0 (mode)
-     enum machine_mode mode;
+gen_const_vector_0 (enum machine_mode mode)
 {
   rtx tem;
   rtvec v;
@@ -5526,9 +5296,7 @@ gen_const_vector_0 (mode)
 /* Generate a vector like gen_rtx_raw_CONST_VEC, but use the zero vector when
    all elements are zero.  */
 rtx
-gen_rtx_CONST_VECTOR (mode, v)
-     enum machine_mode mode;
-     rtvec v;
+gen_rtx_CONST_VECTOR (enum machine_mode mode, rtvec v)
 {
   rtx inner_zero = CONST0_RTX (GET_MODE_INNER (mode));
   int i;
@@ -5543,13 +5311,15 @@ gen_rtx_CONST_VECTOR (mode, v)
    LINE_NUMBERS is nonzero if line numbers are to be generated.  */
 
 void
-init_emit_once (line_numbers)
-     int line_numbers;
+init_emit_once (int line_numbers)
 {
   int i;
   enum machine_mode mode;
   enum machine_mode double_mode;
 
+  /* We need reg_raw_mode, so initialize the modes now.  */
+  init_reg_modes_once ();
+
   /* Initialize the CONST_INT, CONST_DOUBLE, and memory attribute hash
      tables.  */
   const_int_htab = htab_create_ggc (37, const_int_htab_hash,
@@ -5745,7 +5515,7 @@ init_emit_once (line_numbers)
    warnings about unreachable code.  */
 
 int
-force_line_numbers ()
+force_line_numbers (void)
 {
   int old = no_line_numbers;
 
@@ -5756,8 +5526,7 @@ force_line_numbers ()
 }
 
 void
-restore_line_number_status (old_value)
-     int old_value;
+restore_line_number_status (int old_value)
 {
   no_line_numbers = old_value;
 }
@@ -5766,8 +5535,7 @@ restore_line_number_status (old_value)
    Care updating of libcall regions if present.  */
 
 rtx
-emit_copy_of_insn_after (insn, after)
-     rtx insn, after;
+emit_copy_of_insn_after (rtx insn, rtx after)
 {
   rtx new;
   rtx note1, note2, link;