OSDN Git Service

* config/sh/sh.h (SH5_WOULD_BE_PARTIAL_NREGS): Use GET_MODE_SIZE
[pf3gnuchains/gcc-fork.git] / gcc / unwind-dw2-fde-darwin.c
index 24cf3bc..0e16371 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
@@ -14,8 +14,8 @@
 
    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.  */
+   the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 /* As a special exception, if you link this library with other files,
    some of which are compiled with GCC, to produce an executable,
@@ -27,6 +27,7 @@
 /* Locate the FDE entry for a given address, using Darwin's keymgr support.  */
 
 #include "tconfig.h"
+#include "tsystem.h"
 #include <string.h>
 #include <stdlib.h>
 #include "dwarf2.h"
@@ -57,8 +58,11 @@ extern void _keymgr_set_and_unlock_processwide_ptr (int, void *);
 extern void _keymgr_unlock_processwide_ptr (int);
 
 struct mach_header;
+struct mach_header_64;
 extern char *getsectdatafromheader (struct mach_header*, const char*,
                        const char *, unsigned long *);
+extern char *getsectdatafromheader_64 (struct mach_header*, const char*,
+                       const char *, unsigned long *);
 
 /* This is referenced from KEYMGR_GCC3_DW2_OBJ_LIST.  */
 struct km_object_info {
@@ -151,11 +155,21 @@ examine_objects (void *pc, struct dwarf_eh_bases *bases, int dont_alloc)
        char *fde;
        unsigned long sz;
 
+#ifdef __ppc64__
+       fde = getsectdatafromheader_64 ((struct mach_header_64 *) image->mh,
+                                    "__DATA", "__eh_frame", &sz);
+#else
        fde = getsectdatafromheader (image->mh, "__DATA", "__eh_frame", &sz);
+#endif
        if (fde == NULL)
          {
+#ifdef __ppc64__
+           fde = getsectdatafromheader_64 ((struct mach_header_64 *) image->mh,
+                                        "__TEXT", "__eh_frame", &sz);
+#else
            fde = getsectdatafromheader (image->mh, "__TEXT",
                                         "__eh_frame", &sz);
+#endif
            if (fde != NULL)
              image->examined_p |= IMAGE_IS_TEXT_MASK;
          }
@@ -206,6 +220,7 @@ examine_objects (void *pc, struct dwarf_eh_bases *bases, int dont_alloc)
            if (result)
              {
                int encoding;
+               _Unwind_Ptr func;
 
                bases->tbase = ob->tbase;
                bases->dbase = ob->dbase;
@@ -215,8 +230,8 @@ examine_objects (void *pc, struct dwarf_eh_bases *bases, int dont_alloc)
                  encoding = get_fde_encoding (result);
                read_encoded_value_with_base (encoding,
                                              base_from_object (encoding, ob),
-                                             result->pc_begin,
-                                             (_Unwind_Ptr *)&bases->func);
+                                             result->pc_begin, &func);
+               bases->func = (void *) func;
                break;
              }
          }