]> Cypherpunks repositories - gostls13.git/commitdiff
bug190.
authorRuss Cox <rsc@golang.org>
Tue, 20 Oct 2009 01:47:37 +0000 (18:47 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 20 Oct 2009 01:47:37 +0000 (18:47 -0700)
also eliminate float80 dregs

R=ken
OCL=35894
CL=35896

src/cmd/5g/gsubr.c
src/cmd/6g/gsubr.c
src/cmd/6g/reg.c
src/cmd/gc/align.c
src/cmd/gc/gen.c
src/cmd/gc/go.h
src/cmd/gc/lex.c
src/cmd/gc/reflect.c
src/cmd/gc/subr.c
test/fixedbugs/bug190.go [moved from test/bugs/bug190.go with 100% similarity]
test/golden.out

index 4a4c21ba9e66bc8aea15b4ff9683a5c6f3d68974..ceb97cc651c8eecf33b2bfce2bfe013e1a99d2f9 100644 (file)
@@ -245,7 +245,6 @@ regalloc(Node *n, Type *t, Node *o)
 
        case TFLOAT32:
        case TFLOAT64:
-       case TFLOAT80:
                if(o != N && o->op == OREGISTER) {
                        i = o->val.u.reg;
                        if(i >= REGALLOC_F0 && i <= REGALLOC_FMAX)
index 8358abf16bdedde705c7212a6ea5abcfc652d417..2fd9d94009a3d80f6b000808de7b562da1a1e848 100644 (file)
@@ -275,7 +275,6 @@ regalloc(Node *n, Type *t, Node *o)
 
        case TFLOAT32:
        case TFLOAT64:
-       case TFLOAT80:
                if(o != N && o->op == OREGISTER) {
                        i = o->val.u.reg;
                        if(i >= D_X0 && i <= D_X7)
index 64616e4a5bec0d3cf342bb0391f865535f60ac48..1d19b32d80da9890084d1e7734d80f753c776032 100644 (file)
@@ -1172,7 +1172,6 @@ allreg(uint32 b, Rgn *r)
 
        case TFLOAT32:
        case TFLOAT64:
-       case TFLOAT80:
        case TFLOAT:
                i = BtoF(~b);
                if(i && r->cost > 0) {
index bc963384d21bbbd46717e43240247b497d0abb15..e0c617ac10b2c35a74746df6d50d0685adb6e49a 100644 (file)
@@ -11,6 +11,8 @@
  * (see ../6g/align.c).
  */
 
+static int defercalc;
+
 uint32
 rnd(uint32 o, uint32 r)
 {
@@ -98,6 +100,7 @@ dowidth(Type *t)
        int32 et;
        uint32 w;
        int lno;
+       Type *t1;
 
        if(maxround == 0 || widthptr == 0)
                fatal("dowidth without betypeinit");
@@ -117,6 +120,9 @@ dowidth(Type *t)
                return;
        }
 
+       // defer checkwidth calls until after we're done
+       defercalc++;
+
        lno = lineno;
        lineno = t->lineno;
        t->width = -2;
@@ -155,33 +161,36 @@ dowidth(Type *t)
        case TINT32:
        case TUINT32:
        case TFLOAT32:
-       case TPTR32:            // note lack of recursion
                w = 4;
                break;
        case TINT64:
        case TUINT64:
        case TFLOAT64:
-       case TPTR64:            // note lack of recursion
                w = 8;
                break;
-       case TFLOAT80:
-               w = 10;
+       case TPTR32:
+               w = 4;
+               checkwidth(t->type);
+               break;
+       case TPTR64:
+               w = 8;
+               checkwidth(t->type);
                break;
        case TDDD:
                w = 2*widthptr;
                break;
        case TINTER:            // implemented as 2 pointers
-               offmod(t);
                w = 2*widthptr;
+               offmod(t);
                break;
        case TCHAN:             // implemented as pointer
-               dowidth(t->type);
-               dowidth(t->down);
                w = widthptr;
+               checkwidth(t->type);
                break;
        case TMAP:              // implemented as pointer
-               dowidth(t->type);
                w = widthptr;
+               checkwidth(t->type);
+               checkwidth(t->down);
                break;
        case TFORW:             // should have been filled in
        case TANY:
@@ -198,15 +207,18 @@ dowidth(Type *t)
        case TARRAY:
                if(t->type == T)
                        break;
-               dowidth(t->type);
-               if(t->bound >= 0)
+               if(t->bound >= 0) {
+                       dowidth(t->type);
                        w = t->bound * t->type->width;
-               else if(t->bound == -1)
+                       if(w == 0)
+                               w = maxround;
+               }
+               else if(t->bound == -1) {
                        w = sizeof_Array;
+                       checkwidth(t->type);
+               }
                else
                        fatal("dowidth %T", t); // probably [...]T
-               if(w == 0)
-                       w = maxround;
                break;
 
        case TSTRUCT:
@@ -218,20 +230,118 @@ dowidth(Type *t)
                break;
 
        case TFUNC:
-               // function is 3 cated structures;
-               // compute their widths as side-effect.
-               w = widstruct(*getthis(t), 0, 0);
-               w = widstruct(*getinarg(t), w, 1);
-               w = widstruct(*getoutarg(t), w, 1);
-               t->argwid = w;
+               // make fake type to check later to
+               // trigger function argument computation.
+               t1 = typ(TFUNCARGS);
+               t1->type = t;
+               checkwidth(t1);
 
-               // but width of func type is pointer
+               // width of func type is pointer
                w = widthptr;
                break;
+       
+       case TFUNCARGS:
+               // function is 3 cated structures;
+               // compute their widths as side-effect.
+               t1 = t->type;
+               w = widstruct(*getthis(t1), 0, 0);
+               w = widstruct(*getinarg(t1), w, 1);
+               w = widstruct(*getoutarg(t1), w, 1);
+               t1->argwid = w;
+               break;
        }
 
        t->width = w;
        lineno = lno;
+
+       if(defercalc == 1)
+               resumecheckwidth();
+       else
+               --defercalc;
+}
+
+/*
+ * when a type's width should be known, we call checkwidth
+ * to compute it.  during a declaration like
+ *
+ *     type T *struct { next T }
+ *
+ * it is necessary to defer the calculation of the struct width
+ * until after T has been initialized to be a pointer to that struct.
+ * similarly, during import processing structs may be used
+ * before their definition.  in those situations, calling
+ * defercheckwidth() stops width calculations until
+ * resumecheckwidth() is called, at which point all the
+ * checkwidths that were deferred are executed.
+ * dowidth should only be called when the type's size
+ * is needed immediately.  checkwidth makes sure the
+ * size is evaluated eventually.
+ */
+typedef struct TypeList TypeList;
+struct TypeList {
+       Type *t;
+       TypeList *next;
+};
+
+static TypeList *tlfree;
+static TypeList *tlq;
+
+void
+checkwidth(Type *t)
+{
+       TypeList *l;
+
+       if(t == T)
+               return;
+
+       // function arg structs should not be checked
+       // outside of the enclosing function.
+       if(t->funarg)
+               fatal("checkwidth %T", t);
+
+       if(!defercalc) {
+               dowidth(t);
+               return;
+       }
+       if(t->deferwidth)
+               return;
+       t->deferwidth = 1;
+
+       l = tlfree;
+       if(l != nil)
+               tlfree = l->next;
+       else
+               l = mal(sizeof *l);
+
+       l->t = t;
+       l->next = tlq;
+       tlq = l;
+}
+
+void
+defercheckwidth(void)
+{
+       // we get out of sync on syntax errors, so don't be pedantic.
+       // if(defercalc)
+       //      fatal("defercheckwidth");
+       defercalc = 1;
+}
+
+void
+resumecheckwidth(void)
+{
+       TypeList *l;
+
+       if(!defercalc)
+               fatal("resumecheckwidth");
+       for(l = tlq; l != nil; l = tlq) {
+               l->t->deferwidth = 0;
+               tlq = l->next;
+               dowidth(l->t);
+               l->next = tlfree;
+               tlfree = l;
+       }
+       defercalc = 0;
 }
 
 void
@@ -263,7 +373,7 @@ typeinit(void)
        isint[TUINT] = 1;
        isint[TUINTPTR] = 1;
 
-       for(i=TFLOAT32; i<=TFLOAT80; i++)
+       for(i=TFLOAT32; i<=TFLOAT64; i++)
                isfloat[i] = 1;
        isfloat[TFLOAT] = 1;
 
index 149ef80f343037f118d717361e1f47c290b49377..e5799a08b4be6276359bfbe71b844652c8b36e15 100644 (file)
@@ -553,7 +553,6 @@ cgen_as(Node *nl, Node *nr)
 
                case TFLOAT32:
                case TFLOAT64:
-               case TFLOAT80:
                        nr->val.u.fval = mal(sizeof(*nr->val.u.fval));
                        mpmovecflt(nr->val.u.fval, 0.0);
                        nr->val.ctype = CTFLT;
index bd6d3aa14796c023f29c56c62ba6b5fa0fb0d329..2aa3b3e92791188f136c14fcf41af424393cee8e 100644 (file)
@@ -406,7 +406,6 @@ enum
 
        TFLOAT32,               // 12
        TFLOAT64,
-       TFLOAT80,
        TFLOAT,
 
        TBOOL,                  // 16
@@ -430,6 +429,9 @@ enum
        TIDEAL,
        TNIL,
        TBLANK,
+       
+       // pseudo-type for frame layout
+       TFUNCARGS,
 
        NTYPE,
 };
index 11e9b5a5c30e74f52657cc3f3c225c56792073af..8cfa105ac3a39d59458199175792125e6ee9b62e 100644 (file)
@@ -1207,7 +1207,6 @@ static    struct
 
        "float32",      LNAME,          TFLOAT32,       OXXX,
        "float64",      LNAME,          TFLOAT64,       OXXX,
-       "float80",      LNAME,          TFLOAT80,       OXXX,
 
        "bool",         LNAME,          TBOOL,          OXXX,
        "byte",         LNAME,          TUINT8,         OXXX,
index dfe4f3fa8470ec2e9f442099c67b49a3f901700b..79065c5de5be411353787badd9c13c1219f65e81 100644 (file)
@@ -687,8 +687,7 @@ dumptypestructs(void)
        // but using runtime means fewer copies in .6 files.
        if(strcmp(package, "runtime") == 0) {
                for(i=1; i<=TBOOL; i++)
-                       if(i != TFLOAT80)
-                               dtypesym(ptrto(types[i]));
+                       dtypesym(ptrto(types[i]));
                dtypesym(ptrto(types[TSTRING]));
                dtypesym(typ(TDDD));
                dtypesym(ptrto(pkglookup("Pointer", "unsafe")->def->type));
index 35f7053e71a6c47763e32b6f72386879014253d1..819ebd51c22cd49bd5772a11a33aa2dd46a750ac 100644 (file)
@@ -899,7 +899,6 @@ etnames[] =
        [TFLOAT]        = "FLOAT",
        [TFLOAT32]      = "FLOAT32",
        [TFLOAT64]      = "FLOAT64",
-       [TFLOAT80]      = "FLOAT80",
        [TBOOL]         = "BOOL",
        [TPTR32]        = "PTR32",
        [TPTR64]        = "PTR64",
@@ -1044,7 +1043,6 @@ basicnames[] =
        [TFLOAT]        = "float",
        [TFLOAT32]      = "float32",
        [TFLOAT64]      = "float64",
-       [TFLOAT80]      = "float80",
        [TBOOL]         = "bool",
        [TANY]          = "any",
        [TDDD]          = "...",
@@ -3073,87 +3071,6 @@ structcount(Type *t)
        return v;
 }
 
-/*
- * when a type's width should be known, we call checkwidth
- * to compute it.  during a declaration like
- *
- *     type T *struct { next T }
- *
- * it is necessary to defer the calculation of the struct width
- * until after T has been initialized to be a pointer to that struct.
- * similarly, during import processing structs may be used
- * before their definition.  in those situations, calling
- * defercheckwidth() stops width calculations until
- * resumecheckwidth() is called, at which point all the
- * checkwidths that were deferred are executed.
- * sometimes it is okay to
- */
-typedef struct TypeList TypeList;
-struct TypeList {
-       Type *t;
-       TypeList *next;
-};
-
-static TypeList *tlfree;
-static TypeList *tlq;
-static int defercalc;
-
-void
-checkwidth(Type *t)
-{
-       TypeList *l;
-
-       // function arg structs should not be checked
-       // outside of the enclosing function.
-       if(t->funarg)
-               fatal("checkwidth %T", t);
-
-       if(!defercalc) {
-               dowidth(t);
-               return;
-       }
-       if(t->deferwidth)
-               return;
-       t->deferwidth = 1;
-
-       l = tlfree;
-       if(l != nil)
-               tlfree = l->next;
-       else
-               l = mal(sizeof *l);
-
-       l->t = t;
-       l->next = tlq;
-       tlq = l;
-}
-
-void
-defercheckwidth(void)
-{
-       // we get out of sync on syntax errors, so don't be pedantic.
-       // if(defercalc)
-       //      fatal("defercheckwidth");
-       defercalc = 1;
-}
-
-void
-resumecheckwidth(void)
-{
-       TypeList *l;
-
-       if(!defercalc)
-               fatal("restartcheckwidth");
-       defercalc = 0;
-
-       for(l = tlq; l != nil; l = tlq) {
-               l->t->deferwidth = 0;
-               dowidth(l->t);
-               tlq = l->next;
-               l->next = tlfree;
-               tlfree = l;
-       }
-}
-
 /*
  * return power of 2 of the constant
  * operand. -1 if it is not a power of 2.
similarity index 100%
rename from test/bugs/bug190.go
rename to test/fixedbugs/bug190.go
index 52fe9ec53b0cb7cc6790f852b744fe72483f1c5e..5e621ccdf4b108c01efa0532e53a132316debe9b 100644 (file)
@@ -150,15 +150,6 @@ BUG: should fail
 =========== bugs/bug169.go
 BUG: errchk: command succeeded unexpectedly
 
-=========== bugs/bug190.go
-bugs/bug190.go:11: invalid recursive type []S
-bugs/bug190.go:13: invalid recursive type chan S
-bugs/bug190.go:15: invalid recursive type func(S) (S)
-bugs/bug190.go:16: invalid recursive type S
-bugs/bug190.go:16: invalid recursive type S
-bugs/bug190.go:16: invalid recursive type S
-BUG: should compile
-
 =========== bugs/bug193.go
 BUG: errchk: bugs/bug193.go:14: missing expected error: 'shift'
 
@@ -167,9 +158,5 @@ too many calls: 5
 panic PC=xxx
 BUG: bug196
 
-=========== bugs/bug210.go
-bugs/bug210.go:10: invalid recursive type []T
-BUG: should compile
-
 =========== bugs/bug211.go
 BUG: errchk: command succeeded unexpectedly