diff options
author | Jan Mercl <0xjnml@gmail.com> | 2017-06-05 20:13:10 +0200 |
---|---|---|
committer | Jan Mercl <0xjnml@gmail.com> | 2017-06-05 20:13:10 +0200 |
commit | 8c183b526ba8f225684f6431836138a9cffae509 (patch) | |
tree | 4afc11a44fe89e0e7081f00085eed90357218fac /generator.go | |
parent | 1a3b0a731a9d2b66fb058caef95c004634b17307 (diff) |
Release the {cgo,VM}-free Linux/Intel version.
modified: Makefile
new file: all_linux_test.go
renamed: all_test.go -> all_test_windows.go
new file: doc.go
new file: generate_linux.go
new file: generate_windows.go
modified: generator.go
new file: generator_windows.go
modified: internal/bin/bin_linux_386.go
modified: internal/bin/bin_linux_amd64.go
modified: main.c
modified: sqlite.go
modified: sqlite_go18.go
new file: sqlite_windows.go
Diffstat (limited to 'generator.go')
-rw-r--r-- | generator.go | 214 |
1 files changed, 74 insertions, 140 deletions
diff --git a/generator.go b/generator.go index 03bb15e..214478a 100644 --- a/generator.go +++ b/generator.go @@ -8,13 +8,10 @@ package main import ( "bytes" - "compress/gzip" - "encoding/gob" "flag" "fmt" "go/format" "go/scanner" - "go/token" "io" "io/ioutil" "os" @@ -26,11 +23,10 @@ import ( "log" "github.com/cznic/cc" + "github.com/cznic/ccgo" "github.com/cznic/ccir" "github.com/cznic/internal/buffer" - "github.com/cznic/ir" "github.com/cznic/strutil" - "github.com/cznic/virtual" "github.com/cznic/xc" ) @@ -46,6 +42,55 @@ var ( yydebug = flag.Int("yydebug", 0, "") ) +const ( + prologue = `/* + +%s +*/ + +// Code generated by ccgo DO NOT EDIT. + +package bin + +import ( + "fmt" + "math" + "os" + "path" + "runtime" + "unsafe" + + "github.com/cznic/crt" + "github.com/edsrzf/mmap-go" + +) + +const minAlloc = 2<<5 + +var ( + inf = math.Inf(1) +) + +func ftrace(s string, args ...interface{}) { + _, fn, fl, _ := runtime.Caller(1) + fmt.Fprintf(os.Stderr, "# %%s:%%d: %%v\n", path.Base(fn), fl, fmt.Sprintf(s, args...)) + os.Stderr.Sync() +} + +func Init(heapSize, heapReserve int) int { + heap, err := mmap.MapRegion(nil, heapSize+heapReserve, mmap.RDWR, mmap.ANON, 0) + if err != nil { + panic(err) + } + + tls := crt.NewTLS() + crt.RegisterHeap(unsafe.Pointer(&heap[0]), int64(heapSize+heapReserve)) + crt.X__register_stdfiles(tls, Xstdin, Xstdout, Xstderr) + return int(Xinit(tls, int32(heapSize))) +} +` +) + func findRepo(s string) string { s = filepath.FromSlash(s) for _, v := range strings.Split(strutil.Gopath(), string(os.PathListSeparator)) { @@ -94,32 +139,13 @@ func errStr(err error) string { } } -func build(predef string, tus [][]string, opts ...cc.Opt) ([]*cc.TranslationUnit, *virtual.Binary) { - var b buffer.Bytes - var lpos token.Position - if *cpp { - opts = append(opts, cc.Cpp(func(toks []xc.Token) { - if len(toks) != 0 { - p := toks[0].Position() - if p.Filename != lpos.Filename { - fmt.Fprintf(&b, "# %d %q\n", p.Line, p.Filename) - } - lpos = p - } - for _, v := range toks { - b.WriteString(cc.TokSrc(v)) - } - b.WriteByte('\n') - })) - } - +func build(predef string, tus [][]string, opts ...cc.Opt) ([]*cc.TranslationUnit, []byte) { ndbg := "" if *ndebug { ndbg = "#define NDEBUG 1" } - var build [][]ir.Object + var build []*cc.TranslationUnit tus = append(tus, []string{ccir.CRT0Path}) - var asta []*cc.TranslationUnit for _, src := range tus { model, err := ccir.NewModel() if err != nil { @@ -129,6 +155,7 @@ func build(predef string, tus [][]string, opts ...cc.Opt) ([]*cc.TranslationUnit ast, err := cc.Parse( fmt.Sprintf(` %s +#define _CCGO 1 #define __arch__ %s #define __os__ %s #include <builtin.h> @@ -138,79 +165,31 @@ func build(predef string, tus [][]string, opts ...cc.Opt) ([]*cc.TranslationUnit model, append([]cc.Opt{ cc.AllowCompatibleTypedefRedefinitions(), + cc.EnableEmptyStructs(), cc.EnableImplicitFuncDef(), cc.EnableNonConstStaticInitExpressions(), - cc.EnableWideBitFieldTypes(), cc.ErrLimit(*errLimit), cc.SysIncludePaths([]string{ccir.LibcIncludePath}), }, opts...)..., ) - if s := b.Bytes(); len(s) != 0 { - log.Printf("\n%s", s) - b.Close() - } if err != nil { log.Fatal(errStr(err)) } - asta = append(asta, ast) - objs, err := ccir.New(ast) - if err != nil { - log.Fatal(err) - } - - if *oLog { - for i, v := range objs { - switch x := v.(type) { - case *ir.DataDefinition: - fmt.Fprintf(&b, "# [%v]: %T %v %v\n", i, x, x.ObjectBase, x.Value) - case *ir.FunctionDefinition: - fmt.Fprintf(&b, "# [%v]: %T %v %v\n", i, x, x.ObjectBase, x.Arguments) - for i, v := range x.Body { - fmt.Fprintf(&b, "%#05x\t%v\n", i, v) - } - default: - log.Fatalf("[%v]: %T %v: %v", i, x, x, err) - } - } - } - for i, v := range objs { - if err := v.Verify(); err != nil { - switch x := v.(type) { - case *ir.FunctionDefinition: - fmt.Fprintf(&b, "# [%v, err]: %T %v %v\n", i, x, x.ObjectBase, x.Arguments) - for i, v := range x.Body { - fmt.Fprintf(&b, "%#05x\t%v\n", i, v) - } - log.Fatalf("# [%v]: Verify (A): %v\n%s", i, err, b.Bytes()) - default: - log.Fatalf("[%v]: %T %v: %v", i, x, x, err) - } - } - } - build = append(build, objs) - } - - linked, err := ir.LinkMain(build...) - if err != nil { - log.Fatalf("ir.LinkMain: %s\n%s", err, b.Bytes()) - } - - for _, v := range linked { - if err := v.Verify(); err != nil { - log.Fatal(err) - } + build = append(build, ast) } - bin, err := virtual.LoadMain(linked) - if err != nil { + var out buffer.Bytes + if err := ccgo.New(build, &out); err != nil { log.Fatal(err) } - return asta, bin + return build, out.Bytes() } func macros(buf io.Writer, ast *cc.TranslationUnit) { + fmt.Fprintf(buf, `const ( +`) var a []string for k, v := range ast.Macros { if v.Value != nil && v.Type.Kind() != cc.Bool { @@ -269,6 +248,7 @@ func macros(buf io.Writer, ast *cc.TranslationUnit) { dd := ast.Declarations.Identifiers[dict.SID(v)].Node.(*cc.DirectDeclarator) fmt.Fprintf(buf, "X%s = %v\n", v, dd.EnumVal) } + fmt.Fprintf(buf, ")\n") } func main() { @@ -282,10 +262,10 @@ func main() { return } - asta, bin := build( + asta, src := build( ` - //#define SQLITE_DEBUG 1 - //#define SQLITE_ENABLE_API_ARMOR 1 + #define SQLITE_DEBUG 1 + #define SQLITE_ENABLE_API_ARMOR 1 #define SQLITE_ENABLE_MEMSYS5 1 #define SQLITE_USE_URI 1 `, @@ -297,70 +277,24 @@ func main() { cc.IncludePaths([]string{pth}), ) - var b0 bytes.Buffer - enc := gob.NewEncoder(&b0) - if err := enc.Encode(&bin); err != nil { - log.Fatal(err) - } - - var b1 bytes.Buffer - comp := gzip.NewWriter(&b1) - if _, err := comp.Write(b0.Bytes()); err != nil { - log.Fatal(err) - } - - if err := comp.Close(); err != nil { - log.Fatal(err) - } - - var b2 buffer.Bytes + var b bytes.Buffer lic, err := ioutil.ReadFile("SQLITE-LICENSE") if err != nil { log.Fatal(err) } - b2.WriteString(`// Code generated by running "go generate". DO NOT EDIT. - -/* - -`) - b2.Write(lic) - b2.WriteString(` -*/ - -package bin - -const ( -`) - macros(&b2, asta[0]) - b2.WriteString(` - Data = "`) - b := b1.Bytes() - for _, v := range b { - switch { - case v == '\\': - b2.WriteString(`\\`) - case v == '"': - b2.WriteString(`\"`) - case v < ' ', v >= 0x7f: - fmt.Fprintf(&b2, `\x%02x`, v) - default: - b2.WriteByte(v) - } - } - b2.WriteString(`" -) -`) - b3, err := format.Source(b2.Bytes()) + fmt.Fprintf(&b, prologue, lic) + macros(&b, asta[0]) + b.Write(src) + b2, err := format.Source(b.Bytes()) if err != nil { - b3 = b + b2 = b.Bytes() } - os.MkdirAll("internal/bin", 0775) - if err := ioutil.WriteFile(fmt.Sprintf("internal/bin/bin_%s_%s.go", runtime.GOOS, runtime.GOARCH), b3, 0664); err != nil { + if err := os.MkdirAll("internal/bin", 0775); err != nil { log.Fatal(err) } - log.Printf("code %#08x, text %#08x, data %#08x, bss %#08x, pc2func %v, pc2line %v, symbols %v, gz %v\n", - len(bin.Code), len(bin.Text), len(bin.Data), bin.BSS, len(bin.Functions), len(bin.Lines), len(bin.Sym), b1.Len(), - ) + if err := ioutil.WriteFile(fmt.Sprintf("internal/bin/bin_%s_%s.go", runtime.GOOS, runtime.GOARCH), b2, 0664); err != nil { + log.Fatal(err) + } } |