diff options
| author | Russ Cox <rsc@golang.org> | 2015-01-29 14:58:54 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2015-02-03 18:22:15 +0000 |
| commit | 77a415e5a698e8f897aed8aa64db6855b8f952fc (patch) | |
| tree | a2adb923b983adfd5301f0d87c9c26949e22d9d6 /src/liblink | |
| parent | 72521319c733e5de62bb837508ea9fa2b1f3a0a2 (diff) | |
| download | go-77a415e5a698e8f897aed8aa64db6855b8f952fc.tar.xz | |
liblink: place TEXT/GLOBL flags in p->from3 always
Before, amd64 and 386 stored the flags in p->from.scale
and arm and ppc64 stored the flags in p->reg.
Both caused special cases in printing and in handling of the
addresses.
To avoid possible conflicts with the real meaning of p->from
and to avoid storing a non-register value in a reg field,
use from3 to hold a TYPE_CONST value giving the flags.
There is still a special case for printing, because the flags
are specified without a $, and normally a TYPE_CONST prints
with a $. But that's much less special than what came before.
This allows us to remove the textflag and settextflag methods
from LinkArch. They are no longer architecture-specific.
Change-Id: I931da8e1ecd92e127cd9aa44ef5a73c42e730110
Reviewed-on: https://go-review.googlesource.com/3572
Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/liblink')
| -rw-r--r-- | src/liblink/asm5.c | 1 | ||||
| -rw-r--r-- | src/liblink/asm9.c | 4 | ||||
| -rw-r--r-- | src/liblink/list5.c | 2 | ||||
| -rw-r--r-- | src/liblink/list6.c | 6 | ||||
| -rw-r--r-- | src/liblink/list8.c | 6 | ||||
| -rw-r--r-- | src/liblink/list9.c | 11 | ||||
| -rw-r--r-- | src/liblink/obj5.c | 22 | ||||
| -rw-r--r-- | src/liblink/obj6.c | 30 | ||||
| -rw-r--r-- | src/liblink/obj8.c | 24 | ||||
| -rw-r--r-- | src/liblink/obj9.c | 22 | ||||
| -rw-r--r-- | src/liblink/objfile.c | 4 |
11 files changed, 31 insertions, 101 deletions
diff --git a/src/liblink/asm5.c b/src/liblink/asm5.c index 38a7399725..8723553fa4 100644 --- a/src/liblink/asm5.c +++ b/src/liblink/asm5.c @@ -72,7 +72,6 @@ static Optab optab[] = /* struct Optab: OPCODE, from, prog->reg, to, type,size,param,flag */ { ATEXT, C_ADDR, C_NONE, C_TEXTSIZE, 0, 0, 0 }, - { ATEXT, C_ADDR, C_REG, C_TEXTSIZE, 0, 0, 0 }, { AADD, C_REG, C_REG, C_REG, 1, 4, 0 }, { AADD, C_REG, C_NONE, C_REG, 1, 4, 0 }, diff --git a/src/liblink/asm9.c b/src/liblink/asm9.c index 9101c56c51..bc3174d08f 100644 --- a/src/liblink/asm9.c +++ b/src/liblink/asm9.c @@ -60,13 +60,9 @@ struct Optab static Optab optab[] = { { ATEXT, C_LEXT, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0 }, - { ATEXT, C_LEXT, C_REG, C_NONE, C_TEXTSIZE, 0, 0, 0 }, { ATEXT, C_LEXT, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0 }, - { ATEXT, C_LEXT, C_REG, C_LCON, C_TEXTSIZE, 0, 0, 0 }, { ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0 }, - { ATEXT, C_ADDR, C_REG, C_NONE, C_TEXTSIZE, 0, 0, 0 }, { ATEXT, C_ADDR, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0 }, - { ATEXT, C_ADDR, C_REG, C_LCON, C_TEXTSIZE, 0, 0, 0 }, /* move register */ { AMOVD, C_REG, C_NONE, C_NONE, C_REG, 1, 4, 0 }, diff --git a/src/liblink/list5.c b/src/liblink/list5.c index d04c8c27a8..a687400b08 100644 --- a/src/liblink/list5.c +++ b/src/liblink/list5.c @@ -112,7 +112,7 @@ Pconv(Fmt *fp) sprint(str, "%.5lld (%L) %A %D/%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to); else if(p->as == ATEXT) - sprint(str, "%.5lld (%L) %A %D,%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to); + sprint(str, "%.5lld (%L) %A %D,%lld,%D", p->pc, p->lineno, a, &p->from, p->from3.offset, &p->to); else if(p->reg == 0) sprint(str, "%.5lld (%L) %A%s %D,%D", p->pc, p->lineno, a, sc, &p->from, &p->to); diff --git a/src/liblink/list6.c b/src/liblink/list6.c index 2cb1777ba4..c3f13e921f 100644 --- a/src/liblink/list6.c +++ b/src/liblink/list6.c @@ -90,9 +90,9 @@ Pconv(Fmt *fp) break; case ATEXT: - if(p->from.scale) { - sprint(str, "%.5lld (%L) %A %D,%d,%D", - p->pc, p->lineno, p->as, &p->from, p->from.scale, &p->to); + if(p->from3.offset) { + sprint(str, "%.5lld (%L) %A %D,%lld,%D", + p->pc, p->lineno, p->as, &p->from, p->from3.offset, &p->to); break; } sprint(str, "%.5lld (%L) %A %D,%D", diff --git a/src/liblink/list8.c b/src/liblink/list8.c index 33c0791a19..c8a4ca7e8c 100644 --- a/src/liblink/list8.c +++ b/src/liblink/list8.c @@ -77,9 +77,9 @@ Pconv(Fmt *fp) break; case ATEXT: - if(p->from.scale) { - sprint(str, "%.5lld (%L) %A %D,%d,%D", - p->pc, p->lineno, p->as, &p->from, p->from.scale, &p->to); + if(p->from3.offset) { + sprint(str, "%.5lld (%L) %A %D,%lld,%D", + p->pc, p->lineno, p->as, &p->from, p->from3.offset, &p->to); break; } sprint(str, "%.5lld (%L) %A %D,%D", diff --git a/src/liblink/list9.c b/src/liblink/list9.c index 149d713fe8..58eccb265d 100644 --- a/src/liblink/list9.c +++ b/src/liblink/list9.c @@ -95,14 +95,9 @@ Pconv(Fmt *fp) str[0] = 0; if(a == ADATA || a == AINIT || a == ADYNT) sprint(str, "%.5lld (%L) %A %D/%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to); - else if(a == ATEXT) { - if(p->reg != 0) - sprint(str, "%.5lld (%L) %A %D,%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to); - else - sprint(str, "%.5lld (%L) %A %D,%D", p->pc, p->lineno, a, &p->from, &p->to); - } else if(a == AGLOBL) { - if(p->reg != 0) - sprint(str, "%.5lld (%L) %A %D,%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to); + else if(a == ATEXT || a == AGLOBL) { + if(p->from3.offset != 0) + sprint(str, "%.5lld (%L) %A %D,%lld,%D", p->pc, p->lineno, a, &p->from, p->from3.offset, &p->to); else sprint(str, "%.5lld (%L) %A %D,%D", p->pc, p->lineno, a, &p->from, &p->to); } else { diff --git a/src/liblink/obj5.c b/src/liblink/obj5.c index 0f2e9fa4f2..8d20173912 100644 --- a/src/liblink/obj5.c +++ b/src/liblink/obj5.c @@ -58,18 +58,6 @@ datasize(Prog *p) return p->reg; } -static int -textflag(Prog *p) -{ - return p->reg; -} - -static void -settextflag(Prog *p, int f) -{ - p->reg = f; -} - static void progedit(Link *ctxt, Prog *p) { @@ -268,7 +256,7 @@ preprocess(Link *ctxt, LSym *cursym) cursym->args = p->to.u.argsize; if(ctxt->debugzerostack) { - if(autoffset && !(p->reg&NOSPLIT)) { + if(autoffset && !(p->from3.offset&NOSPLIT)) { // MOVW $4(R13), R1 p = appendp(ctxt, p); p->as = AMOVW; @@ -421,8 +409,8 @@ preprocess(Link *ctxt, LSym *cursym) break; } - if(!(p->reg & NOSPLIT)) - p = stacksplit(ctxt, p, autosize, !(cursym->text->reg&NEEDCTXT)); // emit split check + if(!(p->from3.offset & NOSPLIT)) + p = stacksplit(ctxt, p, autosize, !(cursym->text->from3.offset&NEEDCTXT)); // emit split check // MOVW.W R14,$-autosize(SP) p = appendp(ctxt, p); @@ -435,7 +423,7 @@ preprocess(Link *ctxt, LSym *cursym) p->to.reg = REGSP; p->spadj = autosize; - if(cursym->text->reg & WRAPPER) { + if(cursym->text->from3.offset & WRAPPER) { // if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame // // MOVW g_panic(g), R1 @@ -1048,8 +1036,6 @@ LinkArch linkarm = { .isdata = isdata, .prg = prg, .progedit = progedit, - .settextflag = settextflag, - .textflag = textflag, .minlc = 4, .ptrsize = 4, diff --git a/src/liblink/obj6.c b/src/liblink/obj6.c index 2b51061a0b..12e0606453 100644 --- a/src/liblink/obj6.c +++ b/src/liblink/obj6.c @@ -78,18 +78,6 @@ datasize(Prog *p) return p->from.scale; } -static int -textflag(Prog *p) -{ - return p->from.scale; -} - -static void -settextflag(Prog *p, int f) -{ - p->from.scale = f; -} - static void nacladdr(Link*, Prog*, Addr*); static int @@ -404,24 +392,24 @@ preprocess(Link *ctxt, LSym *cursym) cursym->args = textarg; cursym->locals = p->to.offset; - if(autoffset < StackSmall && !(p->from.scale & NOSPLIT)) { + if(autoffset < StackSmall && !(p->from3.offset & NOSPLIT)) { for(q = p; q != nil; q = q->link) { if(q->as == ACALL) goto noleaf; if((q->as == ADUFFCOPY || q->as == ADUFFZERO) && autoffset >= StackSmall - 8) goto noleaf; } - p->from.scale |= NOSPLIT; + p->from3.offset |= NOSPLIT; noleaf:; } q = nil; - if(!(p->from.scale & NOSPLIT) || (p->from.scale & WRAPPER)) { + if(!(p->from3.offset & NOSPLIT) || (p->from3.offset & WRAPPER)) { p = appendp(ctxt, p); p = load_g_cx(ctxt, p); // load g into CX } - if(!(cursym->text->from.scale & NOSPLIT)) - p = stacksplit(ctxt, p, autoffset, textarg, !(cursym->text->from.scale&NEEDCTXT), &q); // emit split check + if(!(cursym->text->from3.offset & NOSPLIT)) + p = stacksplit(ctxt, p, autoffset, textarg, !(cursym->text->from3.offset&NEEDCTXT), &q); // emit split check if(autoffset) { if(autoffset%ctxt->arch->regsize != 0) @@ -468,7 +456,7 @@ preprocess(Link *ctxt, LSym *cursym) p->to.reg = REG_BP; } - if(cursym->text->from.scale & WRAPPER) { + if(cursym->text->from3.offset & WRAPPER) { // if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame // // MOVQ g_panic(CX), BX @@ -564,7 +552,7 @@ preprocess(Link *ctxt, LSym *cursym) p2->pcond = p; } - if(ctxt->debugzerostack && autoffset && !(cursym->text->from.scale&NOSPLIT)) { + if(ctxt->debugzerostack && autoffset && !(cursym->text->from3.offset&NOSPLIT)) { // 6l -Z means zero the stack frame on entry. // This slows down function calls but can help avoid // false positives in garbage collection. @@ -1093,8 +1081,6 @@ LinkArch linkamd64 = { .isdata = isdata, .prg = prg, .progedit = progedit, - .settextflag = settextflag, - .textflag = textflag, .minlc = 1, .ptrsize = 8, @@ -1127,8 +1113,6 @@ LinkArch linkamd64p32 = { .isdata = isdata, .prg = prg, .progedit = progedit, - .settextflag = settextflag, - .textflag = textflag, .minlc = 1, .ptrsize = 4, diff --git a/src/liblink/obj8.c b/src/liblink/obj8.c index cceeeb1b87..16b0e07eac 100644 --- a/src/liblink/obj8.c +++ b/src/liblink/obj8.c @@ -69,18 +69,6 @@ datasize(Prog *p) } static int -textflag(Prog *p) -{ - return p->from.scale; -} - -static void -settextflag(Prog *p, int f) -{ - p->from.scale = f; -} - -static int canuselocaltls(Link *ctxt) { switch(ctxt->headtype) { @@ -302,12 +290,12 @@ preprocess(Link *ctxt, LSym *cursym) q = nil; - if(!(p->from.scale & NOSPLIT) || (p->from.scale & WRAPPER)) { + if(!(p->from3.offset & NOSPLIT) || (p->from3.offset & WRAPPER)) { p = appendp(ctxt, p); p = load_g_cx(ctxt, p); // load g into CX } - if(!(cursym->text->from.scale & NOSPLIT)) - p = stacksplit(ctxt, p, autoffset, !(cursym->text->from.scale&NEEDCTXT), &q); // emit split check + if(!(cursym->text->from3.offset & NOSPLIT)) + p = stacksplit(ctxt, p, autoffset, !(cursym->text->from3.offset&NEEDCTXT), &q); // emit split check if(autoffset) { p = appendp(ctxt, p); @@ -330,7 +318,7 @@ preprocess(Link *ctxt, LSym *cursym) q->pcond = p; deltasp = autoffset; - if(cursym->text->from.scale & WRAPPER) { + if(cursym->text->from3.offset & WRAPPER) { // if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame // // MOVL g_panic(CX), BX @@ -401,7 +389,7 @@ preprocess(Link *ctxt, LSym *cursym) p2->pcond = p; } - if(ctxt->debugzerostack && autoffset && !(cursym->text->from.scale&NOSPLIT)) { + if(ctxt->debugzerostack && autoffset && !(cursym->text->from3.offset&NOSPLIT)) { // 8l -Z means zero the stack frame on entry. // This slows down function calls but can help avoid // false positives in garbage collection. @@ -894,8 +882,6 @@ LinkArch link386 = { .isdata = isdata, .prg = prg, .progedit = progedit, - .settextflag = settextflag, - .textflag = textflag, .minlc = 1, .ptrsize = 4, diff --git a/src/liblink/obj9.c b/src/liblink/obj9.c index 6f7652f5f8..60fa1d66e1 100644 --- a/src/liblink/obj9.c +++ b/src/liblink/obj9.c @@ -57,18 +57,6 @@ datasize(Prog *p) return p->reg; } -static int -textflag(Prog *p) -{ - return p->reg; -} - -static void -settextflag(Prog *p, int f) -{ - p->reg = f; -} - static void progedit(Link *ctxt, Prog *p) { @@ -367,8 +355,8 @@ preprocess(Link *ctxt, LSym *cursym) autosize += 4; p->to.offset = autosize-8; - if(!(p->reg & NOSPLIT)) - p = stacksplit(ctxt, p, autosize, !(cursym->text->reg&NEEDCTXT)); // emit split check + if(!(p->from3.offset & NOSPLIT)) + p = stacksplit(ctxt, p, autosize, !(cursym->text->from3.offset&NEEDCTXT)); // emit split check q = p; if(autosize) { @@ -420,7 +408,7 @@ preprocess(Link *ctxt, LSym *cursym) if(q->as == AMOVDU) q->spadj = -aoffset; - if(cursym->text->reg & WRAPPER) { + if(cursym->text->from3.offset & WRAPPER) { // if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame // // MOVD g_panic(g), R3 @@ -970,8 +958,6 @@ LinkArch linkppc64 = { .isdata = isdata, .prg = prg, .progedit = progedit, - .settextflag = settextflag, - .textflag = textflag, .minlc = 4, .ptrsize = 8, @@ -1004,8 +990,6 @@ LinkArch linkppc64le = { .isdata = isdata, .prg = prg, .progedit = progedit, - .settextflag = settextflag, - .textflag = textflag, .minlc = 4, .ptrsize = 8, diff --git a/src/liblink/objfile.c b/src/liblink/objfile.c index bdd63ccb64..79a88db0bf 100644 --- a/src/liblink/objfile.c +++ b/src/liblink/objfile.c @@ -189,7 +189,7 @@ writeobj(Link *ctxt, Biobuf *b) s->size = p->to.offset; if(s->type == 0 || s->type == SXREF) s->type = SBSS; - flag = ctxt->arch->textflag(p); + flag = p->from3.offset; if(flag & DUPOK) s->dupok = 1; if(flag & RODATA) @@ -222,7 +222,7 @@ writeobj(Link *ctxt, Biobuf *b) else etext->next = s; etext = s; - flag = ctxt->arch->textflag(p); + flag = p->from3.offset; if(flag & DUPOK) s->dupok = 1; if(flag & NOSPLIT) |
