]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/ld: don't add line number info for the final address of an FDE
authorIan Lance Taylor <iant@golang.org>
Wed, 8 Oct 2014 23:17:34 +0000 (16:17 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 8 Oct 2014 23:17:34 +0000 (16:17 -0700)
This makes dwardump --verify happy.

Update #8846

LGTM=r
R=golang-codereviews, r
CC=golang-codereviews
https://golang.org/cl/150370043

src/cmd/ld/dwarf.c

index 4efb0ed537aafd87d04f4f37d25990f446ae132f..a3ba523253c250386bfbf12e23e8fff3d25ebd5c 100644 (file)
@@ -1733,6 +1733,7 @@ writeframes(void)
        LSym *s;
        vlong fdeo, fdesize, pad;
        Pciter pcsp;
+       uint32 nextpc;
 
        if(framesec == S)
                framesec = linklookup(ctxt, ".dwarfframe", 0);
@@ -1775,8 +1776,17 @@ writeframes(void)
                addrput(0);     // initial location
                addrput(0);     // address range
 
-               for(pciterinit(ctxt, &pcsp, &s->pcln->pcsp); !pcsp.done; pciternext(&pcsp))
-                       putpccfadelta(pcsp.nextpc - pcsp.pc, PtrSize + pcsp.value);
+               for(pciterinit(ctxt, &pcsp, &s->pcln->pcsp); !pcsp.done; pciternext(&pcsp)) {
+                       nextpc = pcsp.nextpc;
+                       // pciterinit goes up to the end of the function,
+                       // but DWARF expects us to stop just before the end.
+                       if(nextpc == s->size) {
+                               nextpc--;
+                               if(nextpc < pcsp.pc)
+                                       continue;
+                       }
+                       putpccfadelta(nextpc - pcsp.pc, PtrSize + pcsp.value);
+               }
 
                fdesize = cpos() - fdeo - 4;    // exclude the length field.
                pad = rnd(fdesize, PtrSize) - fdesize;