aboutsummaryrefslogtreecommitdiff
path: root/generator.go
diff options
context:
space:
mode:
authorJan Mercl <0xjnml@gmail.com>2017-06-05 20:13:10 +0200
committerJan Mercl <0xjnml@gmail.com>2017-06-05 20:13:10 +0200
commit8c183b526ba8f225684f6431836138a9cffae509 (patch)
tree4afc11a44fe89e0e7081f00085eed90357218fac /generator.go
parent1a3b0a731a9d2b66fb058caef95c004634b17307 (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.go214
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)
+ }
}