summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/5l/asm.c3
-rw-r--r--src/cmd/5l/pass.c4
-rw-r--r--src/cmd/6l/pass.c4
-rw-r--r--src/cmd/6l/span.c4
-rw-r--r--src/cmd/8l/pass.c4
-rw-r--r--src/cmd/8l/span.c3
-rw-r--r--src/cmd/ld/go.c25
7 files changed, 21 insertions, 26 deletions
diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c
index 204100941..dbb305892 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 0d30f82f6..8387dead1 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 913ff728b..c2f560500 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 9c24874da..f1eafff00 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 4dbd19309..8b714fdba 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 a1da9d6c2..0b2d70e8e 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 30d8348c7..f86b457b6 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<nelem(morename); i++)
mark(lookup(morename[i], 0));
- // remove dead code.
- // sweeplist will rebuild the list of functions at textp
- textp = P;
- etextp = P;
-
- // follow is going to redo the firstp, lastp list
- // but update it anyway just to keep things consistent.
- sweeplist(&firstp, &lastp);
-
// remove dead data
sweeplist(&datap, &edatap);
}