]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/ld: fix misgenerated pcln file numbers
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 28 Feb 2014 19:08:32 +0000 (11:08 -0800)
committerIan Lance Taylor <iant@golang.org>
Fri, 28 Feb 2014 19:08:32 +0000 (11:08 -0800)
The pcln file number was being encoded incorrectly. The recorded delta was always against -1, not against the previous value.

Update #7369

This CL fixes the bad DWARF file numbers. It does not, however, fix the gdb continue-to-end bug.

LGTM=iant
R=rsc, minux.ma, iant
CC=golang-codereviews, graham
https://golang.org/cl/68960046

src/cmd/ld/pcln.c

index 71587f778482c208cf9b8f307cad0f2f39482542..42916ed093f0844edefca62a9da3048a4f335628 100644 (file)
@@ -89,6 +89,7 @@ renumberfiles(LSym **files, int nfiles, Pcdata *d)
                        val = files[oldval]->value;
                }
                dv = val - newval;
+               newval = val;
                v = (uint32)(dv<<1) ^ (uint32)(int32)(dv>>31);
                addvarint(&out, v);
 
@@ -114,6 +115,7 @@ pclntab(void)
        int32 off, end;
        int64 funcdata_bytes;
        Pcln *pcln;
+       Pciter it;
        static Pcln zpcln;
        
        funcdata_bytes = 0;
@@ -173,8 +175,18 @@ pclntab(void)
                // and then remove this.
                off = setuint32(ctxt, ftab, off, ctxt->cursym->locals + PtrSize);
                
-               if(pcln != &zpcln)
+               if(pcln != &zpcln) {
                        renumberfiles(pcln->file, pcln->nfile, &pcln->pcfile);
+                       if(0) {
+                               // Sanity check the new numbering
+                               for(pciterinit(&it, &pcln->pcfile); !it.done; pciternext(&it)) {
+                                       if(it.value < 1 || it.value > ctxt->nhistfile) {
+                                               diag("bad file number in pcfile: %d not in range [1, %d]\n", it.value, 1, ctxt->nhistfile);
+                                               errorexit();
+                                       }
+                               }
+                       }
+               }
 
                // pcdata
                off = addpctab(ftab, off, &pcln->pcsp);