mirror of
https://github.com/golang/go
synced 2024-11-25 22:57:58 -07:00
nonaddressable = functioncall
code gen error SVN=121541
This commit is contained in:
parent
e92b753810
commit
6b8bd3556a
@ -22,6 +22,13 @@ cgen(Node *n, Node *res)
|
|||||||
if(res == N || res->type == T)
|
if(res == N || res->type == T)
|
||||||
fatal("cgen: res nil");
|
fatal("cgen: res nil");
|
||||||
|
|
||||||
|
if(n->ullman >= UINF) {
|
||||||
|
if(n->op == OINDREG)
|
||||||
|
fatal("cgen: this is going to misscompile");
|
||||||
|
if(res->ullman >= UINF)
|
||||||
|
fatal("cgen: fun both sides");
|
||||||
|
}
|
||||||
|
|
||||||
lno = dynlineno;
|
lno = dynlineno;
|
||||||
if(n->op != ONAME)
|
if(n->op != ONAME)
|
||||||
dynlineno = n->lineno; // for diagnostics
|
dynlineno = n->lineno; // for diagnostics
|
||||||
@ -32,6 +39,14 @@ cgen(Node *n, Node *res)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!res->addable) {
|
if(!res->addable) {
|
||||||
|
if(n->ullman > res->ullman) {
|
||||||
|
regalloc(&n1, nr->type, res);
|
||||||
|
cgen(n, &n1);
|
||||||
|
cgen(&n1, res);
|
||||||
|
regfree(&n1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
igen(res, &n1, N);
|
igen(res, &n1, N);
|
||||||
cgen(n, &n1);
|
cgen(n, &n1);
|
||||||
regfree(&n1);
|
regfree(&n1);
|
||||||
|
@ -688,10 +688,15 @@ cgen_asop(Node *nl, Node *nr, int op)
|
|||||||
Node n1, n2;
|
Node n1, n2;
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
// botch compare ullman numbers
|
if(nr->ullman >= UINF && nl->ullman >= UINF) {
|
||||||
// and use temp for functions
|
fatal("cgen_asop both sides call");
|
||||||
|
}
|
||||||
|
|
||||||
a = optoas(op, nl->type);
|
a = optoas(op, nl->type);
|
||||||
|
if(nr->ullman > nl->ullman) {
|
||||||
|
fatal("gcgen_asopen");
|
||||||
|
}
|
||||||
|
|
||||||
regalloc(&n1, nl->type, N);
|
regalloc(&n1, nl->type, N);
|
||||||
if(nl->addable) {
|
if(nl->addable) {
|
||||||
cgen(nr, &n1);
|
cgen(nr, &n1);
|
||||||
@ -815,5 +820,9 @@ cgen_as(Node *nl, Node *nr, int op)
|
|||||||
nr->addable = 1;
|
nr->addable = 1;
|
||||||
ullmancalc(nr);
|
ullmancalc(nr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(nr->ullman >= UINF && nl->ullman >= UINF) {
|
||||||
|
fatal("cgen_as both sides call");
|
||||||
|
}
|
||||||
cgen(nr, nl);
|
cgen(nr, nl);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user