OSDN Git Service

2009-08-20 Thomas Koenig <tkoenig@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / unwind-pe.h
index fe06324..121f877 100644 (file)
@@ -1,11 +1,11 @@
 /* Exception handling and frame unwind runtime interface routines.
 /* Exception handling and frame unwind runtime interface routines.
-   Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
    GCC is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by
 
    This file is part of GCC.
 
    GCC 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)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    GCC is distributed in the hope that it will be useful, but WITHOUT
    any later version.
 
    GCC is distributed in the hope that it will be useful, but WITHOUT
    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
    License for more details.
 
    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 GCC; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
 
 /* @@@ Really this should be out of line, but this also causes link
    compatibility problems with the base ABI.  This is slightly better
    than duplicating code, however.  */
 
 
 /* @@@ Really this should be out of line, but this also causes link
    compatibility problems with the base ABI.  This is slightly better
    than duplicating code, however.  */
 
+#ifndef GCC_UNWIND_PE_H
+#define GCC_UNWIND_PE_H
+
 /* If using C++, references to abort have to be qualified with std::.  */
 #if __cplusplus
 #define __gxx_abort std::abort
 /* If using C++, references to abort have to be qualified with std::.  */
 #if __cplusplus
 #define __gxx_abort std::abort
 #define DW_EH_PE_indirect      0x80
 \f
 
 #define DW_EH_PE_indirect      0x80
 \f
 
+#ifndef NO_SIZE_OF_ENCODED_VALUE
+
 /* Given an encoding, return the number of bytes the format occupies.
    This is only defined for fixed-size encodings, and so does not
    include leb128.  */
 
 static unsigned int
 /* Given an encoding, return the number of bytes the format occupies.
    This is only defined for fixed-size encodings, and so does not
    include leb128.  */
 
 static unsigned int
+size_of_encoded_value (unsigned char encoding) __attribute__ ((unused));
+
+static unsigned int
 size_of_encoded_value (unsigned char encoding)
 {
   if (encoding == DW_EH_PE_omit)
 size_of_encoded_value (unsigned char encoding)
 {
   if (encoding == DW_EH_PE_omit)
@@ -76,6 +88,8 @@ size_of_encoded_value (unsigned char encoding)
   __gxx_abort ();
 }
 
   __gxx_abort ();
 }
 
+#endif
+
 #ifndef NO_BASE_OF_ENCODED_VALUE
 
 /* Given an encoding and an _Unwind_Context, return the base to which
 #ifndef NO_BASE_OF_ENCODED_VALUE
 
 /* Given an encoding and an _Unwind_Context, return the base to which
@@ -114,17 +128,17 @@ base_of_encoded_value (unsigned char encoding, struct _Unwind_Context *context)
    pointers should not be leb128 encoded on that target.  */
 
 static const unsigned char *
    pointers should not be leb128 encoded on that target.  */
 
 static const unsigned char *
-read_uleb128 (const unsigned char *p, _Unwind_Word *val)
+read_uleb128 (const unsigned char *p, _uleb128_t *val)
 {
   unsigned int shift = 0;
   unsigned char byte;
 {
   unsigned int shift = 0;
   unsigned char byte;
-  _Unwind_Word result;
+  _uleb128_t result;
 
   result = 0;
   do
     {
       byte = *p++;
 
   result = 0;
   do
     {
       byte = *p++;
-      result |= (byte & 0x7f) << shift;
+      result |= ((_uleb128_t)byte & 0x7f) << shift;
       shift += 7;
     }
   while (byte & 0x80);
       shift += 7;
     }
   while (byte & 0x80);
@@ -136,26 +150,26 @@ read_uleb128 (const unsigned char *p, _Unwind_Word *val)
 /* Similar, but read a signed leb128 value.  */
 
 static const unsigned char *
 /* Similar, but read a signed leb128 value.  */
 
 static const unsigned char *
-read_sleb128 (const unsigned char *p, _Unwind_Sword *val)
+read_sleb128 (const unsigned char *p, _sleb128_t *val)
 {
   unsigned int shift = 0;
   unsigned char byte;
 {
   unsigned int shift = 0;
   unsigned char byte;
-  _Unwind_Word result;
+  _uleb128_t result;
 
   result = 0;
   do
     {
       byte = *p++;
 
   result = 0;
   do
     {
       byte = *p++;
-      result |= (byte & 0x7f) << shift;
+      result |= ((_uleb128_t)byte & 0x7f) << shift;
       shift += 7;
     }
   while (byte & 0x80);
 
   /* Sign-extend a negative value.  */
   if (shift < 8 * sizeof(result) && (byte & 0x40) != 0)
       shift += 7;
     }
   while (byte & 0x80);
 
   /* Sign-extend a negative value.  */
   if (shift < 8 * sizeof(result) && (byte & 0x40) != 0)
-    result |= -(1L << shift);
+    result |= -(((_uleb128_t)1L) << shift);
 
 
-  *val = (_Unwind_Sword) result;
+  *val = (_sleb128_t) result;
   return p;
 }
 
   return p;
 }
 
@@ -178,38 +192,38 @@ read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base,
       signed s8 __attribute__ ((mode (DI)));
     } __attribute__((__packed__));
 
       signed s8 __attribute__ ((mode (DI)));
     } __attribute__((__packed__));
 
