aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gerrand <adg@golang.org>2013-11-01 11:24:11 +1100
committerAndrew Gerrand <adg@golang.org>2013-11-01 11:24:11 +1100
commit744d53cdeb9a6727622d5efeb92c18a7976cc119 (patch)
treefaf64fadb572b9f831b53e39234c9e08ea6c3138
parent2cce16c4a0056f01317d1fb6d899b795f6d18dad (diff)
downloadgo-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.go3
-rw-r--r--src/pkg/debug/dwarf/entry.go25
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
}