if(n == N || n->type == T)
return;
- lno = dynlineno;
- if(n->op != ONAME)
- dynlineno = n->lineno; // for diagnostics
+ lno = setlineno(n);
if(res == N || res->type == T)
fatal("cgen: res nil");
goto ret;
ret:
- dynlineno = lno;
+ lineno = lno;
}
void
{
Node *nl, *nr;
Node n1, n2, n3, tmp;
- ulong w, lno;
+ ulong w;
Type *t;
-
+ long lno;
if(debug['g']) {
dump("\nagen-res", res);
if(n == N || n->type == T)
return;
+ lno = setlineno(n);
+
if(!isptr[res->type->etype])
fatal("agen: not tptr: %T", res->type);
- lno = dynlineno;
- if(n->op != ONAME)
- dynlineno = n->lineno; // for diagnostics
-
if(n->addable) {
regalloc(&n1, types[tptr], res);
gins(ALEAQ, n, &n1);
}
ret:
- dynlineno = lno;
+ lineno = lno;
}
vlong
if(n == N)
n = booltrue;
- lno = dynlineno;
- if(n->op != ONAME)
- dynlineno = n->lineno; // for diagnostics
+ lno = setlineno(n);
nl = n->left;
nr = n->right;
goto ret;
ret:
- dynlineno = lno;
+ lineno = lno;
}
void
sgen(Node *n, Node *ns, ulong w)
{
Node nodl, nodr;
- long c;
+ long c, lno;
+
+ lno = setlineno(n);
if(debug['g']) {
dump("\nsgen-res", ns);
gins(AREP, N, N); // repeat
gins(AMOVSB, N, N); // MOVB *(SI)+,*(DI)+
}
+
+ lineno = lno;
}
if(fn->nbody == N)
return;
- lno = dynlineno;
+ lno = setlineno(fn);
curfn = fn;
- dynlineno = curfn->lineno; // for diagnostics
+ lineno = curfn->lineno; // for diagnostics
dowidth(curfn->type);
walk(curfn);
if(nerrors != 0)
- return;
+ goto ret;
allocparams();
if(debug['f'])
frame(0);
- dynlineno = lno;;
+ret:
+ lineno = lno;
}
void
Prog *p1, *p2, *p3;
Sym *s;
- lno = dynlineno;
+ lno = setlineno(n);
loop:
if(n == N)
goto ret;
- dynlineno = n->lineno; // for diagnostics
+ setlineno(n);
switch(n->op) {
default:
}
ret:
- dynlineno = lno;
+ lineno = lno;
}
void
Node nodo, nodr, nodt;
Sym *s;
char *e;
- long o;
+ long o,lno;
+
+ lno = setlineno(n);
// stack offset
memset(&nodo, 0, sizeof(nodo));
gins(ALEAQ, &nodo, res);
regfree(&nodr);
+ lineno = lno;
}
void
// walk. gen binary search for
// sequence of constant cases
- lno = dynlineno;
+ lno = setlineno(n);
p1 = gbranch(AJMP, T);
s0 = C;
dflt = P;
c1 = listfirst(&save1, &n->nbody);
while(c1 != N) {
- dynlineno = c1->lineno; // for diagnostics
+ lineno = c1->lineno; // for diagnostics
if(c1->op != OCASE) {
if(s0 == C && dflt == P)
yyerror("unreachable statements in a switch");
patch(gbranch(AJMP, T), breakpc);
ret:
- dynlineno = lno;
+ lineno = lno;
}
void
{
Node *i, *f;
Node tmpi, nodo, nodr, nodsp;
+ long lno;
+
+ lno = setlineno(n);
i = n->left;
if(i->op != ODOTINTER)
regfree(&nodr);
setmaxarg(n->left->type);
+ lineno = lno;
}
void
cgen_callmeth(Node *n)
{
Node *l;
+ long lno;
// generate a rewrite for method call
// (p.f)(...) goes to (f)(p,...)
+ lno = setlineno(n);
+
l = n->left;
if(l->op != ODOTMETH)
fatal("cgen_callmeth: not dotmethod: %N");
if(n->left->op == ONAME)
n->left->class = PEXTERN;
cgen_call(n);
+ lineno = lno;
}
void
{
Type *t;
Node nod, afun;
+ long lno;
if(n == N)
return;
+ lno = setlineno(n);
+
if(n->left->ullman >= UINF) {
// if name involves a fn call
// precompute the address of the fn
cgen_as(&nod, &afun, 0);
gins(ACALL, N, &nod);
regfree(&nod);
- return;
+ goto ret;
}
// call pointer
cgen_as(&nod, n->left, 0);
gins(ACALL, N, &nod);
regfree(&nod);
- return;
+ goto ret;
}
// call direct
n->left->method = 1;
gins(ACALL, N, n->left);
+
+ret:
+ lineno = lno;
}
void
Node nod;
Type *fp, *t;
Iter flist;
+ long lno;
+
+ lno = setlineno(n);
t = n->left->type;
if(t->etype == TPTR32 || t->etype == TPTR64)
nod.xoffset = fp->width;
nod.type = fp->type;
cgen_as(res, &nod, 0);
+ lineno = lno;
}
void
Node nod1, nod2;
Type *fp, *t;
Iter flist;
+ long lno;
+
+ lno = setlineno(n);
t = n->left->type;
if(isptr[t->etype])
nod1.type = fp->type;
gins(ALEAQ, &nod1, res);
+ lineno = lno;
}
void
cgen_ret(Node *n)
{
+ long lno;
+
+ lno = setlineno(n);
gen(n->left); // copy out args
gins(ARET, N, N);
+ lineno = lno;
}
void
{
Node n1, n2, n3, n4;
Node *nl, *nr;
+ long lno;
+
+ lno = setlineno(n);
nl = n->left;
nr = n->right;
regfree(&n1);
regfree(&n2);
regfree(&n4);
+ lineno = lno;
}
void
Node nc, n1;
Type *tl;
ulong w, c;
+ long lno;
if(nl == N)
return;
if(tl == T)
return;
+ lno = setlineno(nl);
+
if(nr == N || isnil(nr)) {
if(isfat(tl)) {
/* clear a fat object */
gins(AREP, N, N); // repeat
gins(ASTOSB, N, N); // STOB AL,*(DI)+
}
- return;
+ goto ret;
}
/* invent a "zero" for the rhs */
// gins(AMOVQ, &nc, &n1);
// n1.xoffset += widthptr;
// gins(AMOVQ, &nc, &n1);
-// return;
+// goto ret;
}
nr->op = OLITERAL;
fatal("cgen_as both sides call");
}
cgen(nr, nl);
+
+ret:
+ lineno = lno;
}
int
{
Node n1, n2, n3;
int a, rax, rdx;
+ long lno;
+ lno = setlineno(nl);
rax = reg[D_AX];
rdx = reg[D_DX];
gins(AMOVQ, &n3, &n1);
regfree(&n3);
- return;
+ goto ret;
}
// clean out the DX register
gins(AMOVQ, &n3, &n2);
regfree(&n3);
- return;
+ goto ret;
}
a = optoas(op, nl->type);
regfree(&n1);
regfree(&n2);
+
+ret:
+ lineno = lno;
}
/*
{
Node n1, n2;
int a, rcl;
+ long lno;
+
+ lno = setlineno(nl);
a = optoas(op, nl->type);
gins(a, nr, &n1);
gmove(&n1, res);
regfree(&n1);
- return;
+ goto ret;
}
rcl = reg[D_CX];
gins(AMOVQ, &n2, &n1);
regfree(&n2);
- return;
+ goto ret;
}
regalloc(&n2, nl->type, res); // can one shift the CL register?
regfree(&n1);
regfree(&n2);
+
+ret:
+ lineno = lno;
}
clearp(pc);
p->as = as;
- p->lineno = dynlineno;
+ p->lineno = lineno;
p->link = pc;
return p;
}
Dcl *d;
long lno;
- lno = dynlineno;
+ lno = lineno;
Bprint(bout, " import\n");
Bprint(bout, " ((\n");
// print it depth first
for(d=exportlist->forw; d!=D; d=d->forw) {
- dynlineno = d->lineno;
+ lineno = d->lineno;
dumpe(d->dsym);
}
Bprint(bout, " ))\n");
- dynlineno = lno;
+ lineno = lno;
}
/*
EXTERN int nerrors;
EXTERN char namebuf[NSYMB];
EXTERN char debug[256];
-EXTERN long dynlineno;
EXTERN Sym* hash[NHASH];
EXTERN Sym* dclstack;
EXTERN Sym* b0stack;
void warn(char*, ...);
void fatal(char*, ...);
void linehist(char*, long);
+long setlineno(Node*);
Node* nod(int, Node*, Node*);
Node* list(Node*, Node*);
Type* typ(int);
{
va_list arg;
- print("%L: ");
+ print("%L: ", lineno);
va_start(arg, fmt);
vfprint(1, fmt, arg);
va_end(arg);
{
va_list arg;
- print("%L: ");
+ print("%L: ", lineno);
va_start(arg, fmt);
vfprint(1, fmt, arg);
va_end(arg);
{
va_list arg;
- print("%L: fatal error: ");
+ print("%L: fatal error: ", lineno);
va_start(arg, fmt);
vfprint(1, fmt, arg);
va_end(arg);
Hist *h;
char *cp;
- if(debug['i'])
- if(file != nil) {
- if(off < 0)
- print("%L: pragma %s\n", file);
- else
- print("%L: import %s\n", file);
- } else
- print("%L: <eof>\n");
+ if(debug['i']) {
+ if(file != nil) {
+ if(off < 0)
+ print("pragma %s at line %L\n", file, lineno);
+ else
+ print("import %s at line %L\n", file, lineno);
+ } else
+ print("end of import at line %L\n", lineno);
+ }
if(off < 0 && file[0] != '/') {
cp = mal(strlen(file) + strlen(pathname) + 2);
ehist = h;
}
+long
+setlineno(Node *n)
+{
+ long lno;
+
+ lno = lineno;
+ if(n != N && n->op != ONAME)
+ lineno = n->lineno;
+ return lno;
+}
+
ulong
stringhash(char *p)
{
Dcl *d;
d = mal(sizeof(*d));
- d->lineno = dynlineno;
+ d->lineno = lineno;
return d;
}
n->op = op;
n->left = nleft;
n->right = nright;
- n->lineno = dynlineno;
- if(dynlineno == 0)
- n->lineno = lineno;
+ n->lineno = lineno;
return n;
}
int i, n;
Hist *h;
- lno = dynlineno;
- if(lno == 0)
- lno = lineno;
+ lno = va_arg(fp->args, long);
n = 0;
for(h=hist; h!=H; h=h->link) {
lno = a[i].incl->line - 1; /* now print out start of this file */
}
if(n == 0)
- strcat(str, "<eof>");
+ strcat(str, "<epoch>");
+ret:
return fmtstrcpy(fp, str);
}
* compile-time constants are evaluated.
*/
- lno = dynlineno;
+ lno = setlineno(n);
if(top == Exxx || top == Eyyy) {
dump("", n);
fatal("walktype: bad top=%d", top);
loop:
if(n == N)
goto ret;
- if(n->op != ONAME)
- dynlineno = n->lineno; // for diagnostics
+ setlineno(n);
if(debug['w'] > 1 && top == Etop && n->op != OLIST)
dump("walk-before", n);
dump("walk", n);
ullmancalc(n);
- dynlineno = lno;
+ lineno = lno;
}
/*
Node *r, *c, *on;
long lno, l;
- lno = dynlineno;
- dynlineno = n->lineno;
+ lno = setlineno(n);
switch(n->op) {
default:
}
walktype(r, top);
- dynlineno = lno;
+ lineno = lno;
return r;
}
Node *on;
int alg1, alg2, cl, cr;
- lno = dynlineno;
- dynlineno = n->lineno;
+ lno = setlineno(n);
//dump("mapop", n);
break;
}
- dynlineno = lno;
+ lineno = lno;
return r;
shape:
dump("shape", n);
fatal("mapop: cl=%d cr=%d, %O", top, n->op);
+ lineno = lno;
return N;
nottop:
dump("bad top", n);
fatal("mapop: top=%d %O", top, n->op);
+ lineno = lno;
return N;
}