mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-18 20:39:56 +08:00
exception.cc: Include unwind-pe.h.
* exception.cc: Include unwind-pe.h. Remove all pointer encoding logic. From-SVN: r41983
This commit is contained in:
parent
817e741108
commit
5f2fa73083
@ -1,3 +1,8 @@
|
||||
2001-05-11 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* exception.cc: Include unwind-pe.h. Remove all pointer
|
||||
encoding logic.
|
||||
|
||||
2001-05-10 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* Makefile.in: Rebuilt.
|
||||
|
@ -115,174 +115,7 @@ _Jv_Throw (jthrowable value)
|
||||
}
|
||||
|
||||
|
||||
// ??? These ought to go somewhere else dwarf2 or dwarf2eh related.
|
||||
|
||||
// Pointer encodings.
|
||||
#define DW_EH_PE_absptr 0x00
|
||||
#define DW_EH_PE_omit 0xff
|
||||
|
||||
#define DW_EH_PE_uleb128 0x01
|
||||
#define DW_EH_PE_udata2 0x02
|
||||
#define DW_EH_PE_udata4 0x03
|
||||
#define DW_EH_PE_udata8 0x04
|
||||
#define DW_EH_PE_sleb128 0x09
|
||||
#define DW_EH_PE_sdata2 0x0A
|
||||
#define DW_EH_PE_sdata4 0x0B
|
||||
#define DW_EH_PE_sdata8 0x0C
|
||||
#define DW_EH_PE_signed 0x08
|
||||
|
||||
#define DW_EH_PE_pcrel 0x10
|
||||
#define DW_EH_PE_textrel 0x20
|
||||
#define DW_EH_PE_datarel 0x30
|
||||
#define DW_EH_PE_funcrel 0x40
|
||||
|
||||
static unsigned int
|
||||
size_of_encoded_value (unsigned char encoding)
|
||||
{
|
||||
switch (encoding & 0x07)
|
||||
{
|
||||
case DW_EH_PE_absptr:
|
||||
return sizeof (void *);
|
||||
case DW_EH_PE_udata2:
|
||||
return 2;
|
||||
case DW_EH_PE_udata4:
|
||||
return 4;
|
||||
case DW_EH_PE_udata8:
|
||||
return 8;
|
||||
}
|
||||
abort ();
|
||||
}
|
||||
|
||||
static const unsigned char *
|
||||
read_encoded_value (_Unwind_Context *context, unsigned char encoding,
|
||||
const unsigned char *p, _Unwind_Ptr *val)
|
||||
{
|
||||
union unaligned
|
||||
{
|
||||
void *ptr;
|
||||
unsigned u2 __attribute__ ((mode (HI)));
|
||||
unsigned u4 __attribute__ ((mode (SI)));
|
||||
unsigned u8 __attribute__ ((mode (DI)));
|
||||
signed s2 __attribute__ ((mode (HI)));
|
||||
signed s4 __attribute__ ((mode (SI)));
|
||||
signed s8 __attribute__ ((mode (DI)));
|
||||
} __attribute__((__packed__));
|
||||
|
||||
union unaligned *u = (union unaligned *) p;
|
||||
_Unwind_Ptr result;
|
||||
|
||||
switch (encoding & 0x0f)
|
||||
{
|
||||
case DW_EH_PE_absptr:
|
||||
result = (_Unwind_Ptr) u->ptr;
|
||||
p += sizeof (void *);
|
||||
break;
|
||||
|
||||
case DW_EH_PE_uleb128:
|
||||
{
|
||||
unsigned int shift = 0;
|
||||
unsigned char byte;
|
||||
|
||||
result = 0;
|
||||
do
|
||||
{
|
||||
byte = *p++;
|
||||
result |= (_Unwind_Ptr)(byte & 0x7f) << shift;
|
||||
shift += 7;
|
||||
}
|
||||
while (byte & 0x80);
|
||||
}
|
||||
break;
|
||||
|
||||
case DW_EH_PE_sleb128:
|
||||
{
|
||||
unsigned int shift = 0;
|
||||
unsigned char byte;
|
||||
|
||||
result = 0;
|
||||
do
|
||||
{
|
||||
byte = *p++;
|
||||
result |= (_Unwind_Ptr)(byte & 0x7f) << shift;
|
||||
shift += 7;
|
||||
}
|
||||
while (byte & 0x80);
|
||||
|
||||
if (shift < 8 * sizeof(result) && (byte & 0x40) != 0)
|
||||
result |= -(1L << shift);
|
||||
}
|
||||
break;
|
||||
|
||||
case DW_EH_PE_udata2:
|
||||
result = u->u2;
|
||||
p += 2;
|
||||
break;
|
||||
case DW_EH_PE_udata4:
|
||||
result = u->u4;
|
||||
p += 4;
|
||||
break;
|
||||
case DW_EH_PE_udata8:
|
||||
result = u->u8;
|
||||
p += 8;
|
||||
break;
|
||||
|
||||
case DW_EH_PE_sdata2:
|
||||
result = u->s2;
|
||||
p += 2;
|
||||
break;
|
||||
case DW_EH_PE_sdata4:
|
||||
result = u->s4;
|
||||
p += 4;
|
||||
break;
|
||||
case DW_EH_PE_sdata8:
|
||||
result = u->s8;
|
||||
p += 8;
|
||||
break;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
if (result != 0)
|
||||
switch (encoding & 0xf0)
|
||||
{
|
||||
case DW_EH_PE_absptr:
|
||||
break;
|
||||
|
||||
case DW_EH_PE_pcrel:
|
||||
// Define as relative to the beginning of the pointer.
|
||||
result += (_Unwind_Ptr) u;
|
||||
break;
|
||||
|
||||
case DW_EH_PE_textrel:
|
||||
case DW_EH_PE_datarel:
|
||||
// FIXME.
|
||||
abort ();
|
||||
|
||||
case DW_EH_PE_funcrel:
|
||||
result += _Unwind_GetRegionStart (context);
|
||||
break;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
*val = result;
|
||||
return p;
|
||||
}
|
||||
|
||||
static inline const unsigned char *
|
||||
read_uleb128 (const unsigned char *p, _Unwind_Ptr *val)
|
||||
{
|
||||
return read_encoded_value (0, DW_EH_PE_uleb128, p, val);
|
||||
}
|
||||
|
||||
static inline const unsigned char *
|
||||
read_sleb128 (const unsigned char *p, _Unwind_Ptr *val)
|
||||
{
|
||||
return read_encoded_value (0, DW_EH_PE_sleb128, p, val);
|
||||
}
|
||||
|
||||
#include "unwind-pe.h"
|
||||
|
||||
struct lsda_header_info
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user