From 6b8bd3556ad77141729d836999d93fdd1923e3b2 Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Fri, 6 Jun 2008 16:49:35 -0700 Subject: [PATCH] nonaddressable = functioncall code gen error SVN=121541 --- src/cmd/6g/cgen.c | 15 +++++++++++++++ src/cmd/6g/gen.c | 13 +++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c index 7a00688392..531f0614b1 100644 --- a/src/cmd/6g/cgen.c +++ b/src/cmd/6g/cgen.c @@ -22,6 +22,13 @@ cgen(Node *n, Node *res) if(res == N || res->type == T) 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; if(n->op != ONAME) dynlineno = n->lineno; // for diagnostics @@ -32,6 +39,14 @@ cgen(Node *n, Node *res) } 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); cgen(n, &n1); regfree(&n1); diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c index 4f4c4d122c..47e5037640 100644 --- a/src/cmd/6g/gen.c +++ b/src/cmd/6g/gen.c @@ -688,10 +688,15 @@ cgen_asop(Node *nl, Node *nr, int op) Node n1, n2; int a; - // botch compare ullman numbers - // and use temp for functions + if(nr->ullman >= UINF && nl->ullman >= UINF) { + fatal("cgen_asop both sides call"); + } a = optoas(op, nl->type); + if(nr->ullman > nl->ullman) { + fatal("gcgen_asopen"); + } + regalloc(&n1, nl->type, N); if(nl->addable) { cgen(nr, &n1); @@ -815,5 +820,9 @@ cgen_as(Node *nl, Node *nr, int op) nr->addable = 1; ullmancalc(nr); } + + if(nr->ullman >= UINF && nl->ullman >= UINF) { + fatal("cgen_as both sides call"); + } cgen(nr, nl); }