aboutsummaryrefslogtreecommitdiff
path: root/src/liblink
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2015-01-29 14:58:54 -0500
committerRuss Cox <rsc@golang.org>2015-02-03 18:22:15 +0000
commit77a415e5a698e8f897aed8aa64db6855b8f952fc (patch)
treea2adb923b983adfd5301f0d87c9c26949e22d9d6 /src/liblink
parent72521319c733e5de62bb837508ea9fa2b1f3a0a2 (diff)
downloadgo-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.c1
-rw-r--r--src/liblink/asm9.c4
-rw-r--r--src/liblink/list5.c2
-rw-r--r--src/liblink/list6.c6
-rw-r--r--src/liblink/list8.c6
-rw-r--r--src/liblink/list9.c11
-rw-r--r--src/liblink/obj5.c22
-rw-r--r--src/liblink/obj6.c30
-rw-r--r--src/liblink/obj8.c24
-rw-r--r--src/liblink/obj9.c22
-rw-r--r--src/liblink/objfile.c4
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)