mirror of
https://github.com/golang/go
synced 2024-11-22 04:34:39 -07:00
gc: Nicer errors before miscompiling.
This fixes issue 2444. A big cleanup of all 31/32bit size boundaries i'll leave for another cl though. (see also issue 1700). R=rsc CC=golang-dev https://golang.org/cl/5484058
This commit is contained in:
parent
4bcc9c6b5e
commit
a6c49098bc
@ -1193,7 +1193,7 @@ stkof(Node *n)
|
|||||||
* NB: character copy assumed little endian architecture
|
* NB: character copy assumed little endian architecture
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
sgen(Node *n, Node *res, int32 w)
|
sgen(Node *n, Node *res, int64 w)
|
||||||
{
|
{
|
||||||
Node dst, src, tmp, nend;
|
Node dst, src, tmp, nend;
|
||||||
int32 c, odst, osrc;
|
int32 c, odst, osrc;
|
||||||
@ -1201,14 +1201,17 @@ sgen(Node *n, Node *res, int32 w)
|
|||||||
Prog *p, *ploop;
|
Prog *p, *ploop;
|
||||||
|
|
||||||
if(debug['g']) {
|
if(debug['g']) {
|
||||||
print("\nsgen w=%d\n", w);
|
print("\nsgen w=%lld\n", w);
|
||||||
dump("r", n);
|
dump("r", n);
|
||||||
dump("res", res);
|
dump("res", res);
|
||||||
}
|
}
|
||||||
if(w < 0)
|
|
||||||
fatal("sgen copy %d", w);
|
|
||||||
if(n->ullman >= UINF && res->ullman >= UINF)
|
if(n->ullman >= UINF && res->ullman >= UINF)
|
||||||
fatal("sgen UINF");
|
fatal("sgen UINF");
|
||||||
|
|
||||||
|
if(w < 0 || (int32)w != w)
|
||||||
|
fatal("sgen copy %lld", w);
|
||||||
|
|
||||||
if(n->type == T)
|
if(n->type == T)
|
||||||
fatal("sgen: missing type");
|
fatal("sgen: missing type");
|
||||||
|
|
||||||
@ -1240,7 +1243,7 @@ sgen(Node *n, Node *res, int32 w)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(w%align)
|
if(w%align)
|
||||||
fatal("sgen: unaligned size %d (align=%d) for %T", w, align, n->type);
|
fatal("sgen: unaligned size %lld (align=%d) for %T", w, align, n->type);
|
||||||
c = w / align;
|
c = w / align;
|
||||||
|
|
||||||
// offset on the stack
|
// offset on the stack
|
||||||
|
@ -94,7 +94,7 @@ void igen(Node*, Node*, Node*);
|
|||||||
void agenr(Node *n, Node *a, Node *res);
|
void agenr(Node *n, Node *a, Node *res);
|
||||||
vlong fieldoffset(Type*, Node*);
|
vlong fieldoffset(Type*, Node*);
|
||||||
void bgen(Node*, int, Prog*);
|
void bgen(Node*, int, Prog*);
|
||||||
void sgen(Node*, Node*, int32);
|
void sgen(Node*, Node*, int64);
|
||||||
void gmove(Node*, Node*);
|
void gmove(Node*, Node*);
|
||||||
Prog* gins(int, Node*, Node*);
|
Prog* gins(int, Node*, Node*);
|
||||||
int samaddr(Node*, Node*);
|
int samaddr(Node*, Node*);
|
||||||
|
@ -1023,13 +1023,13 @@ stkof(Node *n)
|
|||||||
* memmove(&ns, &n, w);
|
* memmove(&ns, &n, w);
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
sgen(Node *n, Node *ns, int32 w)
|
sgen(Node *n, Node *ns, int64 w)
|
||||||
{
|
{
|
||||||
Node nodl, nodr, oldl, oldr, cx, oldcx, tmp;
|
Node nodl, nodr, oldl, oldr, cx, oldcx, tmp;
|
||||||
int32 c, q, odst, osrc;
|
int32 c, q, odst, osrc;
|
||||||
|
|
||||||
if(debug['g']) {
|
if(debug['g']) {
|
||||||
print("\nsgen w=%d\n", w);
|
print("\nsgen w=%lld\n", w);
|
||||||
dump("r", n);
|
dump("r", n);
|
||||||
dump("res", ns);
|
dump("res", ns);
|
||||||
}
|
}
|
||||||
@ -1038,7 +1038,7 @@ sgen(Node *n, Node *ns, int32 w)
|
|||||||
fatal("sgen UINF");
|
fatal("sgen UINF");
|
||||||
|
|
||||||
if(w < 0)
|
if(w < 0)
|
||||||
fatal("sgen copy %d", w);
|
fatal("sgen copy %lld", w);
|
||||||
|
|
||||||
if(w == 16)
|
if(w == 16)
|
||||||
if(componentgen(n, ns))
|
if(componentgen(n, ns))
|
||||||
|
@ -87,7 +87,7 @@ void agen(Node*, Node*);
|
|||||||
void igen(Node*, Node*, Node*);
|
void igen(Node*, Node*, Node*);
|
||||||
vlong fieldoffset(Type*, Node*);
|
vlong fieldoffset(Type*, Node*);
|
||||||
void bgen(Node*, int, Prog*);
|
void bgen(Node*, int, Prog*);
|
||||||
void sgen(Node*, Node*, int32);
|
void sgen(Node*, Node*, int64);
|
||||||
void gmove(Node*, Node*);
|
void gmove(Node*, Node*);
|
||||||
Prog* gins(int, Node*, Node*);
|
Prog* gins(int, Node*, Node*);
|
||||||
int samaddr(Node*, Node*);
|
int samaddr(Node*, Node*);
|
||||||
|
@ -1130,21 +1130,21 @@ stkof(Node *n)
|
|||||||
* memmove(&res, &n, w);
|
* memmove(&res, &n, w);
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
sgen(Node *n, Node *res, int32 w)
|
sgen(Node *n, Node *res, int64 w)
|
||||||
{
|
{
|
||||||
Node dst, src, tdst, tsrc;
|
Node dst, src, tdst, tsrc;
|
||||||
int32 c, q, odst, osrc;
|
int32 c, q, odst, osrc;
|
||||||
|
|
||||||
if(debug['g']) {
|
if(debug['g']) {
|
||||||
print("\nsgen w=%d\n", w);
|
print("\nsgen w=%ld\n", w);
|
||||||
dump("r", n);
|
dump("r", n);
|
||||||
dump("res", res);
|
dump("res", res);
|
||||||
}
|
}
|
||||||
if(n->ullman >= UINF && res->ullman >= UINF)
|
if(n->ullman >= UINF && res->ullman >= UINF)
|
||||||
fatal("sgen UINF");
|
fatal("sgen UINF");
|
||||||
|
|
||||||
if(w < 0)
|
if(w < 0 || (int32)w != w)
|
||||||
fatal("sgen copy %d", w);
|
fatal("sgen copy %lld", w);
|
||||||
|
|
||||||
if(w == 0) {
|
if(w == 0) {
|
||||||
// evaluate side effects only.
|
// evaluate side effects only.
|
||||||
|
@ -99,7 +99,7 @@ void agenr(Node *n, Node *a, Node *res);
|
|||||||
void igen(Node*, Node*, Node*);
|
void igen(Node*, Node*, Node*);
|
||||||
vlong fieldoffset(Type*, Node*);
|
vlong fieldoffset(Type*, Node*);
|
||||||
void bgen(Node*, int, Prog*);
|
void bgen(Node*, int, Prog*);
|
||||||
void sgen(Node*, Node*, int32);
|
void sgen(Node*, Node*, int64);
|
||||||
void gmove(Node*, Node*);
|
void gmove(Node*, Node*);
|
||||||
Prog* gins(int, Node*, Node*);
|
Prog* gins(int, Node*, Node*);
|
||||||
int samaddr(Node*, Node*);
|
int samaddr(Node*, Node*);
|
||||||
|
@ -285,6 +285,9 @@ dowidth(Type *t)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(widthptr == 4 && w != (int32)w)
|
||||||
|
yyerror("type %T too large", t);
|
||||||
|
|
||||||
t->width = w;
|
t->width = w;
|
||||||
if(t->align == 0) {
|
if(t->align == 0) {
|
||||||
if(w > 8 || (w&(w-1)) != 0)
|
if(w > 8 || (w&(w-1)) != 0)
|
||||||
|
@ -119,6 +119,10 @@ compile(Node *fn)
|
|||||||
if(0)
|
if(0)
|
||||||
print("allocauto: %lld to %lld\n", oldstksize, (vlong)stksize);
|
print("allocauto: %lld to %lld\n", oldstksize, (vlong)stksize);
|
||||||
|
|
||||||
|
setlineno(curfn);
|
||||||
|
if(stksize+maxarg > (1ULL<<31))
|
||||||
|
yyerror("stack frame too large (>2GB)");
|
||||||
|
|
||||||
defframe(ptxt);
|
defframe(ptxt);
|
||||||
|
|
||||||
if(0)
|
if(0)
|
||||||
|
14
test/fixedbugs/bug385_32.go
Normal file
14
test/fixedbugs/bug385_32.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// [ $O == 6 ] || errchk $G -e $D/$F.go
|
||||||
|
|
||||||
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Issue 2444
|
||||||
|
|
||||||
|
package main
|
||||||
|
func main() {
|
||||||
|
var arr [1000200030]int // ERROR "type .* too large"
|
||||||
|
arr_bkup := arr
|
||||||
|
_ = arr_bkup
|
||||||
|
}
|
15
test/fixedbugs/bug385_64.go
Normal file
15
test/fixedbugs/bug385_64.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// [ $O != 6 ] || errchk $G -e $D/$F.go
|
||||||
|
|
||||||
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Issue 2444
|
||||||
|
|
||||||
|
package main
|
||||||
|
func main() { // ERROR "stack frame too large"
|
||||||
|
var arr [1000200030]int
|
||||||
|
arr_bkup := arr
|
||||||
|
_ = arr_bkup
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user