update copyright dates
[external/binutils.git] / binutils / unwind-ia64.c
index 826de56..5703470 100644 (file)
@@ -1,22 +1,23 @@
 /* unwind-ia64.c -- utility routines to dump IA-64 unwind info for readelf.
-   Copyright (c) 2000, 2001 Free Software Foundation, Inc.
+   Copyright 2000, 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
-This file is part of GNU Binutils.
+   This file is part of GNU Binutils.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 #include "unwind-ia64.h"
 #include <stdio.h>
@@ -25,7 +26,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #if __GNUC__ >= 2
 /* Define BFD64 here, even if our default architecture is 32 bit ELF
    as this will allow us to read in and parse 64bit and 32bit ELF files.
-   Only do this if we belive that the compiler can support a 64 bit
+   Only do this if we believe that the compiler can support a 64 bit
    data type.  For now we only rely on GCC being able to do this.  */
 #define BFD64
 #endif
@@ -33,20 +34,27 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 static bfd_vma unw_rlen = 0;
 
+static void unw_print_brmask (char *, unsigned int);
+static void unw_print_grmask (char *, unsigned int);
+static void unw_print_frmask (char *, unsigned int);
+static void unw_print_abreg (char *, unsigned int);
+static void unw_print_xyreg (char *, unsigned int, unsigned int);
+
 static void
-unw_print_brmask (cp, mask)
-     char * cp;
-     unsigned char mask;
+unw_print_brmask (char *cp, unsigned int mask)
 {
-  char *sep = "";
+  int sep = 0;
   int i;
 
   for (i = 0; mask && (i < 5); ++i)
     {
       if (mask & 1)
        {
-         cp += sprintf (cp, "%sb%u", sep, i + 1);
-         sep = ",";
+         if (sep)
+           *cp++ = ',';
+         *cp++ = 'b';
+         *cp++ = i + 1 + '0';
+         sep = 1;
        }
       mask >>= 1;
     }
@@ -54,49 +62,55 @@ unw_print_brmask (cp, mask)
 }
 
 static void
-unw_print_grmask (cp, mask)
-     char * cp;
-     unsigned char mask;
+unw_print_grmask (char *cp, unsigned int mask)
 {
-  char *sep = "";
+  int sep = 0;
   int i;
 
-  *cp = '\0';
   for (i = 0; i < 4; ++i)
     {
       if (mask & 1)
        {
-         cp += sprintf (cp, "%sr%u", sep, i + 4);
-         sep = ",";
+         if (sep)
+           *cp++ = ',';
+         *cp++ = 'r';
+         *cp++ = i + 4 + '0';
+         sep = 1;
        }
       mask >>= 1;
     }
+  *cp = '\0';
 }
 
 static void
-unw_print_frmask (cp, mask)
-     char * cp;
-     unsigned long mask;
+unw_print_frmask (char *cp, unsigned int mask)
 {
-  char *sep = "";
+  int sep = 0;
   int i;
 
-  *cp = '\0';
   for (i = 0; i < 20; ++i)
     {
       if (mask & 1)
        {
-         cp += sprintf (cp, "%sf%u", sep, (i < 4) ? (i + 2) : (i + 12));
-         sep = ",";
+         if (sep)
+           *cp++ = ',';
+         *cp++ = 'f';
+         if (i < 4)
+           *cp++ = i + 2 + '0';
+         else
+           {
+             *cp++ = (i + 2) / 10 + 1 + '0';
+             *cp++ = (i + 2) % 10 + '0';
+           }
+         sep = 1;
        }
       mask >>= 1;
     }
+  *cp = '\0';
 }
 
 static void
