]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix gdb support for channels.
authorLuuk van Dijk <lvd@golang.org>
Thu, 14 Apr 2011 13:32:20 +0000 (15:32 +0200)
committerLuuk van Dijk <lvd@golang.org>
Thu, 14 Apr 2011 13:32:20 +0000 (15:32 +0200)
R=rsc
CC=golang-dev
https://golang.org/cl/4418043

src/cmd/ld/dwarf.c
src/pkg/runtime/chan.c
src/pkg/runtime/runtime-gdb.py

index fa55fcbb4a4c13f8624227cfe8ccddd5fffceb02..ba735265c8281a7c35f31219ce09311899ccdbef 100644 (file)
@@ -1376,20 +1376,18 @@ synthesizemaptypes(DWDie *die)
 static void
 synthesizechantypes(DWDie *die)
 {
-       DWDie *sudog, *waitq, *link, *hchan,
+       DWDie *sudog, *waitq, *hchan,
                *dws, *dww, *dwh, *elemtype;
        DWAttr *a;
-       int elemsize, linksize, sudogsize;
+       int elemsize, sudogsize;
 
        sudog = defgotype(lookup_or_diag("type.runtime.sudog"));
        waitq = defgotype(lookup_or_diag("type.runtime.waitq"));
-       link  = defgotype(lookup_or_diag("type.runtime.link"));
        hchan = defgotype(lookup_or_diag("type.runtime.hchan"));
-       if (sudog == nil || waitq == nil || link == nil || hchan == nil)
+       if (sudog == nil || waitq == nil || hchan == nil)
                return;
 
        sudogsize = getattr(sudog, DW_AT_byte_size)->value;
-       linksize = getattr(link, DW_AT_byte_size)->value;
 
        for (; die != nil; die = die->link) {
                if (die->abbrev != DW_ABRV_CHANTYPE)
@@ -1422,7 +1420,7 @@ synthesizechantypes(DWDie *die)
                copychildren(dwh, hchan);
                substitutetype(dwh, "recvq", dww);
                substitutetype(dwh, "sendq", dww);
-               substitutetype(dwh, "free", dws);
+               substitutetype(dwh, "free", defptrto(dws));
                newattr(dwh, DW_AT_byte_size, DW_CLS_CONSTANT,
                        getattr(hchan, DW_AT_byte_size)->value, NULL);
 
index 2fab9e2161e72886ba94bf92f3e07e6a148a3fc4..f2bdad27beed5c37a6cc7c5615ea6c10a586f2a0 100644 (file)
@@ -9,7 +9,6 @@
 
 static int32   debug   = 0;
 
-typedef        struct  Link    Link;
 typedef        struct  WaitQ   WaitQ;
 typedef        struct  SudoG   SudoG;
 typedef        struct  Select  Select;
@@ -51,12 +50,6 @@ struct       Hchan
 // chanbuf(c, i) is pointer to the i'th slot in the buffer.
 #define chanbuf(c, i) ((byte*)((c)+1)+(uintptr)(c)->elemsize*(i))
 
-struct Link
-{
-       Link*   link;                   // asynch queue circular linked list
-       byte    elem[8];                // asynch queue data element (+ more)
-};
-
 enum
 {
        // Scase.kind
index 08772a431e61663d74aade01f61da4a8e2261da3..3f767fbdd7f07465c993bf5c2801ddad2243fac0 100644 (file)
@@ -122,10 +122,13 @@ class ChanTypePrinter:
                return str(self.val.type)
 
        def children(self):
-               ptr = self.val['recvdataq']
-               for idx in range(self.val["qcount"]):
-                       yield ('[%d]' % idx, ptr['elem'])
-                       ptr = ptr['link']
+               # see chan.c chanbuf()
+               et = [x.type for x in self.val['free'].type.target().fields() if x.name == 'elem'][0]
+                ptr = (self.val.address + 1).cast(et.pointer())
+                for i in range(self.val["qcount"]):
+                       j = (self.val["recvx"] + i) % self.val["dataqsiz"]
+                       yield ('[%d]' % i, (ptr + j).dereference())
+
 
 #
 #  Register all the *Printer classes above.