aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2015-10-30 20:15:19 -0700
committerYabin Cui <yabinc@google.com>2015-11-02 14:33:02 -0800
commita220bd08dd6659a3a3543825f0e0e19c9a20486b (patch)
tree6e7456a1a86d03bb38f35bcb70b843c8a2d3885c
parent18cf8168ef34750ffae6451bded31ff06d2d2763 (diff)
downloadlibunwind-brillo-m7-mr-dev.tar.gz
This patch may not contain all changes needed to support dwarf 4, but it fixes unit tests in libbacktrace. Bug: 25372413 Bug: 23951479 Change-Id: Id15ad290812f1f0e4d39879015b13cc7778872a6
-rw-r--r--src/dwarf/Gfde.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/dwarf/Gfde.c b/src/dwarf/Gfde.c
index 4c89967a..f4f99984 100644
--- a/src/dwarf/Gfde.c
+++ b/src/dwarf/Gfde.c
@@ -118,10 +118,9 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
if ((ret = dwarf_readu8 (as, a, &addr, &version, arg)) < 0)
return ret;
- if (version != 1 && version != DWARF_CIE_VERSION)
+ if (version != 1 && version != 3 && version != 4)
{
- Debug (1, "Got CIE version %u, expected version 1 or "
- STR (DWARF_CIE_VERSION) "\n", version);
+ Debug (1, "Got CIE version %u, expected version 1, 3 or 4\n", version);
return -UNW_EBADVERSION;
}
@@ -139,6 +138,23 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
augstr[i++] = ch;
}
+ if (version == 4) {
+ uint8_t address_size;
+ if ((ret = dwarf_readu8(as, a, &addr, &address_size, arg)) < 0) {
+ return ret;
+ }
+ if (address_size != sizeof(unw_word_t)) {
+ return -UNW_EBADVERSION;
+ }
+ uint8_t segment_size;
+ if ((ret = dwarf_readu8(as, a, &addr, &segment_size, arg)) < 0) {
+ return ret;
+ }
+ // We don't support non-zero segment size.
+ if (segment_size != 0) {
+ return -UNW_EBADVERSION;
+ }
+ }
if ((ret = dwarf_read_uleb128 (as, a, &addr, &dci->code_align, arg)) < 0
|| (ret = dwarf_read_sleb128 (as, a, &addr, &dci->data_align, arg)) < 0)
return ret;