-unw_print_abreg (cp, abreg)
-     char * cp;
-     unsigned char abreg;
+unw_print_abreg (char *cp, unsigned int abreg)
 {
   static const char *special_reg[16] =
   {
@@ -126,10 +140,7 @@ unw_print_abreg (cp, abreg)
 }
 
 static void
-unw_print_xyreg (cp, x, ytreg)
-     char *        cp;
-     unsigned char x;
-     unsigned char ytreg;
+unw_print_xyreg (char *cp, unsigned int x, unsigned int ytreg)
 {
   switch ((x << 1) | ((ytreg >> 7) & 1))
     {
@@ -231,13 +242,13 @@ typedef bfd_vma unw_word;
     }                                                          \
   while (0)
 
-#define UNW_DEC_FRGR_MEM(fmt, grmask, frmask, arg)                             \
+#define UNW_DEC_FRGR_MEM(fmt, grmask, frmask, arg)                             \
   do                                                                           \
-    {                                                                          \
+    {                                                                          \
       char frstr[200], grstr[20];                                              \
-                                                                               \
-      unw_print_grmask (grstr, grmask);                                                \
-      unw_print_frmask (frstr, frmask);                                                \
+                                                                               \
+      unw_print_grmask (grstr, grmask);                                                \
+      unw_print_frmask (frstr, frmask);                                                \
       printf ("\t%s:frgr_mem(grmask=[%s],frmask=[%s])\n", fmt, grstr, frstr);  \
     }                                                                          \
   while (0)
@@ -339,8 +350,8 @@ typedef bfd_vma unw_word;
 #define UNW_DEC_SPILL_MASK(fmt, dp, arg)                                       \
   do                                                                           \
     {                                                                          \
-      static const char * spill_type = "-frb";                                 \
-      unsigned const char * imaskp = dp;                                       \
+      static const char *spill_type = "-frb";                                  \
+      unsigned const char *imaskp = dp;                                        \
       unsigned char mask = 0;                                                  \
       bfd_vma insn = 0;                                                                \
                                                                                \
@@ -361,7 +372,7 @@ typedef bfd_vma unw_word;
 #define UNW_DEC_SPILL_SPREL(fmt, t, abreg, spoff, arg)                         \
   do                                                                           \
     {                                                                          \
-      char regname[10];                                                                \
+      char regname[20];                                                                \
                                                                                \
       unw_print_abreg (regname, abreg);                                                \
       printf ("\t%s:spill_sprel(reg=%s,t=%lu,spoff=0x%lx)\n",                  \
@@ -369,13 +380,13 @@ typedef bfd_vma unw_word;
     }                                                                          \
   while (0)
 
-#define UNW_DEC_SPILL_PSPREL(fmt, t, abreg, pspoff, arg)                       \
+#define UNW_DEC_SPILL_PSPREL(fmt, t, abreg, pspoff, arg)                       \
   do                                                                           \
-    {                                                                          \
-      char regname[10];                                                                \
-                                                                               \
-      unw_print_abreg (regname, abreg);                                                \
-      printf ("\t%s:spill_psprel(reg=%s,t=%lu,pspoff=0x10-0x%lx)\n",           \
+    {                                                                          \
+      char regname[20];                                                                \
+                                                                               \
+      unw_print_abreg (regname, abreg);                                                \
+      printf ("\t%s:spill_psprel(reg=%s,t=%lu,pspoff=0x10-0x%lx)\n",           \
              fmt, regname, (unsigned long) t, 4*(unsigned long)pspoff);        \
     }                                                                          \
   while (0)
@@ -383,7 +394,7 @@ typedef bfd_vma unw_word;
 #define UNW_DEC_RESTORE(fmt, t, abreg, arg)                    \
   do                                                           \
     {                                                          \
-      char regname[10];                                                \
+      char regname[20];                                                \
                                                                \
       unw_print_abreg (regname, abreg);                                \
       printf ("\t%s:restore(t=%lu,reg=%s)\n",                  \
@@ -394,7 +405,7 @@ typedef bfd_vma unw_word;
 #define UNW_DEC_SPILL_REG(fmt, t, abreg, x, ytreg, arg)                \
   do                                                           \
     {                                                          \
-      char abregname[10], tregname[10];                                \
+      char abregname[20], tregname[20];                                \
                                                                \
       unw_print_abreg (abregname, abreg);                      \
       unw_print_xyreg (tregname, x, ytreg);                    \
@@ -403,12 +414,12 @@ typedef bfd_vma unw_word;
     }                                                          \
   while (0)
 
-#define UNW_DEC_SPILL_SPREL_P(fmt, qp, t, abreg, spoff, arg)                       \
+#define UNW_DEC_SPILL_SPREL_P(fmt, qp, t, abreg, spoff, arg)                       \
   do                                                                               \
-    {                                                                              \
-      char regname[20];                                                                    \
-                                                                                   \
-      unw_print_abreg (regname, abreg);                                                    \
+    {                                                                              \
+      char regname[20];                                                                    \
+                                                                                   \
+      unw_print_abreg (regname, abreg);                                                    \
       printf ("\t%s:spill_sprel_p(qp=p%u,t=%lu,reg=%s,spoff=0x%lx)\n",             \
              fmt, qp, (unsigned long) t, regname, 4 * (unsigned long)spoff);       \
     }                                                                              \
@@ -469,7 +480,7 @@ typedef bfd_vma unw_word;
  * macros/constants before including this file:
  *
  *  Types:
- *     unw_word        Unsigned integer type with at least 64 bits 
+ *     unw_word        Unsigned integer type with at least 64 bits
  *
  *  Register names:
  *     UNW_REG_BSP
@@ -520,39 +531,38 @@ typedef bfd_vma unw_word;
  *     UNW_DEC_SPILL_SPREL_P(fmt,qp,t,abreg,pspoff,arg)
  */
 
-static unw_word unw_decode_uleb128 PARAMS ((const unsigned char **));
-static const unsigned char *unw_decode_x1 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_x2 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_x3 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_x4 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_r1 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_r2 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_r3 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_p1 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_p2_p5 PARAMS ((const unsigned char *,
-                                                     unsigned char, void *));
-static const unsigned char *unw_decode_p6 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_p7_p10 PARAMS ((const unsigned char *,
-                                                      unsigned char, void *));
-static const unsigned char *unw_decode_b1 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_b2 PARAMS ((const unsigned char *,
-                                                  unsigned char, void *));
-static const unsigned char *unw_decode_b3_x4 PARAMS ((const unsigned char *,
-                                                     unsigned char, void *));
+static unw_word unw_decode_uleb128 (const unsigned char **);
+static const unsigned char *unw_decode_x1
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_x2
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_x3
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_x4
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_r1
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_r2
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_r3
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_p1
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_p2_p5
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_p6
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_p7_p10
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_b1
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_b2
+  (const unsigned char *, unsigned int, void *);
+static const unsigned char *unw_decode_b3_x4
+  (const unsigned char *, unsigned int, void *);
 
 static unw_word
-unw_decode_uleb128 (dpp)
-     const unsigned char **dpp;
+unw_decode_uleb128 (const unsigned char **dpp)
 {
   unsigned shift = 0;
   unw_word byte, result = 0;
@@ -575,10 +585,8 @@ unw_decode_uleb128 (dpp)
 }
 
 static const unsigned char *
-unw_decode_x1 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_x1 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
+              void *arg ATTRIBUTE_UNUSED)
 {
   unsigned char byte1, abreg;
   unw_word t, off;
@@ -595,10 +603,8 @@ unw_decode_x1 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_x2 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_x2 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
+              void *arg ATTRIBUTE_UNUSED)
 {
   unsigned char byte1, byte2, abreg, x, ytreg;
   unw_word t;
@@ -617,10 +623,8 @@ unw_decode_x2 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_x3 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_x3 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
+              void *arg ATTRIBUTE_UNUSED)
 {
   unsigned char byte1, byte2, abreg, qp;
   unw_word t, off;
@@ -641,10 +645,8 @@ unw_decode_x3 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_x4 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_x4 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
+              void *arg ATTRIBUTE_UNUSED)
 {
   unsigned char byte1, byte2, byte3, qp, abreg, x, ytreg;
   unw_word t;
@@ -667,10 +669,7 @@ unw_decode_x4 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_r1 (dp, code, arg)
-     const unsigned char *dp;
-     unsigned char code;
-     void *arg;
+unw_decode_r1 (const unsigned char *dp, unsigned int code, void *arg)
 {
   int body = (code & 0x20) != 0;
   unw_word rlen;
@@ -681,10 +680,7 @@ unw_decode_r1 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_r2 (dp, code, arg)
-     const unsigned char *dp;
-     unsigned char code;
-     void *arg;
+unw_decode_r2 (const unsigned char *dp, unsigned int code, void *arg)
 {
   unsigned char byte1, mask, grsave;
   unw_word rlen;
@@ -699,10 +695,7 @@ unw_decode_r2 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_r3 (dp, code, arg)
-     const unsigned char *dp;
-     unsigned char code;
-     void *arg;
+unw_decode_r3 (const unsigned char *dp, unsigned int code, void *arg)
 {
   unw_word rlen;
 
@@ -712,10 +705,8 @@ unw_decode_r3 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_p1 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_p1 (const unsigned char *dp, unsigned int code,
+              void *arg ATTRIBUTE_UNUSED)
 {
   unsigned char brmask = (code & 0x1f);
 
@@ -724,10 +715,8 @@ unw_decode_p1 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_p2_p5 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_p2_p5 (const unsigned char *dp, unsigned int code,
+                 void *arg ATTRIBUTE_UNUSED)
 {
   if ((code & 0x10) == 0)
     {
@@ -805,10 +794,8 @@ unw_decode_p2_p5 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_p6 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_p6 (const unsigned char *dp, unsigned int code,
+              void *arg ATTRIBUTE_UNUSED)
 {
   int gregs = (code & 0x10) != 0;
   unsigned char mask = (code & 0x0f);
@@ -821,10 +808,7 @@ unw_decode_p6 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_p7_p10 (dp, code, arg)
-     const unsigned char *dp;
-     unsigned char code;
-     void *arg;
+unw_decode_p7_p10 (const unsigned char *dp, unsigned int code, void *arg)
 {
   unsigned char r, byte1, byte2;
   unw_word t, size;
@@ -997,10 +981,8 @@ unw_decode_p7_p10 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_b1 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_b1 (const unsigned char *dp, unsigned int code,
+              void *arg ATTRIBUTE_UNUSED)
 {
   unw_word label = (code & 0x1f);
 
@@ -1012,10 +994,8 @@ unw_decode_b1 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_b2 (dp, code, arg)
-     const unsigned char * dp;
-     unsigned char         code;
-     void *                arg ATTRIBUTE_UNUSED;
+unw_decode_b2 (const unsigned char *dp, unsigned int code,
+              void *arg ATTRIBUTE_UNUSED)
 {
   unw_word t;
 
@@ -1025,10 +1005,7 @@ unw_decode_b2 (dp, code, arg)
 }
 
 static const unsigned char *
-unw_decode_b3_x4 (dp, code, arg)
-     const unsigned char *dp;
-     unsigned char code;
-     void *arg;
+unw_decode_b3_x4 (const unsigned char *dp, unsigned int code, void *arg)
 {
   unw_word t, ecount, label;
 
@@ -1065,7 +1042,7 @@ unw_decode_b3_x4 (dp, code, arg)
 }
 
 typedef const unsigned char *(*unw_decoder)
-     PARAMS ((const unsigned char *, unsigned char, void *));
+     (const unsigned char *, unsigned int, void *);
 
 static unw_decoder unw_decode_table[2][8] =
   {
@@ -1094,10 +1071,8 @@ static unw_decoder unw_decode_table[2][8] =
 
 /* Decode one descriptor and return address of next descriptor.  */
 const unsigned char *
-unw_decode (dp, inside_body, ptr_inside_body)
-     const unsigned char * dp;
-     int                   inside_body;
-     void *                ptr_inside_body;
+unw_decode (const unsigned char *dp, int inside_body,
+           void *ptr_inside_body)
 {
   unw_decoder decoder;
   unsigned char code;