1,6 → 1,5 |
/* Subroutines needed for unwinding stack frames for exception handling. */ |
/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, |
2009 Free Software Foundation, Inc. |
/* Copyright (C) 1997-2013 Free Software Foundation, Inc. |
Contributed by Jason Merrill <jason@cygnus.com>. |
|
This file is part of GCC. |
64,6 → 63,8 |
__gthread_once (&once, init_object_mutex); |
} |
#else |
/* ??? Several targets include this file with stubbing parts of gthr.h |
and expect no locking to be done. */ |
#define init_object_mutex_once() |
#endif |
|
227,7 → 228,6 |
free (__deregister_frame_info (begin)); |
} |
|
|
/* Like base_of_encoded_value, but take the base from a struct object |
instead of an _Unwind_Context. */ |
|
265,10 → 265,18 |
_sleb128_t stmp; |
|
aug = cie->augmentation; |
p = aug + strlen ((const char *)aug) + 1; /* Skip the augmentation string. */ |
if (__builtin_expect (cie->version >= 4, 0)) |
{ |
if (p[0] != sizeof (void *) || p[1] != 0) |
return DW_EH_PE_omit; /* We are not prepared to handle unexpected |
address sizes or segment selectors. */ |
p += 2; /* Skip address size and segment size. */ |
} |
|
if (aug[0] != 'z') |
return DW_EH_PE_absptr; |
|
p = aug + strlen ((const char *)aug) + 1; /* Skip the augmentation string. */ |
p = read_uleb128 (p, &utmp); /* Skip code alignment. */ |
p = read_sleb128 (p, &stmp); /* Skip data alignment. */ |
if (cie->version == 1) /* Skip return address column. */ |
614,6 → 622,8 |
{ |
last_cie = this_cie; |
encoding = get_cie_encoding (this_cie); |
if (encoding == DW_EH_PE_omit) |
return -1; |
base = base_from_object (encoding, ob); |
if (ob->s.b.encoding == DW_EH_PE_omit) |
ob->s.b.encoding = encoding; |
723,10 → 733,26 |
{ |
fde **p = ob->u.array; |
for (count = 0; *p; ++p) |
count += classify_object_over_fdes (ob, *p); |
{ |
size_t cur_count = classify_object_over_fdes (ob, *p); |
if (cur_count == (size_t) -1) |
goto unhandled_fdes; |
count += cur_count; |
} |
} |
else |
{ |
count = classify_object_over_fdes (ob, ob->u.single); |
if (count == (size_t) -1) |
{ |
static const fde terminator; |
unhandled_fdes: |
ob->s.i = 0; |
ob->s.b.encoding = DW_EH_PE_omit; |
ob->u.single = &terminator; |
return; |
} |
} |
|
/* The count field we have in the main struct object is somewhat |
limited, but should suffice for virtually all cases. If the |