From 6552a5839e469dede92d7d0a9918ed29eefed35f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 5 Mar 2009 18:26:12 -0800 Subject: new approach for generating sysimport.c (renamed to avoid any conflict with old p4 copies). this approach doesn't require auto-generating files also kept in p4, so it should be easier on go users who don't sync very often. this approach will be more work for go developers: builtin.c needs to be copied to builtin.c.boot in p4 as new functions are added. mkbuiltin does this for certain $USERs to help us remember. R=r DELTA=343 (176 added, 162 deleted, 5 changed) OCL=25803 CL=25805 --- src/cmd/gc/Makefile | 24 +++------------ src/cmd/gc/builtin.c.boot | 72 ++++++++++++++++++++++++++++++++++++++++++++ src/cmd/gc/mkbuiltin | 31 +++++++++++++++++++ src/cmd/gc/mkbuiltin1.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++ src/cmd/gc/mksys.c | 77 ----------------------------------------------- src/cmd/gc/sysimport.c | 72 -------------------------------------------- 6 files changed, 185 insertions(+), 168 deletions(-) create mode 100644 src/cmd/gc/builtin.c.boot create mode 100755 src/cmd/gc/mkbuiltin create mode 100644 src/cmd/gc/mkbuiltin1.c delete mode 100644 src/cmd/gc/mksys.c delete mode 100644 src/cmd/gc/sysimport.c (limited to 'src') diff --git a/src/cmd/gc/Makefile b/src/cmd/gc/Makefile index 4237e972a..e0d0f1688 100644 --- a/src/cmd/gc/Makefile +++ b/src/cmd/gc/Makefile @@ -26,7 +26,7 @@ OFILES=\ mparith1.$O\ mparith2.$O\ mparith3.$O\ - sysimport.$O\ + builtin.$O\ compat.$O\ $(LIB): $(OFILES) @@ -40,25 +40,11 @@ y.tab.h: $(YFILES) y.tab.c: y.tab.h test -f y.tab.c && touch y.tab.c -# the test here checks whether we have 6g at all. -# if so, use it. if not, just use the sysimport.c we have. -# this happens on fresh perforce checkouts where -# sysimport.c ends up with an older time stamp -# than sys.go (or unsafe.go or mksys.c). -sysimport.c: sys.go unsafe.go mksys.c - if test -x $(BIN)/6g; then \ - p4 open sysimport.c; \ - gcc -o mksys mksys.c; \ - 6g sys.go; \ - 6g unsafe.go; \ - ./mksys sys >_sysimport.c && \ - ./mksys unsafe >>_sysimport.c && \ - mv _sysimport.c sysimport.c; \ - elif test -f sysimport.c; then \ - touch sysimport.c; \ - fi +builtin.c: sys.go unsafe.go mkbuiltin1.c mkbuiltin + mkbuiltin >builtin.c || \ + (echo 'mkbuiltin failed; using bootstrap copy of builtin.c'; cp builtin.c.boot builtin.c) clean: - rm -f $(OFILES) *.6 enam.c 6.out a.out y.tab.h y.tab.c $(LIB) _sysimport.c + rm -f $(OFILES) *.6 enam.c 6.out a.out y.tab.h y.tab.c $(LIB) mkbuiltin1 builtin.c _builtin.c install: $(LIB) diff --git a/src/cmd/gc/builtin.c.boot b/src/cmd/gc/builtin.c.boot new file mode 100644 index 000000000..ccc38343d --- /dev/null +++ b/src/cmd/gc/builtin.c.boot @@ -0,0 +1,72 @@ +char *sysimport = + "package sys\n" + "func sys.mal (? int32) (? *any)\n" + "func sys.throwindex ()\n" + "func sys.throwreturn ()\n" + "func sys.panicl (? int32)\n" + "func sys.printbool (? bool)\n" + "func sys.printfloat (? float64)\n" + "func sys.printint (? int64)\n" + "func sys.printstring (? string)\n" + "func sys.printpointer (? any)\n" + "func sys.printinter (? any)\n" + "func sys.printarray (? any)\n" + "func sys.printnl ()\n" + "func sys.printsp ()\n" + "func sys.catstring (? string, ? string) (? string)\n" + "func sys.cmpstring (? string, ? string) (? int)\n" + "func sys.slicestring (? string, ? int, ? int) (? string)\n" + "func sys.indexstring (? string, ? int) (? uint8)\n" + "func sys.intstring (? int64) (? string)\n" + "func sys.byteastring (? *uint8, ? int) (? string)\n" + "func sys.arraystring (? []uint8) (? string)\n" + "func sys.ifaceT2I (sigi *uint8, sigt *uint8, elem any) (ret any)\n" + "func sys.ifaceI2T (sigt *uint8, iface any) (ret any)\n" + "func sys.ifaceI2T2 (sigt *uint8, iface any) (ret any, ok bool)\n" + "func sys.ifaceI2I (sigi *uint8, iface any) (ret any)\n" + "func sys.ifaceI2I2 (sigi *uint8, iface any) (ret any, ok bool)\n" + "func sys.ifaceeq (i1 any, i2 any) (ret bool)\n" + "func sys.newmap (keysize int, valsize int, keyalg int, valalg int, hint int) (hmap map[any] any)\n" + "func sys.mapaccess1 (hmap map[any] any, key any) (val any)\n" + "func sys.mapaccess2 (hmap map[any] any, key any) (val any, pres bool)\n" + "func sys.mapassign1 (hmap map[any] any, key any, val any)\n" + "func sys.mapassign2 (hmap map[any] any, key any, val any, pres bool)\n" + "func sys.mapiterinit (hmap map[any] any, hiter *any)\n" + "func sys.mapiternext (hiter *any)\n" + "func sys.mapiter1 (hiter *any) (key any)\n" + "func sys.mapiter2 (hiter *any) (key any, val any)\n" + "func sys.newchan (elemsize int, elemalg int, hint int) (hchan chan any)\n" + "func sys.chanrecv1 (hchan chan any) (elem any)\n" + "func sys.chanrecv2 (hchan chan any) (elem any, pres bool)\n" + "func sys.chanrecv3 (hchan chan any, elem *any) (pres bool)\n" + "func sys.chansend1 (hchan chan any, elem any)\n" + "func sys.chansend2 (hchan chan any, elem any) (pres bool)\n" + "func sys.newselect (size int) (sel *uint8)\n" + "func sys.selectsend (sel *uint8, hchan chan any, elem any) (selected bool)\n" + "func sys.selectrecv (sel *uint8, hchan chan any, elem *any) (selected bool)\n" + "func sys.selectdefault (sel *uint8) (selected bool)\n" + "func sys.selectgo (sel *uint8)\n" + "func sys.newarray (nel int, cap int, width int) (ary []any)\n" + "func sys.arraysliced (old []any, lb int, hb int, width int) (ary []any)\n" + "func sys.arrayslices (old *any, nel int, lb int, hb int, width int) (ary []any)\n" + "func sys.arrays2d (old *any, nel int) (ary []any)\n" + "func sys.closure ()\n" + "func sys.Breakpoint ()\n" + "func sys.Reflect (i interface { }) (? uint64, ? string, ? bool)\n" + "func sys.Unreflect (? uint64, ? string, ? bool) (ret interface { })\n" + "var sys.Args []string\n" + "var sys.Envs []string\n" + "func sys.Gosched ()\n" + "func sys.Goexit ()\n" + "func sys.Exit (? int)\n" + "func sys.Caller (n int) (pc uint64, file string, line int, ok bool)\n" + "\n" + "$$\n"; +char *unsafeimport = + "package unsafe\n" + "type unsafe.Pointer *any\n" + "func unsafe.Offsetof (? any) (? int)\n" + "func unsafe.Sizeof (? any) (? int)\n" + "func unsafe.Alignof (? any) (? int)\n" + "\n" + "$$\n"; diff --git a/src/cmd/gc/mkbuiltin b/src/cmd/gc/mkbuiltin new file mode 100755 index 000000000..8148120e0 --- /dev/null +++ b/src/cmd/gc/mkbuiltin @@ -0,0 +1,31 @@ +#!/bin/sh +# Copyright 2009 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. + +set -e +gcc -o mkbuiltin1 mkbuiltin1.c +6g sys.go +6g unsafe.go +rm -f _builtin.c +./mkbuiltin1 sys >_builtin.c +./mkbuiltin1 unsafe >>_builtin.c + +# If _builtin.c has changed vs builtin.c.boot, +# check in the new change if being run by +# one of the people who tends to work on +# the compiler. This makes sure that changes +# don't get forgotten, without causing problems +# in end user Go repositories. +case "$USER" in +ken | r | rsc) + if ! cmp _builtin.c builtin.c.boot + then + p4 open builtin.c.boot + cp _builtin.c builtin.c.boot + fi +esac + +cat _builtin.c +rm -f _builtin.c + diff --git a/src/cmd/gc/mkbuiltin1.c b/src/cmd/gc/mkbuiltin1.c new file mode 100644 index 000000000..22ef468f3 --- /dev/null +++ b/src/cmd/gc/mkbuiltin1.c @@ -0,0 +1,77 @@ +// Copyright 2009 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. + +// Compile .go file, import data from .6 file, and generate C string version. + +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + char *name; + FILE *fin; + char buf[1024], initfunc[1024], *p, *q; + + if(argc != 2) { + fprintf(stderr, "usage: mkbuiltin1 sys\n"); + fprintf(stderr, "in file $1.6 s/PACKAGE/$1/\n"); + exit(1); + } + + name = argv[1]; + snprintf(initfunc, sizeof(initfunc), "init_%s_function", name); + + snprintf(buf, sizeof(buf), "%s.6", name); + if((fin = fopen(buf, "r")) == NULL) { + fprintf(stderr, "open %s: %s\n", buf, strerror(errno)); + exit(1); + } + + // look for $$ that introduces imports + while(fgets(buf, sizeof buf, fin) != NULL) + if(strstr(buf, "$$")) + goto begin; + fprintf(stderr, "did not find beginning of imports\n"); + exit(1); + +begin: + printf("char *%simport =\n", name); + + // process imports, stopping at $$ that closes them + while(fgets(buf, sizeof buf, fin) != NULL) { + buf[strlen(buf)-1] = 0; // chop \n + if(strstr(buf, "$$")) + goto end; + + // chop leading white space + for(p=buf; *p==' ' || *p == '\t'; p++) + ; + + // cut out decl of init_$1_function - it doesn't exist + if(strstr(buf, initfunc)) + continue; + + // sys.go claims to be in package PACKAGE to avoid + // conflicts during "6g sys.go". rename PACKAGE to $2. + printf("\t\""); + while(q = strstr(p, "PACKAGE")) { + *q = 0; + printf("%s", p); // up to the substitution + printf("%s", name); // the sub name + p = q+7; // continue with rest + } + + printf("%s\\n\"\n", p); + } + fprintf(stderr, "did not find end of imports\n"); + exit(1); + +end: + printf("\t\"$$\\n\";\n"); + return 0; +} diff --git a/src/cmd/gc/mksys.c b/src/cmd/gc/mksys.c deleted file mode 100644 index 25593d415..000000000 --- a/src/cmd/gc/mksys.c +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2009 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. - -// Extract import data from sys.6 and generate C string version. - -#include -#include -#include -#include -#include - -int -main(int argc, char **argv) -{ - char *name; - FILE *fin; - char buf[1024], initfunc[1024], *p, *q; - - if(argc != 2) { - fprintf(stderr, "usage: sys sys\n"); - fprintf(stderr, "in file $1.6 s/PACKAGE/$1/\n"); - exit(1); - } - - name = argv[1]; - snprintf(initfunc, sizeof(initfunc), "init_%s_function", name); - - snprintf(buf, sizeof(buf), "%s.6", name); - if((fin = fopen(buf, "r")) == NULL) { - fprintf(stderr, "open %s: %s\n", buf, strerror(errno)); - exit(1); - } - - // look for $$ that introduces imports - while(fgets(buf, sizeof buf, fin) != NULL) - if(strstr(buf, "$$")) - goto begin; - fprintf(stderr, "did not find beginning of imports\n"); - exit(1); - -begin: - printf("char *%simport =\n", name); - - // process imports, stopping at $$ that closes them - while(fgets(buf, sizeof buf, fin) != NULL) { - buf[strlen(buf)-1] = 0; // chop \n - if(strstr(buf, "$$")) - goto end; - - // chop leading white space - for(p=buf; *p==' ' || *p == '\t'; p++) - ; - - // cut out decl of init_$1_function - it doesn't exist - if(strstr(buf, initfunc)) - continue; - - // sys.go claims to be in package PACKAGE to avoid - // conflicts during "6g sys.go". rename PACKAGE to $2. - printf("\t\""); - while(q = strstr(p, "PACKAGE")) { - *q = 0; - printf("%s", p); // up to the substitution - printf("%s", name); // the sub name - p = q+7; // continue with rest - } - - printf("%s\\n\"\n", p); - } - fprintf(stderr, "did not find end of imports\n"); - exit(1); - -end: - printf("\t\"$$\\n\";\n"); - return 0; -} diff --git a/src/cmd/gc/sysimport.c b/src/cmd/gc/sysimport.c deleted file mode 100644 index ccc38343d..000000000 --- a/src/cmd/gc/sysimport.c +++ /dev/null @@ -1,72 +0,0 @@ -char *sysimport = - "package sys\n" - "func sys.mal (? int32) (? *any)\n" - "func sys.throwindex ()\n" - "func sys.throwreturn ()\n" - "func sys.panicl (? int32)\n" - "func sys.printbool (? bool)\n" - "func sys.printfloat (? float64)\n" - "func sys.printint (? int64)\n" - "func sys.printstring (? string)\n" - "func sys.printpointer (? any)\n" - "func sys.printinter (? any)\n" - "func sys.printarray (? any)\n" - "func sys.printnl ()\n" - "func sys.printsp ()\n" - "func sys.catstring (? string, ? string) (? string)\n" - "func sys.cmpstring (? string, ? string) (? int)\n" - "func sys.slicestring (? string, ? int, ? int) (? string)\n" - "func sys.indexstring (? string, ? int) (? uint8)\n" - "func sys.intstring (? int64) (? string)\n" - "func sys.byteastring (? *uint8, ? int) (? string)\n" - "func sys.arraystring (? []uint8) (? string)\n" - "func sys.ifaceT2I (sigi *uint8, sigt *uint8, elem any) (ret any)\n" - "func sys.ifaceI2T (sigt *uint8, iface any) (ret any)\n" - "func sys.ifaceI2T2 (sigt *uint8, iface any) (ret any, ok bool)\n" - "func sys.ifaceI2I (sigi *uint8, iface any) (ret any)\n" - "func sys.ifaceI2I2 (sigi *uint8, iface any) (ret any, ok bool)\n" - "func sys.ifaceeq (i1 any, i2 any) (ret bool)\n" - "func sys.newmap (keysize int, valsize int, keyalg int, valalg int, hint int) (hmap map[any] any)\n" - "func sys.mapaccess1 (hmap map[any] any, key any) (val any)\n" - "func sys.mapaccess2 (hmap map[any] any, key any) (val any, pres bool)\n" - "func sys.mapassign1 (hmap map[any] any, key any, val any)\n" - "func sys.mapassign2 (hmap map[any] any, key any, val any, pres bool)\n" - "func sys.mapiterinit (hmap map[any] any, hiter *any)\n" - "func sys.mapiternext (hiter *any)\n" - "func sys.mapiter1 (hiter *any) (key any)\n" - "func sys.mapiter2 (hiter *any) (key any, val any)\n" - "func sys.newchan (elemsize int, elemalg int, hint int) (hchan chan any)\n" - "func sys.chanrecv1 (hchan chan any) (elem any)\n" - "func sys.chanrecv2 (hchan chan any) (elem any, pres bool)\n" - "func sys.chanrecv3 (hchan chan any, elem *any) (pres bool)\n" - "func sys.chansend1 (hchan chan any, elem any)\n" - "func sys.chansend2 (hchan chan any, elem any) (pres bool)\n" - "func sys.newselect (size int) (sel *uint8)\n" - "func sys.selectsend (sel *uint8, hchan chan any, elem any) (selected bool)\n" - "func sys.selectrecv (sel *uint8, hchan chan any, elem *any) (selected bool)\n" - "func sys.selectdefault (sel *uint8) (selected bool)\n" - "func sys.selectgo (sel *uint8)\n" - "func sys.newarray (nel int, cap int, width int) (ary []any)\n" - "func sys.arraysliced (old []any, lb int, hb int, width int) (ary []any)\n" - "func sys.arrayslices (old *any, nel int, lb int, hb int, width int) (ary []any)\n" - "func sys.arrays2d (old *any, nel int) (ary []any)\n" - "func sys.closure ()\n" - "func sys.Breakpoint ()\n" - "func sys.Reflect (i interface { }) (? uint64, ? string, ? bool)\n" - "func sys.Unreflect (? uint64, ? string, ? bool) (ret interface { })\n" - "var sys.Args []string\n" - "var sys.Envs []string\n" - "func sys.Gosched ()\n" - "func sys.Goexit ()\n" - "func sys.Exit (? int)\n" - "func sys.Caller (n int) (pc uint64, file string, line int, ok bool)\n" - "\n" - "$$\n"; -char *unsafeimport = - "package unsafe\n" - "type unsafe.Pointer *any\n" - "func unsafe.Offsetof (? any) (? int)\n" - "func unsafe.Sizeof (? any) (? int)\n" - "func unsafe.Alignof (? any) (? int)\n" - "\n" - "$$\n"; -- cgit v1.2.3