Commit 772455c9 by Ian Lance Taylor

libgo: fix for unaligned read in go-unwind.c's read_encoded_value()

    
    Change code to work properly reading unaligned data on architectures
    that don't support unaliged reads. This fixes a regression (broke
    Solaris/sparc) introduced in https://golang.org/cl/90235.
    
    Reviewed-on: https://go-review.googlesource.com/111296

From-SVN: r259935
parent 71d372eb
30e2033a91fc08be9351d26737599a1fa6486017 0c9b7a1ca4c6308345ea2a276cf820ff52513592
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -197,10 +197,6 @@ read_sleb128 (const uint8_t *p, _sleb128_t *val) ...@@ -197,10 +197,6 @@ read_sleb128 (const uint8_t *p, _sleb128_t *val)
#define ROUND_UP_TO_PVB(x) (x + sizeof(void *) - 1) &- sizeof(void *) #define ROUND_UP_TO_PVB(x) (x + sizeof(void *) - 1) &- sizeof(void *)
#define COPY_AND_ADVANCE(dst, ptr, typ) \
(dst = *((const typ*)ptr), \
ptr += sizeof(typ))
static inline const uint8_t * static inline const uint8_t *
read_encoded_value (struct _Unwind_Context *context, uint8_t encoding, read_encoded_value (struct _Unwind_Context *context, uint8_t encoding,
const uint8_t *p, _Unwind_Ptr *val) const uint8_t *p, _Unwind_Ptr *val)
...@@ -221,17 +217,53 @@ read_encoded_value (struct _Unwind_Context *context, uint8_t encoding, ...@@ -221,17 +217,53 @@ read_encoded_value (struct _Unwind_Context *context, uint8_t encoding,
switch (encoding & 0x0f) switch (encoding & 0x0f)
{ {
case DW_EH_PE_sdata2: case DW_EH_PE_sdata2:
{
int16_t result;
__builtin_memcpy (&result, p, sizeof(int16_t));
decoded = result;
p += sizeof(int16_t);
break;
}
case DW_EH_PE_udata2: case DW_EH_PE_udata2:
COPY_AND_ADVANCE (decoded, p, uint16_t); {
break; uint16_t result;
__builtin_memcpy (&result, p, sizeof(uint16_t));
decoded = result;
p += sizeof(uint16_t);
break;
}
case DW_EH_PE_sdata4: case DW_EH_PE_sdata4:
{
int32_t result;
__builtin_memcpy (&result, p, sizeof(int32_t));
decoded = result;
p += sizeof(int32_t);
break;
}
case DW_EH_PE_udata4: case DW_EH_PE_udata4:
COPY_AND_ADVANCE (decoded, p, uint32_t); {
break; uint32_t result;
__builtin_memcpy (&result, p, sizeof(uint32_t));
decoded = result;
p += sizeof(uint32_t);
break;
}
case DW_EH_PE_sdata8: case DW_EH_PE_sdata8:
{
int64_t result;
__builtin_memcpy (&result, p, sizeof(int64_t));
decoded = result;
p += sizeof(int64_t);
break;
}
case DW_EH_PE_udata8: case DW_EH_PE_udata8:
COPY_AND_ADVANCE (decoded, p, uint64_t); {
break; uint64_t result;
__builtin_memcpy (&result, p, sizeof(uint64_t));
decoded = result;
p += sizeof(uint64_t);
break;
}
case DW_EH_PE_uleb128: case DW_EH_PE_uleb128:
{ {
_uleb128_t value; _uleb128_t value;
...@@ -247,7 +279,7 @@ read_encoded_value (struct _Unwind_Context *context, uint8_t encoding, ...@@ -247,7 +279,7 @@ read_encoded_value (struct _Unwind_Context *context, uint8_t encoding,
break; break;
} }
case DW_EH_PE_absptr: case DW_EH_PE_absptr:
decoded = (_Unwind_Internal_Ptr)(*(const void *const *)p); __builtin_memcpy (&decoded, (const void *)p, sizeof(const void*));
p += sizeof(void *); p += sizeof(void *);
break; break;
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment