diff options
author | Steffen <steffen.butzer@outlook.com> | 2017-06-10 14:02:32 +0200 |
---|---|---|
committer | Steffen <steffen.butzer@outlook.com> | 2017-06-10 14:02:32 +0200 |
commit | 6b30b8701efe4d6bd16ebae7f8f2f5fee60462c4 (patch) | |
tree | a57f4feb44a0b067766504bb208c85b55847520b /generator_windows.go | |
parent | 212e4e19afc9ea6da37ed1357839fa16e6f8dcb1 (diff) |
switch windows to CRT, throw out old virtual
Diffstat (limited to 'generator_windows.go')
-rw-r--r-- | generator_windows.go | 366 |
1 files changed, 0 insertions, 366 deletions
diff --git a/generator_windows.go b/generator_windows.go deleted file mode 100644 index 03bb15e..0000000 --- a/generator_windows.go +++ /dev/null @@ -1,366 +0,0 @@ -// Copyright 2017 The Sqlite Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bytes" - "compress/gzip" - "encoding/gob" - "flag" - "fmt" - "go/format" - "go/scanner" - "go/token" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "sort" - "strings" - - "log" - - "github.com/cznic/cc" - "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" -) - -var ( - cpp = flag.Bool("cpp", false, "") - dict = xc.Dict - errLimit = flag.Int("errlimit", 10, "") - filter = flag.String("re", "", "") - ndebug = flag.Bool("ndebug", false, "") - noexec = flag.Bool("noexec", false, "") - oLog = flag.Bool("log", false, "") - trace = flag.Bool("trc", false, "") - yydebug = flag.Int("yydebug", 0, "") -) - -func findRepo(s string) string { - s = filepath.FromSlash(s) - for _, v := range strings.Split(strutil.Gopath(), string(os.PathListSeparator)) { - p := filepath.Join(v, "src", s) - fi, err := os.Lstat(p) - if err != nil { - continue - } - - if fi.IsDir() { - wd, err := os.Getwd() - if err != nil { - log.Fatal(err) - } - - if p, err = filepath.Rel(wd, p); err != nil { - log.Fatal(err) - } - - return p - } - } - return "" -} - -func errStr(err error) string { - switch x := err.(type) { - case scanner.ErrorList: - if len(x) != 1 { - x.RemoveMultiples() - } - var b bytes.Buffer - for i, v := range x { - if i != 0 { - b.WriteByte('\n') - } - b.WriteString(v.Error()) - if i == 9 { - fmt.Fprintf(&b, "\n\t... and %v more errors", len(x)-10) - break - } - } - return b.String() - default: - return err.Error() - } -} - -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') - })) - } - - ndbg := "" - if *ndebug { - ndbg = "#define NDEBUG 1" - } - var build [][]ir.Object - tus = append(tus, []string{ccir.CRT0Path}) - var asta []*cc.TranslationUnit - for _, src := range tus { - model, err := ccir.NewModel() - if err != nil { - log.Fatal(err) - } - - ast, err := cc.Parse( - fmt.Sprintf(` -%s -#define __arch__ %s -#define __os__ %s -#include <builtin.h> -%s -`, ndbg, runtime.GOARCH, runtime.GOOS, predef), - src, - model, - append([]cc.Opt{ - cc.AllowCompatibleTypedefRedefinitions(), - 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) - } - } - - bin, err := virtual.LoadMain(linked) - if err != nil { - log.Fatal(err) - } - - return asta, bin -} - -func macros(buf io.Writer, ast *cc.TranslationUnit) { - var a []string - for k, v := range ast.Macros { - if v.Value != nil && v.Type.Kind() != cc.Bool { - switch fn := v.DefTok.Position().Filename; { - case - fn == "builtin.h", - fn == "<predefine>", - strings.HasPrefix(fn, "predefined_"): - // ignore - default: - a = append(a, string(dict.S(k))) - } - } - } - sort.Strings(a) - for _, v := range a { - m := ast.Macros[dict.SID(v)] - if m.Value == nil { - log.Fatal("TODO") - } - - switch t := m.Type; t.Kind() { - case - cc.Int, cc.UInt, cc.Long, cc.ULong, cc.LongLong, cc.ULongLong, - cc.Float, cc.LongDouble, cc.Bool: - fmt.Fprintf(buf, "X%s = %v\n", v, m.Value) - case cc.Ptr: - switch t := t.Element(); t.Kind() { - case cc.Char: - fmt.Fprintf(buf, "X%s = %q\n", v, dict.S(int(m.Value.(cc.StringLitID)))) - default: - log.Fatalf("%v", t.Kind()) - } - default: - log.Fatalf("%v", t.Kind()) - } - } - - a = a[:0] - for _, v := range ast.Declarations.Identifiers { - switch x := v.Node.(type) { - case *cc.DirectDeclarator: - d := x.TopDeclarator() - id, _ := d.Identifier() - if x.EnumVal == nil { - break - } - - a = append(a, string(dict.S(id))) - default: - log.Fatalf("%T", x) - } - } - sort.Strings(a) - for _, v := range a { - dd := ast.Declarations.Identifiers[dict.SID(v)].Node.(*cc.DirectDeclarator) - fmt.Fprintf(buf, "X%s = %v\n", v, dd.EnumVal) - } -} - -func main() { - const repo = "sqlite.org/sqlite-amalgamation-3180000/" - - log.SetFlags(log.Lshortfile | log.Lmicroseconds) - flag.Parse() - pth := findRepo(repo) - if pth == "" { - log.Fatalf("repository not found: %v", repo) - return - } - - asta, bin := build( - ` - //#define SQLITE_DEBUG 1 - //#define SQLITE_ENABLE_API_ARMOR 1 - #define SQLITE_ENABLE_MEMSYS5 1 - #define SQLITE_USE_URI 1 - `, - [][]string{ - {"main.c"}, - {filepath.Join(pth, "sqlite3.c")}, - }, - cc.EnableAnonymousStructFields(), - 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 - 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()) - if err != nil { - b3 = b - } - 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 { - 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(), - ) -} |