X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Funwind-dw2-fde.h;h=6d7a8dee2cf84660cb24a225ec398de0601f6b5d;hb=e0efd8893d7aa13ab72000bead527553458acf47;hp=3d7df409e641672a2452a4fa04be8aa3df0144fc;hpb=ce32d35fc12466d3f331d8f56e82e2215b2ebc36;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/unwind-dw2-fde.h b/gcc/unwind-dw2-fde.h index 3d7df409e64..6d7a8dee2cf 100644 --- a/gcc/unwind-dw2-fde.h +++ b/gcc/unwind-dw2-fde.h @@ -1,39 +1,41 @@ /* Subroutines needed for unwinding stack frames for exception handling. */ -/* Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2009 + Free Software Foundation, Inc. Contributed by Jason Merrill . -This file is part of GNU CC. +This file is part of GCC. -GNU CC 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. +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 3, or (at your option) any later +version. -In addition to the permissions in the GNU General Public License, the -Free Software Foundation gives you unlimited permission to link the -compiled version of this file into combinations with other programs, -and to distribute those combinations without any restriction coming -from the use of this file. (The General Public License restrictions -do apply in other respects; for example, they cover modification of -the file, and distribution when not linked into a combine -executable.) +GCC 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. -GNU CC 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. +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 -along with GNU CC; see the file COPYING. 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 and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ +#ifndef GCC_UNWIND_DW2_FDE_H +#define GCC_UNWIND_DW2_FDE_H + +#ifndef HIDE_EXPORTS +#pragma GCC visibility push(default) +#endif struct fde_vector { - void *orig_data; + const void *orig_data; size_t count; - struct dwarf_fde *array[]; + const struct dwarf_fde *array[]; }; struct object @@ -42,7 +44,7 @@ struct object void *tbase; void *dbase; union { - struct dwarf_fde *single; + const struct dwarf_fde *single; struct dwarf_fde **array; struct fde_vector *sort; } u; @@ -54,12 +56,16 @@ struct object unsigned long mixed_encoding : 1; unsigned long encoding : 8; /* ??? Wish there was an easy way to detect a 64-bit host here; - we've got 32 bits left to play with... */ + we've got 32 bits left to play with... */ unsigned long count : 21; } b; size_t i; } s; +#ifdef DWARF2_OBJECT_END_PTR_EXTENSION + char *fde_end; +#endif + struct object *next; }; @@ -85,16 +91,16 @@ struct dwarf_eh_bases }; -extern void __register_frame_info_bases (void *, struct object *, +extern void __register_frame_info_bases (const void *, struct object *, void *, void *); -extern void __register_frame_info (void *, struct object *); +extern void __register_frame_info (const void *, struct object *); extern void __register_frame (void *); extern void __register_frame_info_table_bases (void *, struct object *, void *, void *); extern void __register_frame_info_table (void *, struct object *); extern void __register_frame_table (void *); -extern void *__deregister_frame_info (void *); -extern void *__deregister_frame_info_bases (void *); +extern void *__deregister_frame_info (const void *); +extern void *__deregister_frame_info_bases (const void *); extern void __deregister_frame (void *); @@ -112,7 +118,7 @@ typedef unsigned char ubyte; is located, and what the register lifetimes and stack layout are within the function. - The data structures are defined in the DWARF specfication, although + The data structures are defined in the DWARF specification, although not in a very readable way (see LITERATURE). Every time an exception is thrown, the code needs to locate the FDE @@ -121,7 +127,7 @@ typedef unsigned char ubyte; a) in a linear search, find the shared image (i.e. DLL) containing the PC b) using the FDE table for that shared object, locate the FDE using - binary search (which requires the sorting). */ + binary search (which requires the sorting). */ /* The first few fields of a CIE. The CIE_id field is 0 for a CIE, to distinguish it from a valid FDE. FDEs are aligned to an addressing @@ -146,16 +152,32 @@ typedef struct dwarf_fde fde; /* Locate the CIE for a given FDE. */ -static inline struct dwarf_cie * -get_cie (struct dwarf_fde *f) +static inline const struct dwarf_cie * +get_cie (const struct dwarf_fde *f) { - return (void *)&f->CIE_delta - f->CIE_delta; + return (const void *)&f->CIE_delta - f->CIE_delta; } -static inline fde * -next_fde (fde *f) +static inline const fde * +next_fde (const fde *f) { - return (fde *)((char *)f + f->length + sizeof (f->length)); + return (const fde *) ((const char *) f + f->length + sizeof (f->length)); } -extern fde * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *); +extern const fde * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *); + +static inline int +last_fde (struct object *obj __attribute__ ((__unused__)), const fde *f) +{ +#ifdef DWARF2_OBJECT_END_PTR_EXTENSION + return (char *)f == obj->fde_end || f->length == 0; +#else + return f->length == 0; +#endif +} + +#ifndef HIDE_EXPORTS +#pragma GCC visibility pop +#endif + +#endif /* unwind-dw2-fde.h */