diff options
author | Andrew Gerrand <adg@golang.org> | 2013-11-01 11:24:11 +1100 |
---|---|---|
committer | Andrew Gerrand <adg@golang.org> | 2013-11-01 11:24:11 +1100 |
commit | 744d53cdeb9a6727622d5efeb92c18a7976cc119 (patch) | |
tree | faf64fadb572b9f831b53e39234c9e08ea6c3138 | |
parent | 2cce16c4a0056f01317d1fb6d899b795f6d18dad (diff) | |
download | go-744d53cdeb9a6727622d5efeb92c18a7976cc119.tar.gz go-744d53cdeb9a6727622d5efeb92c18a7976cc119.zip |
[release-branch.go1.2] debug/dwarf: add DWARF 4 form constants
««« CL 18460043 / 08e6655618f5
debug/dwarf: add DWARF 4 form constants
Some versions of clang generate DWARF 4-format attributes
even when using -gdwarf-2. We don't care much about the
values, but we do need to be able to parse past them.
This fixes a bug in Go 1.2 rc2 reported via private mail using
a near-tip version of clang.
R=golang-dev, iant, dvyukov
CC=golang-dev
https://golang.org/cl/18460043
»»»
R=golang-dev
CC=golang-dev
https://golang.org/cl/20470045
-rw-r--r-- | src/pkg/debug/dwarf/const.go | 3 | ||||
-rw-r--r-- | src/pkg/debug/dwarf/entry.go | 25 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/pkg/debug/dwarf/const.go b/src/pkg/debug/dwarf/const.go index ad696dc326..9d32a0af2a 100644 --- a/src/pkg/debug/dwarf/const.go +++ b/src/pkg/debug/dwarf/const.go @@ -207,7 +207,10 @@ const ( formRef8 format = 0x14 formRefUdata format = 0x15 formIndirect format = 0x16 + formSecOffset format = 0x17 + formExprloc format = 0x18 formFlagPresent format = 0x19 + formRefSig8 format = 0x20 ) // A Tag is the classification (the type) of an Entry. diff --git a/src/pkg/debug/dwarf/entry.go b/src/pkg/debug/dwarf/entry.go index 6e6fa0f590..c0c2889923 100644 --- a/src/pkg/debug/dwarf/entry.go +++ b/src/pkg/debug/dwarf/entry.go @@ -188,6 +188,7 @@ func (b *buf) entry(atab abbrevTable, ubase Offset) *Entry { // flag case formFlag: val = b.uint8() == 1 + // New in DWARF 4. case formFlagPresent: // The attribute is implicitly indicated as present, and no value is // encoded in the debugging information entry itself. @@ -236,6 +237,30 @@ func (b *buf) entry(atab abbrevTable, ubase Offset) *Entry { b.err = b1.err return nil } + + // lineptr, loclistptr, macptr, rangelistptr + // New in DWARF 4, but clang can generate them with -gdwarf-2. + // Section reference, replacing use of formData4 and formData8. + case formSecOffset: + is64, known := b.format.dwarf64() + if !known { + b.error("unknown size for DW_FORM_sec_offset") + } else if is64 { + val = int64(b.uint64()) + } else { + val = int64(b.uint32()) + } + + // exprloc + // New in DWARF 4. + case formExprloc: + val = b.bytes(int(b.uint())) + + // reference + // New in DWARF 4. + case formRefSig8: + // 64-bit type signature. + val = b.uint64() } e.Field[i].Val = val } |