Commit 1f2d7bf4 authored by Russ Cox's avatar Russ Cox

liblink: require use of TYPE_ADDR, not TYPE_CONST

Add Addr-checking for all Progs on input to liblink, in liblink/pass.c,
including requiring use of TYPE_ADDR, not TYPE_CONST.
Update compilers and assemblers to satisfy checks.

Change-Id: Idac36b9f6805f0451cb541d2338992ca5eaf3963
Reviewed-on: https://go-review.googlesource.com/3801Reviewed-by: default avatarAustin Clements <austin@google.com>
parent 3e9ed273
......@@ -62,13 +62,11 @@ typedef struct Pciter Pciter;
//
// $<mem>
// Effective address of memory reference <mem>, defined above.
// NOTE: Today, on arm and ppc64, type = TYPE_CONST instead.
// Encoding: same as memory reference, but type = TYPE_ADDR.
//
// $<±integer value>
// This is a special case of $<mem>, in which only ±offset is present.
// It has a separate type for easy recognition.
// NOTE: Today, on arm and ppc64, TYPE_CONST and TYPE_ADDR are merged into just TYPE_CONST.
// Encoding:
// type = TYPE_CONST
// offset = ±integer value
......@@ -157,6 +155,7 @@ struct Addr
float64 dval;
Prog* branch;
int32 argsize; // for 5l, 8l
uint64 bits; // raw union bits, for testing if anything has been written to any field
} u;
// gotype is the name of the Go type descriptor for sym.
......
......@@ -397,24 +397,28 @@ rel:
textsize:
LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = $1;
$$.u.argsize = ArgsSizeUnknown;
}
| '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = -$2;
$$.u.argsize = ArgsSizeUnknown;
}
| LCONST '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = $1;
$$.u.argsize = $3;
}
| '-' LCONST '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = -$2;
$$.u.argsize = $4;
......@@ -429,7 +433,7 @@ ximm: '$' con
| '$' oreg
{
$$ = $2;
$$.type = TYPE_CONST;
$$.type = TYPE_ADDR;
}
| '$' LSCONST
{
......
This diff is collapsed.
......@@ -1029,7 +1029,7 @@ agenr(Node *n, Node *a, Node *res)
regalloc(&n3, types[tptr], res);
p1 = gins(AMOVW, N, &n3);
datastring(nl->val.u.sval->s, nl->val.u.sval->len, &p1->from);
p1->from.type = TYPE_CONST;
p1->from.type = TYPE_ADDR;
} else
if(isslice(nl->type) || nl->type->etype == TSTRING) {
n1 = n3;
......@@ -1552,7 +1552,7 @@ sgen(Node *n, Node *res, int64 w)
regalloc(&nend, types[TUINT32], N);
p = gins(AMOVW, &src, &nend);
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
if(dir < 0)
p->from.offset = dir;
else
......@@ -1562,11 +1562,11 @@ sgen(Node *n, Node *res, int64 w)
// move src and dest to the end of block if necessary
if(dir < 0) {
p = gins(AMOVW, &src, &src);
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.offset = w + dir;
p = gins(AMOVW, &dst, &dst);
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.offset = w + dir;
}
......
......@@ -333,7 +333,7 @@ cgen_callinter(Node *n, Node *res, int proc)
} else {
// go/defer. generate go func value.
p = gins(AMOVW, &nodo, &nodr);
p->from.type = TYPE_CONST; // REG = &(20+offset(REG)) -- i.tab->fun[f]
p->from.type = TYPE_ADDR; // REG = &(20+offset(REG)) -- i.tab->fun[f]
}
nodr.type = n->left->type;
......@@ -481,7 +481,7 @@ cgen_ret(Node *n)
p = gins(ARET, N, N);
if(n != N && n->op == ORETJMP) {
p->to.name = NAME_EXTERN;
p->to.type = TYPE_CONST;
p->to.type = TYPE_ADDR;
p->to.sym = linksym(n->left->sym);
}
}
......@@ -858,7 +858,7 @@ clearfat(Node *nl)
if(q > 128) {
regalloc(&end, types[tptr], N);
p = gins(AMOVW, &dst, &end);
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.offset = q*4;
p = gins(AMOVW, &nz, &dst);
......
......@@ -247,7 +247,7 @@ dsymptr(Sym *s, int off, Sym *x, int xoff)
p->from.offset = off;
p->from3.type = TYPE_CONST;
p->from3.offset = widthptr;
p->to.type = TYPE_CONST;
p->to.type = TYPE_ADDR;
p->to.name = NAME_EXTERN;
p->to.sym = linksym(x);
p->to.offset = xoff;
......
......@@ -254,7 +254,7 @@ isfat(Type *t)
void
afunclit(Addr *a, Node *n)
{
if(a->type == TYPE_CONST && a->name == NAME_EXTERN || a->type == TYPE_REG) {
if(a->type == TYPE_ADDR && a->name == NAME_EXTERN || a->type == TYPE_REG) {
a->type = TYPE_MEM;
if(n->op == ONAME)
a->sym = linksym(n->sym);
......@@ -1222,7 +1222,7 @@ naddr(Node *n, Addr *a, int canemitcode)
// if(a->type >= D_AX && a->type <= D_DI)
// a->type += D_INDIR;
// else
// if(a->type == TYPE_CONST)
// if(a->type == TYPE_ADDR)
// a->type = TYPE_NONE+D_INDIR;
// else
// if(a->type == TYPE_ADDR) {
......@@ -1307,7 +1307,7 @@ naddr(Node *n, Addr *a, int canemitcode)
break;
case PFUNC:
a->name = NAME_EXTERN;
a->type = TYPE_CONST;
a->type = TYPE_ADDR;
s = funcsym(s);
break;
}
......@@ -1387,11 +1387,11 @@ naddr(Node *n, Addr *a, int canemitcode)
a->etype = tptr;
switch(a->type) {
case TYPE_MEM:
a->type = TYPE_CONST;
a->type = TYPE_ADDR;
break;
case TYPE_REG:
case TYPE_CONST:
case TYPE_ADDR:
break;
default:
......
......@@ -677,7 +677,6 @@ shiftprop(Flow *r)
}
/* make the substitution */
p2->from.type = TYPE_SHIFT;
p2->from.reg = 0;
o = p->reg;
if(o == 0)
......@@ -703,6 +702,8 @@ shiftprop(Flow *r)
o |= 2<<5;
break;
}
p2->from = zprog.from;
p2->from.type = TYPE_SHIFT;
p2->from.offset = o;
if(debug['P'])
print("\t=>%P\tSUCCEED\n", p2);
......@@ -863,7 +864,7 @@ xtramodes(Graph *g, Flow *r, Adr *a)
if(p1->from.type == TYPE_REG ||
(p1->from.type == TYPE_SHIFT && (p1->from.offset&(1<<4)) == 0 &&
((p->as != AMOVB && p->as != AMOVBS) || (a == &p->from && (p1->from.offset&~0xf) == 0))) ||
(p1->from.type == TYPE_CONST &&
((p1->from.type == TYPE_ADDR || p1->from.type == TYPE_CONST) &&
p1->from.offset > -4096 && p1->from.offset < 4096))
if(nochange(uniqs(r1), r, p1)) {
if(a != &p->from || v.reg != p->to.reg)
......@@ -878,6 +879,7 @@ xtramodes(Graph *g, Flow *r, Adr *a)
/* register offset */
if(nacl)
return 0;
*a = zprog.from;
a->type = TYPE_SHIFT;
a->offset = p1->from.reg&15;
break;
......@@ -885,8 +887,10 @@ xtramodes(Graph *g, Flow *r, Adr *a)
/* scaled register offset */
if(nacl)
return 0;
*a = zprog.from;
a->type = TYPE_SHIFT;
case TYPE_CONST:
case TYPE_ADDR:
/* immediate offset */
a->offset = p1->from.offset;
break;
......@@ -1251,7 +1255,7 @@ copyau(Adr *a, Adr *v)
if(copyas(a, v))
return 1;
if(v->type == TYPE_REG) {
if(a->type == TYPE_CONST && a->reg != 0) {
if(a->type == TYPE_ADDR && a->reg != 0) {
if(a->reg == v->reg)
return 1;
} else
......@@ -1546,9 +1550,7 @@ predicate(Graph *g)
static int
isdconst(Addr *a)
{
if(a->type == TYPE_CONST && a->reg == 0)
return 1;
return 0;
return a->type == TYPE_CONST;
}
static int
......
......@@ -136,7 +136,7 @@ proginfo(ProgInfo *info, Prog *p)
if(info->flags == 0)
fatal("unknown instruction %P", p);
if(p->from.type == TYPE_CONST && p->from.sym != nil && (info->flags & LeftRead)) {
if(p->from.type == TYPE_ADDR && p->from.sym != nil && (info->flags & LeftRead)) {
info->flags &= ~LeftRead;
info->flags |= LeftAddr;
}
......
......@@ -625,7 +625,7 @@ addmove(Reg *r, int bn, int rn, int f)
// If there's a stack fixup coming (after BL newproc or BL deferproc),
// delay the load until after the fixup.
p2 = p->link;
if(p2 && p2->as == AMOVW && p2->from.type == TYPE_CONST && p2->from.reg == REGSP && p2->to.reg == REGSP && p2->to.type == TYPE_REG)
if(p2 && p2->as == AMOVW && p2->from.type == TYPE_ADDR && p2->from.reg == REGSP && p2->to.reg == REGSP && p2->to.type == TYPE_REG)
p = p2;
p1->link = p->link;
......@@ -641,7 +641,9 @@ addmove(Reg *r, int bn, int rn, int f)
a->offset = v->offset;
a->etype = v->etype;
a->type = TYPE_MEM;
if(a->etype == TARRAY || a->sym == nil)
if(a->etype == TARRAY)
a->type = TYPE_ADDR;
else if(a->sym == nil)
a->type = TYPE_CONST;
if(v->addr)
......@@ -740,8 +742,13 @@ mkvar(Reg *r, Adr *a)
if(a->reg != 0)
bit.b[0] |= RtoB(a->reg);
return bit;
case TYPE_CONST:
if(a->reg != 0)
fatal("found CONST instead of ADDR: %D", a);
break;
case TYPE_ADDR:
case TYPE_REG:
case TYPE_SHIFT:
if(a->reg != 0) {
......
......@@ -651,24 +651,28 @@ con:
textsize:
LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = $1;
$$.u.argsize = ArgsSizeUnknown;
}
| '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = -$2;
$$.u.argsize = ArgsSizeUnknown;
}
| LCONST '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = $1;
$$.u.argsize = $3;
}
| '-' LCONST '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = -$2;
$$.u.argsize = $4;
......
......@@ -552,8 +552,8 @@ static const yytype_uint16 yyrline[] =
486, 487, 490, 496, 503, 510, 517, 526, 536, 546,
552, 558, 566, 577, 581, 590, 598, 608, 611, 615,
621, 622, 626, 629, 630, 634, 638, 642, 646, 652,
658, 664, 670, 678, 679, 683, 687, 691, 695, 699,
703, 707, 711, 715
659, 666, 673, 682, 683, 687, 691, 695, 699, 703,
707, 711, 715, 719
};
#endif
......@@ -2474,6 +2474,7 @@ yyreduce:
case 119:
#line 653 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = (yyvsp[(1) - (1)].lval);
(yyval.addr).u.argsize = ArgsSizeUnknown;
......@@ -2481,8 +2482,9 @@ yyreduce:
break;
case 120:
#line 659 "a.y"
#line 660 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = -(yyvsp[(2) - (2)].lval);
(yyval.addr).u.argsize = ArgsSizeUnknown;
......@@ -2490,8 +2492,9 @@ yyreduce:
break;
case 121:
#line 665 "a.y"
#line 667 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = (yyvsp[(1) - (3)].lval);
(yyval.addr).u.argsize = (yyvsp[(3) - (3)].lval);
......@@ -2499,8 +2502,9 @@ yyreduce:
break;
case 122:
#line 671 "a.y"
#line 674 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = -(yyvsp[(2) - (4)].lval);
(yyval.addr).u.argsize = (yyvsp[(4) - (4)].lval);
......@@ -2508,70 +2512,70 @@ yyreduce:
break;
case 124:
#line 680 "a.y"
#line 684 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) + (yyvsp[(3) - (3)].lval);
}
break;
case 125:
#line 684 "a.y"
#line 688 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) - (yyvsp[(3) - (3)].lval);
}
break;
case 126:
#line 688 "a.y"
#line 692 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) * (yyvsp[(3) - (3)].lval);
}
break;
case 127:
#line 692 "a.y"
#line 696 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) / (yyvsp[(3) - (3)].lval);
}
break;
case 128:
#line 696 "a.y"
#line 700 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) % (yyvsp[(3) - (3)].lval);
}
break;
case 129:
#line 700 "a.y"
#line 704 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (4)].lval) << (yyvsp[(4) - (4)].lval);
}
break;
case 130:
#line 704 "a.y"
#line 708 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (4)].lval) >> (yyvsp[(4) - (4)].lval);
}
break;
case 131:
#line 708 "a.y"
#line 712 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) & (yyvsp[(3) - (3)].lval);
}
break;
case 132:
#line 712 "a.y"
#line 716 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) ^ (yyvsp[(3) - (3)].lval);
}
break;
case 133:
#line 716 "a.y"
#line 720 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) | (yyvsp[(3) - (3)].lval);
}
......@@ -2579,7 +2583,7 @@ yyreduce:
/* Line 1267 of yacc.c. */
#line 2583 "y.tab.c"
#line 2587 "y.tab.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
......
......@@ -472,24 +472,28 @@ imm:
textsize:
LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = $1;
$$.u.argsize = ArgsSizeUnknown;
}
| '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = -$2;
$$.u.argsize = ArgsSizeUnknown;
}
| LCONST '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = $1;
$$.u.argsize = $3;
}
| '-' LCONST '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = -$2;
$$.u.argsize = $4;
......
......@@ -543,12 +543,12 @@ static const yytype_uint16 yyrline[] =
259, 262, 267, 277, 282, 292, 297, 302, 309, 317,
327, 336, 347, 348, 351, 352, 353, 357, 361, 362,
363, 366, 367, 370, 376, 387, 393, 399, 405, 411,
417, 425, 431, 441, 447, 453, 459, 465, 473, 479,
485, 491, 499, 500, 503, 510, 517, 524, 534, 544,
554, 560, 566, 573, 582, 593, 597, 606, 614, 624,
627, 631, 637, 638, 642, 645, 646, 650, 654, 658,
662, 668, 669, 673, 677, 681, 685, 689, 693, 697,
701, 705
417, 425, 431, 441, 447, 453, 459, 465, 473, 480,
487, 494, 503, 504, 507, 514, 521, 528, 538, 548,
558, 564, 570, 577, 586, 597, 601, 610, 618, 628,
631, 635, 641, 642, 646, 649, 650, 654, 658, 662,
666, 672, 673, 677, 681, 685, 689, 693, 697, 701,
705, 709
};
#endif
......@@ -2174,7 +2174,7 @@ yyreduce:
(yyval.addr) = (yyvsp[(2) - (2)].addr);
(yyval.addr).type = TYPE_ADDR;
/*
if($2.name == D_AUTO || $2.name == D_PARAM)
if($2.name == NAME_AUTO || $2.name == NAME_PARAM)
yyerror("constant cannot be automatic: %s",
$2.sym->name);
*/
......@@ -2229,6 +2229,7 @@ yyreduce:
case 88:
#line 474 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = (yyvsp[(1) - (1)].lval);
(yyval.addr).u.argsize = ArgsSizeUnknown;
......@@ -2236,8 +2237,9 @@ yyreduce:
break;
case 89:
#line 480 "a.y"
#line 481 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = -(yyvsp[(2) - (2)].lval);
(yyval.addr).u.argsize = ArgsSizeUnknown;
......@@ -2245,8 +2247,9 @@ yyreduce:
break;
case 90:
#line 486 "a.y"
#line 488 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = (yyvsp[(1) - (3)].lval);
(yyval.addr).u.argsize = (yyvsp[(3) - (3)].lval);
......@@ -2254,8 +2257,9 @@ yyreduce:
break;
case 91:
#line 492 "a.y"
#line 495 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = -(yyvsp[(2) - (4)].lval);
(yyval.addr).u.argsize = (yyvsp[(4) - (4)].lval);
......@@ -2263,7 +2267,7 @@ yyreduce:
break;
case 94:
#line 504 "a.y"
#line 508 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2273,7 +2277,7 @@ yyreduce:
break;
case 95:
#line 511 "a.y"
#line 515 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2283,7 +2287,7 @@ yyreduce:
break;
case 96:
#line 518 "a.y"
#line 522 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2293,7 +2297,7 @@ yyreduce:
break;
case 97:
#line 525 "a.y"
#line 529 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2306,7 +2310,7 @@ yyreduce:
break;
case 98:
#line 535 "a.y"
#line 539 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2319,7 +2323,7 @@ yyreduce:
break;
case 99:
#line 545 "a.y"
#line 549 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2332,7 +2336,7 @@ yyreduce:
break;
case 100:
#line 555 "a.y"
#line 559 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2341,7 +2345,7 @@ yyreduce:
break;
case 101:
#line 561 "a.y"
#line 565 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2350,7 +2354,7 @@ yyreduce:
break;
case 102:
#line 567 "a.y"
#line 571 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2360,7 +2364,7 @@ yyreduce:
break;
case 103:
#line 574 "a.y"
#line 578 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2372,7 +2376,7 @@ yyreduce:
break;
case 104:
#line 583 "a.y"
#line 587 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2384,14 +2388,14 @@ yyreduce:
break;
case 105:
#line 594 "a.y"
#line 598 "a.y"
{
(yyval.addr) = (yyvsp[(1) - (1)].addr);
}
break;
case 106:
#line 598 "a.y"
#line 602 "a.y"
{
(yyval.addr) = (yyvsp[(1) - (6)].addr);
(yyval.addr).index = (yyvsp[(3) - (6)].lval);
......@@ -2401,7 +2405,7 @@ yyreduce:
break;
case 107:
#line 607 "a.y"
#line 611 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2412,7 +2416,7 @@ yyreduce:
break;
case 108:
#line 615 "a.y"
#line 619 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -2423,133 +2427,133 @@ yyreduce:
break;
case 109:
#line 624 "a.y"
#line 628 "a.y"
{
(yyval.lval) = 0;
}
break;
case 110:
#line 628 "a.y"
#line 632 "a.y"
{
(yyval.lval) = (yyvsp[(2) - (2)].lval);
}
break;
case 111:
#line 632 "a.y"
#line 636 "a.y"
{
(yyval.lval) = -(yyvsp[(2) - (2)].lval);
}
break;
case 113:
#line 639 "a.y"
#line 643 "a.y"
{
(yyval.lval) = NAME_AUTO;
}
break;
case 116:
#line 647 "a.y"
#line 651 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (1)].sym)->value;
}
break;
case 117:
#line 651 "a.y"
#line 655 "a.y"
{
(yyval.lval) = -(yyvsp[(2) - (2)].lval);
}
break;
case 118:
#line 655 "a.y"
#line 659 "a.y"
{
(yyval.lval) = (yyvsp[(2) - (2)].lval);
}
break;
case 119:
#line 659 "a.y"
#line 663 "a.y"
{
(yyval.lval) = ~(yyvsp[(2) - (2)].lval);
}
break;
case 120:
#line 663 "a.y"
#line 667 "a.y"
{
(yyval.lval) = (yyvsp[(2) - (3)].lval);
}
break;
case 122:
#line 670 "a.y"
#line 674 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) + (yyvsp[(3) - (3)].lval);
}
break;
case 123:
#line 674 "a.y"
#line 678 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) - (yyvsp[(3) - (3)].lval);
}
break;
case 124:
#line 678 "a.y"
#line 682 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) * (yyvsp[(3) - (3)].lval);
}
break;
case 125:
#line 682 "a.y"
#line 686 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) / (yyvsp[(3) - (3)].lval);
}
break;
case 126:
#line 686 "a.y"
#line 690 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) % (yyvsp[(3) - (3)].lval);
}
break;
case 127:
#line 690 "a.y"
#line 694 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (4)].lval) << (yyvsp[(4) - (4)].lval);
}
break;
case 128:
#line 694 "a.y"
#line 698 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (4)].lval) >> (yyvsp[(4) - (4)].lval);
}
break;
case 129:
#line 698 "a.y"
#line 702 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) & (yyvsp[(3) - (3)].lval);
}
break;
case 130:
#line 702 "a.y"
#line 706 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) ^ (yyvsp[(3) - (3)].lval);
}
break;
case 131:
#line 706 "a.y"
#line 710 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) | (yyvsp[(3) - (3)].lval);
}
......@@ -2557,7 +2561,7 @@ yyreduce:
/* Line 1267 of yacc.c. */
#line 2561 "y.tab.c"
#line 2565 "y.tab.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
......
......@@ -826,24 +826,28 @@ mask:
textsize:
LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = $1;
$$.u.argsize = ArgsSizeUnknown;
}
| '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = -$2;
$$.u.argsize = ArgsSizeUnknown;
}
| LCONST '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = $1;
$$.u.argsize = $3;
}
| '-' LCONST '-' LCONST
{
$$ = nullgen;
$$.type = TYPE_TEXTSIZE;
$$.offset = -$2;
$$.u.argsize = $4;
......@@ -853,7 +857,7 @@ ximm:
'$' addr
{
$$ = $2;
$$.type = TYPE_CONST;
$$.type = TYPE_ADDR;
}
| '$' LSCONST
{
......
......@@ -651,11 +651,11 @@ static const yytype_uint16 yyrline[] =
567, 571, 578, 582, 589, 598, 609, 616, 621, 633,
638, 651, 659, 667, 678, 684, 690, 701, 709, 710,
713, 721, 729, 737, 745, 751, 759, 762, 770, 776,
784, 790, 798, 806, 827, 833, 839, 845, 853, 858,
866, 872, 879, 887, 888, 896, 903, 913, 914, 923,
931, 939, 948, 949, 952, 955, 959, 965, 966, 967,
970, 971, 975, 979, 983, 987, 993, 994, 998, 1002,
1006, 1010, 1014, 1018, 1022, 1026, 1030
784, 790, 798, 806, 827, 834, 841, 848, 857, 862,
870, 876, 883, 891, 892, 900, 907, 917, 918, 927,
935, 943, 952, 953, 956, 959, 963, 969, 970, 971,
974, 975, 979, 983, 987, 991, 997, 998, 1002, 1006,
1010, 1014, 1018, 1022, 1026, 1030, 1034
};
#endif
......@@ -2970,6 +2970,7 @@ yyreduce:
case 144:
#line 828 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = (yyvsp[(1) - (1)].lval);
(yyval.addr).u.argsize = ArgsSizeUnknown;
......@@ -2977,8 +2978,9 @@ yyreduce:
break;
case 145:
#line 834 "a.y"
#line 835 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = -(yyvsp[(2) - (2)].lval);
(yyval.addr).u.argsize = ArgsSizeUnknown;
......@@ -2986,8 +2988,9 @@ yyreduce:
break;
case 146:
#line 840 "a.y"
#line 842 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = (yyvsp[(1) - (3)].lval);
(yyval.addr).u.argsize = (yyvsp[(3) - (3)].lval);
......@@ -2995,8 +2998,9 @@ yyreduce:
break;
case 147:
#line 846 "a.y"
#line 849 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_TEXTSIZE;
(yyval.addr).offset = -(yyvsp[(2) - (4)].lval);
(yyval.addr).u.argsize = (yyvsp[(4) - (4)].lval);
......@@ -3004,15 +3008,15 @@ yyreduce:
break;
case 148:
#line 854 "a.y"
#line 858 "a.y"
{
(yyval.addr) = (yyvsp[(2) - (2)].addr);
(yyval.addr).type = TYPE_CONST;
(yyval.addr).type = TYPE_ADDR;
}
break;
case 149:
#line 859 "a.y"
#line 863 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_SCONST;
......@@ -3021,7 +3025,7 @@ yyreduce:
break;
case 150:
#line 867 "a.y"
#line 871 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_FCONST;
......@@ -3030,7 +3034,7 @@ yyreduce:
break;
case 151:
#line 873 "a.y"
#line 877 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_FCONST;
......@@ -3039,7 +3043,7 @@ yyreduce:
break;
case 152:
#line 880 "a.y"
#line 884 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_CONST;
......@@ -3048,7 +3052,7 @@ yyreduce:
break;
case 154:
#line 889 "a.y"
#line 893 "a.y"
{
if((yyval.lval) < 0 || (yyval.lval) >= NREG)
print("register value out of range\n");
......@@ -3057,7 +3061,7 @@ yyreduce:
break;
case 155:
#line 897 "a.y"
#line 901 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -3067,7 +3071,7 @@ yyreduce:
break;
case 156:
#line 904 "a.y"
#line 908 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -3078,7 +3082,7 @@ yyreduce:
break;
case 158:
#line 915 "a.y"
#line 919 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -3088,7 +3092,7 @@ yyreduce:
break;
case 159:
#line 924 "a.y"
#line 928 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -3099,7 +3103,7 @@ yyreduce:
break;
case 160:
#line 932 "a.y"
#line 936 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -3110,7 +3114,7 @@ yyreduce:
break;
case 161:
#line 940 "a.y"
#line 944 "a.y"
{
(yyval.addr) = nullgen;
(yyval.addr).type = TYPE_MEM;
......@@ -3121,126 +3125,126 @@ yyreduce:
break;
case 164:
#line 952 "a.y"
#line 956 "a.y"
{
(yyval.lval) = 0;
}
break;
case 165:
#line 956 "a.y"
#line 960 "a.y"
{
(yyval.lval) = (yyvsp[(2) - (2)].lval);
}
break;
case 166:
#line 960 "a.y"
#line 964 "a.y"
{
(yyval.lval) = -(yyvsp[(2) - (2)].lval);
}
break;
case 171:
#line 972 "a.y"
#line 976 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (1)].sym)->value;
}
break;
case 172:
#line 976 "a.y"
#line 980 "a.y"
{
(yyval.lval) = -(yyvsp[(2) - (2)].lval);
}
break;
case 173:
#line 980 "a.y"
#line 984 "a.y"
{
(yyval.lval) = (yyvsp[(2) - (2)].lval);
}
break;
case 174:
#line 984 "a.y"
#line 988 "a.y"
{
(yyval.lval) = ~(yyvsp[(2) - (2)].lval);
}
break;
case 175:
#line 988 "a.y"
#line 992 "a.y"
{
(yyval.lval) = (yyvsp[(2) - (3)].lval);
}
break;
case 177:
#line 995 "a.y"
#line 999 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) + (yyvsp[(3) - (3)].lval);
}
break;
case 178:
#line 999 "a.y"
#line 1003 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) - (yyvsp[(3) - (3)].lval);
}
break;
case 179:
#line 1003 "a.y"
#line 1007 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) * (yyvsp[(3) - (3)].lval);
}
break;
case 180:
#line 1007 "a.y"
#line 1011 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) / (yyvsp[(3) - (3)].lval);
}
break;
case 181:
#line 1011 "a.y"
#line 1015 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) % (yyvsp[(3) - (3)].lval);
}
break;
case 182:
#line 1015 "a.y"
#line 1019 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (4)].lval) << (yyvsp[(4) - (4)].lval);
}
break;
case 183:
#line 1019 "a.y"
#line 1023 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (4)].lval) >> (yyvsp[(4) - (4)].lval);
}
break;
case 184:
#line 1023 "a.y"
#line 1027 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) & (yyvsp[(3) - (3)].lval);
}
break;
case 185:
#line 1027 "a.y"
#line 1031 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) ^ (yyvsp[(3) - (3)].lval);
}
break;
case 186:
#line 1031 "a.y"
#line 1035 "a.y"
{
(yyval.lval) = (yyvsp[(1) - (3)].lval) | (yyvsp[(3) - (3)].lval);
}
......@@ -3248,7 +3252,7 @@ yyreduce:
/* Line 1267 of yacc.c. */
#line 3252 "y.tab.c"
#line 3256 "y.tab.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
......
......@@ -749,7 +749,7 @@ agenr(Node *n, Node *a, Node *res)
regalloc(&n3, types[tptr], res);
p1 = gins(AMOVD, N, &n3);
datastring(nl->val.u.sval->s, nl->val.u.sval->len, &p1->from);
p1->from.type = TYPE_CONST;
p1->from.type = TYPE_ADDR;
} else if(isslice(nl->type) || nl->type->etype == TSTRING) {
n1 = n3;
n1.op = OINDREG;
......@@ -1483,7 +1483,7 @@ sgen(Node *n, Node *ns, int64 w)
if(c >= 4) {
regalloc(&nend, types[tptr], N);
p = gins(AMOVD, &src, &nend);
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.offset = w;
}
}
......
......@@ -338,7 +338,7 @@ cgen_callinter(Node *n, Node *res, int proc)
} else {
// go/defer. generate go func value.
p = gins(AMOVD, &nodo, &nodr); // REG = &(32+offset(REG)) -- i.tab->fun[f]
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
}
nodr.type = n->left->type;
......@@ -482,7 +482,7 @@ cgen_ret(Node *n)
p = gins(ARET, N, N);
if(n != N && n->op == ORETJMP) {
p->to.name = NAME_EXTERN;
p->to.type = TYPE_CONST;
p->to.type = TYPE_ADDR;
p->to.sym = linksym(n->left->sym);
}
}
......@@ -923,7 +923,7 @@ clearfat(Node *nl)
regalloc(&end, types[tptr], N);
p = gins(AMOVD, &dst, &end);
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.offset = q*8;
p = gins(AMOVDU, &r0, &dst);
......
......@@ -144,7 +144,7 @@ gdatastring(Node *nam, Strlit *sval)
datastring(sval->s, sval->len, &p->to);
p->from3.type = TYPE_CONST;
p->from3.offset = types[tptr]->width;
p->to.type = TYPE_CONST;
p->to.type = TYPE_ADDR;
p->to.etype = simtype[tptr];
nodconst(&nod1, types[TINT], sval->len);
......@@ -193,7 +193,7 @@ dgostrlitptr(Sym *s, int off, Strlit *lit)
p->from3.type = TYPE_CONST;
p->from3.offset = widthptr;
datagostring(lit, &p->to);
p->to.type = TYPE_CONST;
p->to.type = TYPE_ADDR;
p->to.etype = simtype[TINT];
off += widthptr;
......@@ -230,7 +230,7 @@ dsymptr(Sym *s, int off, Sym *x, int xoff)
p->from.offset = off;
p->from3.type = TYPE_CONST;
p->from3.offset = widthptr;
p->to.type = TYPE_CONST;
p->to.type = TYPE_ADDR;
p->to.name = NAME_EXTERN;
p->to.sym = linksym(x);
p->to.offset = xoff;
......
......@@ -253,7 +253,7 @@ isfat(Type *t)
void
afunclit(Addr *a, Node *n)
{
if(a->type == TYPE_CONST && a->name == NAME_EXTERN) {
if(a->type == TYPE_ADDR && a->name == NAME_EXTERN) {
a->type = TYPE_MEM;
a->sym = linksym(n->sym);
}
......@@ -1049,7 +1049,7 @@ gins(int as, Node *f, Node *t)
break;
case AMOVD:
case AMOVDU:
if(af.type == TYPE_CONST)
if(af.type == TYPE_CONST || af.type == TYPE_ADDR)
break;
w = 8;
break;
......@@ -1153,7 +1153,7 @@ naddr(Node *n, Addr *a, int canemitcode)
break;
case PFUNC:
a->name = NAME_EXTERN;
a->type = TYPE_CONST;
a->type = TYPE_ADDR;
a->width = widthptr;
s = funcsym(s);
break;
......@@ -1277,7 +1277,7 @@ naddr(Node *n, Addr *a, int canemitcode)
a->etype = tptr;
switch(a->type) {
case TYPE_MEM:
a->type = TYPE_CONST;
a->type = TYPE_ADDR;
break;
case TYPE_REG:
......
......@@ -185,7 +185,7 @@ loop1:
case AXOR:
case AOR:
/* irregular instructions */
if(p1->from.type == TYPE_CONST)
if(p1->from.type == TYPE_CONST || p1->from.type == TYPE_ADDR)
continue;
break;
}
......@@ -342,7 +342,7 @@ excise(Flow *r)
static int
regzer(Addr *a)
{
if(a->type == TYPE_CONST)
if(a->type == TYPE_CONST || a->type == TYPE_ADDR)
if(a->sym == nil && a->reg == 0)
if(a->offset == 0)
return 1;
......@@ -890,7 +890,7 @@ copyau(Addr *a, Addr *v)
if(copyas(a, v))
return 1;
if(v->type == TYPE_REG)
if(a->type == TYPE_MEM || (a->type == TYPE_CONST && a->reg != 0))
if(a->type == TYPE_MEM || (a->type == TYPE_ADDR && a->reg != 0))
if(v->reg == a->reg)
return 1;
return 0;
......
......@@ -142,20 +142,20 @@ proginfo(ProgInfo *info, Prog *p)
info->flags |= /*CanRegRead |*/ RightRead;
}
if((p->from.type == TYPE_MEM || p->from.type == TYPE_CONST) && p->from.reg != 0) {
if((p->from.type == TYPE_MEM || p->from.type == TYPE_ADDR) && p->from.reg != 0) {
info->regindex |= RtoB(p->from.reg);
if(info->flags & PostInc) {
info->regset |= RtoB(p->from.reg);
}
}
if((p->to.type == TYPE_MEM || p->to.type == TYPE_CONST) && p->to.reg != 0) {
if((p->to.type == TYPE_MEM || p->to.type == TYPE_ADDR) && p->to.reg != 0) {
info->regindex |= RtoB(p->to.reg);
if(info->flags & PostInc) {
info->regset |= RtoB(p->to.reg);
}
}
if(p->from.type == TYPE_CONST && p->from.sym != nil && (info->flags & LeftRead)) {
if(p->from.type == TYPE_ADDR && p->from.sym != nil && (info->flags & LeftRead)) {
info->flags &= ~LeftRead;
info->flags |= LeftAddr;
}
......
......@@ -568,7 +568,9 @@ addmove(Reg *r, int bn, int rn, int f)
a->offset = v->offset;
a->etype = v->etype;
a->type = TYPE_MEM;
if(a->etype == TARRAY || a->sym == nil)
if(a->etype == TARRAY)
a->type = TYPE_ADDR;
else if(a->sym == nil)
a->type = TYPE_CONST;
if(v->addr)
......@@ -669,6 +671,7 @@ mkvar(Reg *r, Adr *a)
case TYPE_FCONST:
case TYPE_SCONST:
case TYPE_MEM:
case TYPE_ADDR:
break;
case TYPE_REG:
......
......@@ -588,7 +588,7 @@ asmoutnacl(Link *ctxt, int32 origPC, Prog *p, Optab *o, uint32 *out)
// make p into MOVW $X(R), R11
p->as = AMOVW;
p->from = *a;
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->to = zprog.to;
p->to.type = TYPE_REG;
p->to.reg = REG_R11;
......@@ -1125,6 +1125,7 @@ aclass(Link *ctxt, Addr *a)
return C_TEXTSIZE;
case TYPE_CONST:
case TYPE_ADDR:
switch(a->name) {
case TYPE_NONE:
......
......@@ -673,6 +673,7 @@ aclass(Link *ctxt, Addr *a)
return C_TEXTSIZE;
case TYPE_CONST:
case TYPE_ADDR:
switch(a->name) {
case TYPE_NONE:
ctxt->instoffset = a->offset;
......
......@@ -157,6 +157,7 @@ Dconv(Fmt *fp)
break;
case TYPE_CONST:
case TYPE_ADDR:
if(a->reg != 0)
sprint(str, "$%M(%R)", a, a->reg);
else
......@@ -227,7 +228,6 @@ RAconv(Fmt *fp)
sprint(str, "GOK-reglist");
switch(a->type) {
case TYPE_CONST:
case TYPE_TEXTSIZE:
if(a->reg != 0)
break;
if(a->sym != nil)
......
......@@ -161,6 +161,7 @@ Dconv(Fmt *fp)
break;
case TYPE_CONST:
case TYPE_ADDR:
if(a->reg != 0)
sprint(str, "$%M(%R)", a, a->reg);
else
......
......@@ -151,9 +151,9 @@ progedit(Link *ctxt, Prog *p)
if(ctxt->tlsg == nil)
ctxt->tlsg = linklookup(ctxt, "runtime.tlsg", 0);
if(p->from.type == TYPE_CONST && p->from.name == NAME_EXTERN && p->from.sym == ctxt->tlsg)
if(p->from.type == TYPE_ADDR && p->from.name == NAME_EXTERN && p->from.sym == ctxt->tlsg)
p->from.type = TYPE_MEM;
if(p->to.type == TYPE_CONST && p->to.name == NAME_EXTERN && p->to.sym == ctxt->tlsg)
if(p->to.type == TYPE_ADDR && p->to.name == NAME_EXTERN && p->to.sym == ctxt->tlsg)
p->to.type = TYPE_MEM;
}
}
......@@ -227,7 +227,7 @@ preprocess(Link *ctxt, LSym *cursym)
// MOVW $4(R13), R1
p = appendp(ctxt, p);
p->as = AMOVW;
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.reg = REG_R13;
p->from.offset = 4;
p->to.type = TYPE_REG;
......@@ -236,7 +236,7 @@ preprocess(Link *ctxt, LSym *cursym)
// MOVW $n(R13), R2
p = appendp(ctxt, p);
p->as = AMOVW;
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.reg = REG_R13;
p->from.offset = 4 + autoffset;
p->to.type = TYPE_REG;
......@@ -631,7 +631,7 @@ preprocess(Link *ctxt, LSym *cursym)
p->spadj = -p->to.offset;
if((p->scond & C_PBIT) && p->from.type == TYPE_MEM && p->from.reg == REGSP && p->to.reg != REGPC)
p->spadj = -p->from.offset;
if(p->from.type == TYPE_CONST && p->from.reg == REGSP && p->to.type == TYPE_REG && p->to.reg == REGSP)
if(p->from.type == TYPE_ADDR && p->from.reg == REGSP && p->to.type == TYPE_REG && p->to.reg == REGSP)
p->spadj = -p->from.offset;
break;
}
......@@ -747,7 +747,7 @@ stacksplit(Link *ctxt, Prog *p, int32 framesize, int noctxt)
// CMP stackguard, R2
p = appendp(ctxt, p);
p->as = AMOVW;
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.reg = REGSP;
p->from.offset = -framesize;
p->to.type = TYPE_REG;
......@@ -777,7 +777,7 @@ stacksplit(Link *ctxt, Prog *p, int32 framesize, int noctxt)
p = appendp(ctxt, p);
p->as = AMOVW;
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.reg = REGSP;
p->from.offset = StackGuard;
p->to.type = TYPE_REG;
......@@ -794,7 +794,7 @@ stacksplit(Link *ctxt, Prog *p, int32 framesize, int noctxt)
p = appendp(ctxt, p);
p->as = AMOVW;
p->from.type = TYPE_CONST;
p->from.type = TYPE_ADDR;
p->from.offset = framesize + (StackGuard - StackSmall);
p->to.type = TYPE_REG;
p->to.reg = REG_R3;
......
......@@ -67,6 +67,83 @@ brloop(Link *ctxt, Prog *p)
return q;
}
static void
checkaddr(Link *ctxt, Prog *p, Addr *a)
{
// Check expected encoding, especially TYPE_CONST vs TYPE_ADDR.
switch(a->type) {
case TYPE_NONE:
return;
case TYPE_BRANCH:
if(a->reg != 0 || a->index != 0 || a->scale != 0 || a->name != 0)
break;
return;
case TYPE_TEXTSIZE:
if(a->reg != 0 || a->index != 0 || a->scale != 0 || a->name != 0)
break;
return;
case TYPE_MEM:
//if(a->u.bits != 0)
// break;
return;
case TYPE_CONST:
// TODO(rsc): After fixing SHRQ, check a->index != 0 too.
if(a->name != 0 || a->sym != 0 || a->reg != 0) {
ctxt->diag("argument %D is TYPE_CONST, should be TYPE_ADDR, in %P", a, p);
return;
}
if(a->reg != 0 || a->scale != 0 || a->name != 0 || a->sym != nil || a->u.bits != 0)
break;
return;
case TYPE_FCONST:
case TYPE_SCONST:
if(a->reg != 0 || a->index != 0 || a->scale != 0 || a->name != 0 || a->offset != 0 || a->sym != nil)
break;
return;
case TYPE_REG:
// TODO(rsc): After fixing PINSRQ, check a->offset != 0 too.
// TODO(rsc): After fixing SHRQ, check a->index != 0 too.
if(a->scale != 0 || a->name != 0 || a->sym != nil)
break;
return;
case TYPE_ADDR:
if(a->u.bits != 0)
break;
if(a->reg == 0 && a->index == 0 && a->scale == 0 && a->name == 0 && a->sym == nil)
ctxt->diag("argument %D is TYPE_ADDR, should be TYPE_CONST, in %P", a, p);
return;
case TYPE_SHIFT:
if(a->index != 0 || a->scale != 0 || a->name != 0 || a->sym != nil || a->u.bits != 0)
break;
return;
case TYPE_REGREG:
if(a->index != 0 || a->scale != 0 || a->name != 0 || a->sym != nil || a->u.bits != 0)
break;
return;
case TYPE_REGREG2:
return;
case TYPE_INDIR:
// Expect sym and name to be set, nothing else.
// Technically more is allowed, but this is only used for *name(SB).
if(a->reg != 0 || a->index != 0 || a->scale != 0 || a->name == 0 || a->offset != 0 || a->sym == nil || a->u.bits != 0)
break;
return;
}
ctxt->diag("invalid encoding for argument %D in %P", a, p);
}
void
linkpatch(Link *ctxt, LSym *sym)
{
......@@ -77,6 +154,10 @@ linkpatch(Link *ctxt, LSym *sym)
ctxt->cursym = sym;
for(p = sym->text; p != nil; p = p->link) {
checkaddr(ctxt, p, &p->from);
checkaddr(ctxt, p, &p->from3);
checkaddr(ctxt, p, &p->to);
if(ctxt->arch->progedit)
ctxt->arch->progedit(ctxt, p);
if(p->to.type != TYPE_BRANCH)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment