x/debug/dwarf: support new AttrGoEmbed field of struct members

The new custom attribute 0x2903 was added to DIEs of struct members to
distinguish struct embeds from regular fields.

CL: https://golang.org/cl/41873
Issue: https://github.com/golang/go/issues/20037

Change-Id: Ia676c6ef0d49e4e824e28d5cb53cad590c3b4f4a
Reviewed-on: https://go-review.googlesource.com/42512
Reviewed-by: John Dethridge <jcd@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/dwarf/const.go b/dwarf/const.go
index 454f789..b2debfb 100644
--- a/dwarf/const.go
+++ b/dwarf/const.go
@@ -86,9 +86,10 @@
 	AttrDescription    Attr = 0x5A
 
 	// Go-specific attributes.
-	AttrGoKind Attr = 0x2900
-	AttrGoKey  Attr = 0x2901
-	AttrGoElem Attr = 0x2902
+	AttrGoKind          Attr = 0x2900
+	AttrGoKey           Attr = 0x2901
+	AttrGoElem          Attr = 0x2902
+	AttrGoEmbeddedField Attr = 0x2903
 )
 
 var attrNames = [...]string{
@@ -180,6 +181,8 @@
 		return "GoKey"
 	case AttrGoElem:
 		return "GoElem"
+	case AttrGoEmbeddedField:
+		return "GoEmbeddedField"
 	}
 	return strconv.Itoa(int(a))
 }
diff --git a/dwarf/type.go b/dwarf/type.go
index ae1a3f3..e501a42 100644
--- a/dwarf/type.go
+++ b/dwarf/type.go
@@ -158,6 +158,7 @@
 	ByteSize   int64
 	BitOffset  int64 // within the ByteSize bytes at ByteOffset
 	BitSize    int64 // zero if not a bit field
+	Embedded   bool
 }
 
 func (t *StructType) String() string {
@@ -646,6 +647,7 @@
 				f.ByteSize, _ = kid.Val(AttrByteSize).(int64)
 				f.BitOffset, haveBitOffset = kid.Val(AttrBitOffset).(int64)
 				f.BitSize, _ = kid.Val(AttrBitSize).(int64)
+				f.Embedded, _ = kid.Val(AttrGoEmbeddedField).(bool)
 				t.Field = append(t.Field, f)
 
 				bito := f.BitOffset