]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link,compile: Provide size for func types
authorKeith Randall <khr@golang.org>
Mon, 14 Aug 2017 22:07:57 +0000 (15:07 -0700)
committerKeith Randall <khr@golang.org>
Mon, 14 Aug 2017 23:53:27 +0000 (23:53 +0000)
They are currently not given a size, which makes the DWARF reader
very confused. Particularly things like [4]func() get a size of -4, not 32.

Fixes #21097

Change-Id: I01e754134d82fbbe6567e3c7847a4843792a3776
Reviewed-on: https://go-review.googlesource.com/55551
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/internal/dwarf/dwarf.go
src/cmd/link/internal/ld/dwarf.go
src/cmd/link/internal/ld/dwarf_test.go

index 2b034257a6afc5b92c2e2fb1bed7ca119e16f42e..b0c7fb20f5199e5b37c9dfecdace022bce7c8eab 100644 (file)
@@ -467,6 +467,7 @@ var abbrevs = [DW_NABRV]dwAbbrev{
                DW_CHILDREN_yes,
                []dwAttrForm{
                        {DW_AT_name, DW_FORM_string},
+                       {DW_AT_byte_size, DW_FORM_udata},
                        // {DW_AT_type, DW_FORM_ref_addr},
                        {DW_AT_go_kind, DW_FORM_data1},
                },
index b6fb1bb5c18cb88351eb79ea0b308978afe9e557..9692dd6b4eea0869145b4bed8bd44ffc3a0b5e55 100644 (file)
@@ -430,6 +430,7 @@ func newtype(ctxt *Link, gotype *Symbol) *dwarf.DWDie {
 
        case objabi.KindFunc:
                die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_FUNCTYPE, name, 0)
+               newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0)
                dotypedef(ctxt, &dwtypes, name, die)
                newrefattr(die, dwarf.DW_AT_type, mustFind(ctxt, "void"))
                nfields := decodetypeFuncInCount(ctxt.Arch, gotype)
index 4e7413f7394985921402322e57710a4d1ab72777..73c3fc3666cb524837a529414cf8e95b6be30134 100644 (file)
@@ -192,3 +192,46 @@ func findMembers(rdr *dwarf.Reader) (map[string]bool, error) {
        }
        return memberEmbedded, nil
 }
+
+func TestSizes(t *testing.T) {
+       // DWARF sizes should never be -1.
+       // See issue #21097
+       const prog = `
+package main
+var x func()
+var y [4]func()
+func main() {
+       x = nil
+       y[0] = nil
+}
+`
+       dir, err := ioutil.TempDir("", "TestSizes")
+       if err != nil {
+               t.Fatalf("could not create directory: %v", err)
+       }
+       defer os.RemoveAll(dir)
+       f := gobuild(t, dir, prog)
+       defer f.Close()
+       d, err := f.DWARF()
+       if err != nil {
+               t.Fatalf("error reading DWARF: %v", err)
+       }
+       rdr := d.Reader()
+       for entry, err := rdr.Next(); entry != nil; entry, err = rdr.Next() {
+               if err != nil {
+                       t.Fatalf("error reading DWARF: %v", err)
+               }
+               switch entry.Tag {
+               case dwarf.TagArrayType, dwarf.TagPointerType, dwarf.TagStructType, dwarf.TagBaseType, dwarf.TagSubroutineType, dwarf.TagTypedef:
+               default:
+                       continue
+               }
+               typ, err := d.Type(entry.Offset)
+               if err != nil {
+                       t.Fatalf("can't read type: %v", err)
+               }
+               if typ.Size() < 0 {
+                       t.Errorf("subzero size %s %s %T", typ, entry.Tag, typ)
+               }
+       }
+}