from forsyth formalize the boostrapping process used to move the system to 32-bit runes in a way that will allow the target system to have a smaller or bigger rune. Reference: /n/atom/patch/applied/trune Date: Sat Aug 15 23:42:03 CES 2015 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/cc/cc.h Sat Aug 15 23:40:30 2015 +++ /sys/src/cmd/cc/cc.h Sat Aug 15 23:40:31 2015 @@ -20,6 +20,8 @@ typedef struct Init Init; typedef struct Bits Bits; +typedef Rune TRune; /* target system type */ + #define NHUNK 50000L #define BUFSIZ 8192 #define NSYMB 1500 @@ -51,7 +53,7 @@ double fconst; /* fp constant */ vlong vconst; /* non fp const */ char* cstring; /* character string */ - Rune* rstring; /* rune string */ + TRune* rstring; /* rune string */ Sym* sym; Type* type; @@ -337,11 +339,8 @@ TOLD, NALLTYPES, - /* - * bootstrapping - */ -// TRUNE = TUINT, - TRUNE = sizeof(Rune)==4? TUINT: TUSHORT, + /* adapt size of Rune to target system's size */ + TRUNE = sizeof(TRune)==4? TUINT: TUSHORT, }; enum { @@ -747,7 +746,7 @@ void gextern(Sym*, Node*, long, long); void ginit(void); long outstring(char*, long); -long outlstring(Rune*, long); +long outlstring(TRune*, long); void xcom(Node*); long exreg(Type*); long align(long, Type*, int); --- /sys/src/cmd/cc/cc.y Sat Aug 15 23:40:34 2015 +++ /sys/src/cmd/cc/cc.y Sat Aug 15 23:40:35 2015 @@ -856,8 +856,8 @@ { $$ = new(OLSTRING, Z, Z); $$->type = typ(TARRAY, types[TRUNE]); - $$->type->width = $1.l + sizeof(Rune); - $$->rstring = (Rune*)$1.s; + $$->type->width = $1.l + sizeof(TRune); + $$->rstring = (TRune*)$1.s; $$->sym = symstring; $$->etype = TARRAY; $$->class = CSTATIC; @@ -867,16 +867,16 @@ char *s; int n; - n = $1->type->width - sizeof(Rune); + n = $1->type->width - sizeof(TRune); s = alloc(n+$2.l+MAXALIGN); memcpy(s, $1->rstring, n); memcpy(s+n, $2.s, $2.l); - *(Rune*)(s+n+$2.l) = 0; + *(TRune*)(s+n+$2.l) = 0; $$ = $1; $$->type->width += $2.l; - $$->rstring = (Rune*)s; + $$->rstring = (TRune*)s; } zelist: --- /sys/src/cmd/cc/com.c Sat Aug 15 23:40:38 2015 +++ /sys/src/cmd/cc/com.c Sat Aug 15 23:40:40 2015 @@ -67,6 +67,7 @@ Node *l, *r; Type *t; int o; + static TRune zer; if(n == Z) { diag(Z, "Z in tcom"); @@ -636,9 +637,7 @@ if(n->type->link != types[TRUNE]) { o = outstring(0, 0); while(o & 3) { - /* outlstring(L"", sizeof(Rune)); */ - Rune str[1] = {0}; - outlstring(str, sizeof(Rune)); + outlstring(&zer, sizeof(TRune)); o = outlstring(0, 0); } } @@ -1049,7 +1048,6 @@ r->fconst = 1e10; } } - if(n->op == OASLSHR || n->op == OASASHR || n->op == OASASHL) if(r->op == OCONST) { t = n->type->width * 8; /* bits per byte */ --- /sys/src/cmd/cc/lex.c Sat Aug 15 23:40:43 2015 +++ /sys/src/cmd/cc/lex.c Sat Aug 15 23:40:44 2015 @@ -540,15 +540,15 @@ c = escchar('"', 1, 0); if(c == EOF) break; - cp = allocn(cp, c1, sizeof(Rune)); - *(Rune*)(cp + c1) = c; - c1 += sizeof(Rune); + cp = allocn(cp, c1, sizeof(TRune)); + *(TRune*)(cp + c1) = c; + c1 += sizeof(TRune); } yylval.sval.l = c1; do { - cp = allocn(cp, c1, sizeof(Rune)); - *(Rune*)(cp + c1) = 0; - c1 += sizeof(Rune); + cp = allocn(cp, c1, sizeof(TRune)); + *(TRune*)(cp + c1) = 0; + c1 += sizeof(TRune); } while(c1 & MAXALIGN); yylval.sval.s = cp; return LLSTRING; --- /sys/src/cmd/cc/pswt.c Sat Aug 15 23:40:46 2015 +++ /sys/src/cmd/cc/pswt.c Sat Aug 15 23:40:47 2015 @@ -132,28 +132,29 @@ } long -outlstring(Rune *s, long n) +outlstring(TRune *s, long n) { - char buf[sizeof(Rune)]; - int c, i; + char buf[sizeof(TRune)]; + uint c; + int i; long r; if(suppress) return nstring; - while(nstring & (sizeof(Rune)-1)) + while(nstring & (sizeof(TRune)-1)) outstring("", 1); r = nstring; while(n > 0) { c = *s++; if(align(0, types[TCHAR], Aarg1)) { - for(i = 0; i < sizeof(Rune); i++) - buf[i] = c>>8*(sizeof(Rune) - i - 1); + for(i = 0; i < sizeof(TRune); i++) + buf[i] = c>>8*(sizeof(TRune) - i - 1); } else { - for(i = 0; i < sizeof(Rune); i++) + for(i = 0; i < sizeof(TRune); i++) buf[i] = c>>8*i; } - outstring(buf, sizeof(Rune)); - n -= sizeof(Rune); + outstring(buf, sizeof(TRune)); + n -= sizeof(TRune); } return r; } --- /sys/src/cmd/cc/sub.c Sat Aug 15 23:40:51 2015 +++ /sys/src/cmd/cc/sub.c Sat Aug 15 23:40:53 2015 @@ -85,7 +85,10 @@ break; case OLSTRING: - print(" \"%S\"", n->rstring); + if(sizeof(TRune) == sizeof(Rune)) + print(" \"%S\"", (Rune*)n->rstring); + else + print(" \"...\""); i = 0; break;