diff options
author | Yabin Cui <yabinc@google.com> | 2015-10-30 20:15:19 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2015-11-02 14:33:02 -0800 |
commit | a220bd08dd6659a3a3543825f0e0e19c9a20486b (patch) | |
tree | 6e7456a1a86d03bb38f35bcb70b843c8a2d3885c | |
parent | 18cf8168ef34750ffae6451bded31ff06d2d2763 (diff) | |
download | libunwind-brillo-m7-mr-dev.tar.gz |
Support dwarf 4 in libunwind.brillo-m7-releasebrillo-m7-mr-devbrillo-m7-dev
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.c | 22 |
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; |