From fda0e78b234f12c9544cd6607c508b8338698239 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sun, 30 Aug 2009 19:21:48 -0700 Subject: [PATCH] fix line numbers, again. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit if first function in file was dead code, it was being discarded along with the file name information for that file. leave the functions in the master function list longer: let xfol take the dead code out of the code list, and let span skip the unreachable functions during output. before throw: sys·mapaccess1: key not in map panic PC=0x2e7b20 throw+0x33 /Users/rsc/go/src/pkg/runtime/runtime.c:65 throw(0x5834f, 0x0) sys·mapaccess1+0x73 /Users/rsc/go/src/pkg/runtime/hashmap.c:769 sys·mapaccess1(0x2b9bd0, 0x0) gob·*Encoder·Encode+0x16b /Users/rsc/go/src/pkg/fmt/print.go:2926 gob·*Encoder·Encode(0x2bb440, 0x0, 0x558b0, 0x0, 0x2e4be0, ...) main·walk+0x331 :1603 main·walk(0x33a480, 0x0) main·walk+0x271 :1596 main·walk(0x300640, 0x0) main·walk+0x271 :1596 main·walk(0x300520, 0x0) main·walk+0x271 :1596 main·walk(0x300240, 0x0) main·walk+0x271 :1596 main·walk(0x678f8, 0x0) main·main+0x22 :1610 main·main() after throw: sys·mapaccess1: key not in map panic PC=0x2e7b20 throw+0x33 /Users/rsc/go/src/pkg/runtime/runtime.c:65 throw(0x5834f, 0x0) sys·mapaccess1+0x73 /Users/rsc/go/src/pkg/runtime/hashmap.c:769 sys·mapaccess1(0x2b9bd0, 0x0) gob·*Encoder·Encode+0x16b /Users/rsc/go/src/pkg/gob/encoder.go:319 gob·*Encoder·Encode(0x2bb3c0, 0x0, 0x558b0, 0x0, 0x2e4be0, ...) main·walk+0x331 /Users/rsc/dir.go:121 main·walk(0x2f6ab0, 0x0) main·walk+0x271 /Users/rsc/dir.go:114 main·walk(0x301640, 0x0) main·walk+0x271 /Users/rsc/dir.go:114 main·walk(0x301520, 0x0) main·walk+0x271 /Users/rsc/dir.go:114 main·walk(0x301240, 0x0) main·walk+0x271 /Users/rsc/dir.go:114 main·walk(0x678f8, 0x0) main·main+0x22 /Users/rsc/dir.go:128 main·main() mainstart+0xe /Users/rsc/go/src/pkg/runtime/amd64/asm.s:55 mainstart() goexit /Users/rsc/go/src/pkg/runtime/proc.c:133 goexit() R=r DELTA=46 (20 added, 25 deleted, 1 changed) OCL=34094 CL=34103 --- src/cmd/5l/asm.c | 3 +++ src/cmd/5l/pass.c | 4 ++++ src/cmd/6l/pass.c | 4 ++++ src/cmd/6l/span.c | 4 +++- src/cmd/8l/pass.c | 4 ++++ src/cmd/8l/span.c | 3 +++ src/cmd/ld/go.c | 25 ------------------------- 7 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c index 2041009418..dbb305892b 100644 --- a/src/cmd/5l/asm.c +++ b/src/cmd/5l/asm.c @@ -621,6 +621,9 @@ asmsym(void) if(a->type == D_FILE1) putsymb(a->asym->name, 'Z', a->aoffset, 0); + if(!s->reachable) + continue; + if(s->type == STEXT) putsymb(s->name, 'T', s->value, s->version); else diff --git a/src/cmd/5l/pass.c b/src/cmd/5l/pass.c index 0d30f82f69..8387dead10 100644 --- a/src/cmd/5l/pass.c +++ b/src/cmd/5l/pass.c @@ -222,6 +222,10 @@ loop: a = p->as; if(a == ATEXT) curtext = p; + if(!curtext->from.sym->reachable) { + p = p->cond; + goto loop; + } if(a == AB) { q = p->cond; if(q != P) { diff --git a/src/cmd/6l/pass.c b/src/cmd/6l/pass.c index 913ff728b6..c2f5605001 100644 --- a/src/cmd/6l/pass.c +++ b/src/cmd/6l/pass.c @@ -201,6 +201,10 @@ loop: return; if(p->as == ATEXT) curtext = p; + if(!curtext->from.sym->reachable) { + p = p->pcond; + goto loop; + } if(p->as == AJMP) if((q = p->pcond) != P && q->as != ATEXT) { p->mark = 1; diff --git a/src/cmd/6l/span.c b/src/cmd/6l/span.c index 9c24874da4..f1eafff008 100644 --- a/src/cmd/6l/span.c +++ b/src/cmd/6l/span.c @@ -252,6 +252,8 @@ asmsym(void) for(p = textp; p != P; p = p->pcond) { s = p->from.sym; + if(s->type != STEXT) + continue; /* filenames first */ for(a=p->to.autom; a; a=a->link) @@ -261,7 +263,7 @@ asmsym(void) if(a->type == D_FILE1) putsymb(a->asym->name, 'Z', a->aoffset, 0, 0); - if(s->type != STEXT) + if(!s->reachable) continue; putsymb(s->name, 'T', s->value, s->version, s->gotype); diff --git a/src/cmd/8l/pass.c b/src/cmd/8l/pass.c index 4dbd19309f..8b714fdbad 100644 --- a/src/cmd/8l/pass.c +++ b/src/cmd/8l/pass.c @@ -178,6 +178,10 @@ loop: return; if(p->as == ATEXT) curtext = p; + if(!curtext->from.sym->reachable) { + p = p->pcond; + goto loop; + } if(p->as == AJMP) if((q = p->pcond) != P && q->as != ATEXT) { p->mark = 1; diff --git a/src/cmd/8l/span.c b/src/cmd/8l/span.c index a1da9d6c26..0b2d70e8e6 100644 --- a/src/cmd/8l/span.c +++ b/src/cmd/8l/span.c @@ -251,6 +251,9 @@ asmsym(void) if(a->type == D_FILE1) putsymb(a->asym->name, 'Z', a->aoffset, 0, 0); + if(!s->reachable) + continue; + putsymb(s->name, 'T', s->value, s->version, s->gotype); /* frame, auto and param after */ diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c index 30d8348c7d..f86b457b63 100644 --- a/src/cmd/ld/go.c +++ b/src/cmd/ld/go.c @@ -433,22 +433,6 @@ sweeplist(Prog **first, Prog **last) case ADATA: case AGLOBL: reachable = p->from.sym->reachable; - if(!reachable) { - if(debug['v'] > 1) - Bprint(&bso, "discard %s\n", p->from.sym->name); - p->from.sym->type = Sxxx; - break; - } - if(p->as == ATEXT) { - // keeping this function; link into textp list - if(etextp == P) - textp = p; - else - etextp->pcond = p; - etextp = p; - etextp->pcond = P; - } - break; } if(reachable) { if(q == P) @@ -496,15 +480,6 @@ deadcode(void) for(i=0; i