]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: let writelines work when pcstmt symbol doesn't exist
authorAlessandro Arzilli <alessandro.arzilli@gmail.com>
Wed, 2 May 2018 10:45:47 +0000 (12:45 +0200)
committerDavid Chase <drchase@google.com>
Wed, 2 May 2018 15:58:52 +0000 (15:58 +0000)
The assembler does not produce pcstmt symbols, writeline should be able
to work even if no pcstmt symbol exists for a given function.

Fixes #25216, #25191

Change-Id: I41e16df1e7c8ca59d27e7514537609e309a51c51
Reviewed-on: https://go-review.googlesource.com/110816
Reviewed-by: David Chase <drchase@google.com>
src/cmd/link/internal/ld/dwarf.go

index c90609feef1e909f9c5da810cb46c8b206dcb574..e06d1493e02c3f9a05c53058b34033c29b51d2a1 100644 (file)
@@ -1249,9 +1249,15 @@ func writelines(ctxt *Link, lib *sym.Library, textp []*sym.Symbol, ls *sym.Symbo
                pciterinit(ctxt, &pcline, &s.FuncInfo.Pcline)
                pciterinit(ctxt, &pcstmt, &pctostmtData)
 
+               if pcstmt.done != 0 {
+                       // Assembly files lack a pcstmt section, we assume that every instruction
+                       // is a valid statement.
+                       pcstmt.value = 1
+               }
+
                var thispc uint32
                // TODO this loop looks like it could exit with work remaining.
-               for pcfile.done == 0 && pcline.done == 0 && pcstmt.done == 0 {
+               for pcfile.done == 0 && pcline.done == 0 {
                        // Only changed if it advanced
                        if int32(file) != pcfile.value {
                                ls.AddUint8(dwarf.DW_LNS_set_file)
@@ -1280,14 +1286,14 @@ func writelines(ctxt *Link, lib *sym.Library, textp []*sym.Symbol, ls *sym.Symbo
                        if pcline.nextpc < thispc {
                                thispc = pcline.nextpc
                        }
-                       if pcstmt.nextpc < thispc {
+                       if pcstmt.done == 0 && pcstmt.nextpc < thispc {
                                thispc = pcstmt.nextpc
                        }
 
                        if pcfile.nextpc == thispc {
                                pciternext(&pcfile)
                        }
-                       if pcstmt.nextpc == thispc {
+                       if pcstmt.done == 0 && pcstmt.nextpc == thispc {
                                pciternext(&pcstmt)
                        }
                        if pcline.nextpc == thispc {