-  union unaligned *u = (union unaligned *) p;
-  _Unwind_Ptr result;
+  const union unaligned *u = (const union unaligned *) p;
+  _Unwind_Internal_Ptr result;
 
   if (encoding == DW_EH_PE_aligned)
     {
 
   if (encoding == DW_EH_PE_aligned)
     {
-      _Unwind_Ptr a = (_Unwind_Ptr)p;
+      _Unwind_Internal_Ptr a = (_Unwind_Internal_Ptr) p;
       a = (a + sizeof (void *) - 1) & - sizeof(void *);
       a = (a + sizeof (void *) - 1) & - sizeof(void *);
-      result = *(_Unwind_Ptr *) a;
-      p = (const unsigned char *)(a + sizeof (void *));
+      result = *(_Unwind_Internal_Ptr *) a;
+      p = (const unsigned char *) (_Unwind_Internal_Ptr) (a + sizeof (void *));
     }
   else
     {
       switch (encoding & 0x0f)
        {
        case DW_EH_PE_absptr:
     }
   else
     {
       switch (encoding & 0x0f)
        {
        case DW_EH_PE_absptr:
-         result = (_Unwind_Ptr) u->ptr;
+         result = (_Unwind_Internal_Ptr) u->ptr;
          p += sizeof (void *);
          break;
 
        case DW_EH_PE_uleb128:
          {
          p += sizeof (void *);
          break;
 
        case DW_EH_PE_uleb128:
          {
-           _Unwind_Word tmp;
+           _uleb128_t tmp;
            p = read_uleb128 (p, &tmp);
            p = read_uleb128 (p, &tmp);
-           result = (_Unwind_Ptr)tmp;
+           result = (_Unwind_Internal_Ptr) tmp;
          }
          break;
 
        case DW_EH_PE_sleb128:
          {
          }
          break;
 
        case DW_EH_PE_sleb128:
          {
-           _Unwind_Sword tmp;
+           _sleb128_t tmp;
            p = read_sleb128 (p, &tmp);
            p = read_sleb128 (p, &tmp);
-           result = (_Unwind_Ptr)tmp;
+           result = (_Unwind_Internal_Ptr) tmp;
          }
          break;
 
          }
          break;
 
@@ -246,9 +260,9 @@ read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base,
       if (result != 0)
        {
          result += ((encoding & 0x70) == DW_EH_PE_pcrel
       if (result != 0)
        {
          result += ((encoding & 0x70) == DW_EH_PE_pcrel
-                    ? (_Unwind_Ptr)u : base);
+                    ? (_Unwind_Internal_Ptr) u : base);
          if (encoding & DW_EH_PE_indirect)
          if (encoding & DW_EH_PE_indirect)
-           result = *(_Unwind_Ptr *)result;
+           result = *(_Unwind_Internal_Ptr *) result;
        }
     }
 
        }
     }
 
@@ -271,3 +285,5 @@ read_encoded_value (struct _Unwind_Context *context, unsigned char encoding,
 }
 
 #endif
 }
 
 #endif
+
+#endif /* unwind-pe.h */