diff options
Diffstat (limited to 'vendor/modernc.org/ccgo')
-rw-r--r-- | vendor/modernc.org/ccgo/v3/lib/Makefile | 3 | ||||
-rw-r--r-- | vendor/modernc.org/ccgo/v3/lib/ccgo.go | 147 | ||||
-rw-r--r-- | vendor/modernc.org/ccgo/v3/lib/go.go | 786 | ||||
-rw-r--r-- | vendor/modernc.org/ccgo/v3/lib/init.go | 10 |
4 files changed, 480 insertions, 466 deletions
diff --git a/vendor/modernc.org/ccgo/v3/lib/Makefile b/vendor/modernc.org/ccgo/v3/lib/Makefile index ec6f53518..1bd7e1934 100644 --- a/vendor/modernc.org/ccgo/v3/lib/Makefile +++ b/vendor/modernc.org/ccgo/v3/lib/Makefile @@ -112,7 +112,8 @@ edit: editor: gofmt -l -s -w *.go - GO111MODULE=off go build -v -o $(GOPATH)/bin/ccgo modernc.org/ccgo/v3 + go build -v -o $(GOPATH)/bin/ccgo modernc.org/ccgo/v3 + go test -c -o /dev/null later: @grep -n $(grep) LATER * || true diff --git a/vendor/modernc.org/ccgo/v3/lib/ccgo.go b/vendor/modernc.org/ccgo/v3/lib/ccgo.go index 0c62d76b2..e04d74768 100644 --- a/vendor/modernc.org/ccgo/v3/lib/ccgo.go +++ b/vendor/modernc.org/ccgo/v3/lib/ccgo.go @@ -249,6 +249,7 @@ void *__builtin_memset(void *s, int c, size_t n); void *__builtin_mmap(void *addr, size_t length, int prot, int flags, int fd, __INTPTR_TYPE__ offset); void *__ccgo_va_arg(__builtin_va_list ap); void __builtin_abort(void); +void __builtin_bzero(void *s, size_t n); void __builtin_exit(int status); void __builtin_free(void *ptr); void __builtin_prefetch (const void *addr, ...); @@ -284,7 +285,6 @@ unsigned __sync_sub_and_fetch_uint32(unsigned*, unsigned); func origin(skip int) string { pc, fn, fl, _ := runtime.Caller(skip) - fn = filepath.Base(fn) f := runtime.FuncForPC(pc) var fns string if f != nil { @@ -296,32 +296,20 @@ func origin(skip int) string { return fmt.Sprintf("%s:%d:%s", fn, fl, fns) } -func todo(s string, args ...interface{}) string { //TODO- +func todo(s string, args ...interface{}) string { switch { case s == "": s = fmt.Sprintf(strings.Repeat("%v ", len(args)), args...) default: s = fmt.Sprintf(s, args...) } - pc, fn, fl, _ := runtime.Caller(1) - f := runtime.FuncForPC(pc) - var fns string - if f != nil { - fns = f.Name() - if x := strings.LastIndex(fns, "."); x > 0 { - fns = fns[x+1:] - } - } - r := fmt.Sprintf("%s:%d:%s: TODOTODO %s", fn, fl, fns, s) //TODOOK - if dmesgs { - dmesg("%v: %v", origin(1), r) - } + r := fmt.Sprintf("%s\n\tTODO %s", origin(2), s) //TODOOK fmt.Fprintf(os.Stdout, "%s\n", r) os.Stdout.Sync() return r } -func trc(s string, args ...interface{}) string { //TODO- +func trc(s string, args ...interface{}) string { switch { case s == "": s = fmt.Sprintf(strings.Repeat("%v ", len(args)), args...) @@ -329,8 +317,8 @@ func trc(s string, args ...interface{}) string { //TODO- s = fmt.Sprintf(s, args...) } r := fmt.Sprintf("%s: TRC %s", origin(2), s) - fmt.Fprintf(os.Stdout, "%s\n", r) - os.Stdout.Sync() + fmt.Fprintf(os.Stderr, "%s\n", r) + os.Stderr.Sync() return r } @@ -367,7 +355,8 @@ type Task struct { hostIncludes []string hostPredefined string hostSysIncludes []string - ignoredIncludes string // -ignored-includes + ignoredIncludes string // -ignored-includes + ignoredObjects map[string]struct{} // -ignore-object imported []*imported includedFiles map[string]struct{} l []string // -l @@ -395,37 +384,37 @@ type Task struct { // feature should ever set it. CallOutBinary string - E bool // -E - allErrors bool // -all-errors - compiledbValid bool // -compiledb present - configSaved bool - configured bool // hostPredefined, hostIncludes, hostSysIncludes are valid - cover bool // -cover-instrumentation - coverC bool // -cover-instrumentation-c - defaultUnExport bool // -unexported-by-default - errTrace bool // -err-trace - exportDefinesValid bool // -export-defines present - exportEnumsValid bool // -export-enums present - exportExternsValid bool // -export-externs present - exportFieldsValid bool // -export-fields present - exportStructsValid bool // -export-structs present - exportTypedefsValid bool // -export-typedefs present - fullPathComments bool // -full-path-comments - funcSig bool // -func-sig - header bool // -header - ignoreUndefined bool // -ignoreUndefined - isScripted bool - mingw bool - noCapi bool // -nocapi - nostdinc bool // -nostdinc - nostdlib bool // -nostdlib - panicStubs bool // -panic-stubs - tracePinning bool // -trace-pinning - traceTranslationUnits bool // -trace-translation-units - verifyStructs bool // -verify-structs - version bool // -version - watch bool // -watch-instrumentation - windows bool // -windows + E bool // -E + allErrors bool // -all-errors + compiledbValid bool // -compiledb present + configSaved bool + configured bool // hostPredefined, hostIncludes, hostSysIncludes are valid + cover bool // -cover-instrumentation + coverC bool // -cover-instrumentation-c + defaultUnExport bool // -unexported-by-default + errTrace bool // -err-trace + exportDefinesValid bool // -export-defines present + exportEnumsValid bool // -export-enums present + exportExternsValid bool // -export-externs present + exportFieldsValid bool // -export-fields present + exportStructsValid bool // -export-structs present + exportTypedefsValid bool // -export-typedefs present + fullPathComments bool // -full-path-comments + funcSig bool // -func-sig + header bool // -header + ignoreUnsupportedAligment bool // -ignore-unsupported-alignment + isScripted bool + mingw bool + noCapi bool // -nocapi + nostdinc bool // -nostdinc + nostdlib bool // -nostdlib + panicStubs bool // -panic-stubs + tracePinning bool // -trace-pinning + traceTranslationUnits bool // -trace-translation-units + verifyStructs bool // -verify-structs + version bool // -version + watch bool // -watch-instrumentation + windows bool // -windows } // NewTask returns a newly created Task. @@ -617,7 +606,6 @@ func (t *Task) capi2(files []string) (pkgName string, exports map[string]struct{ // Main executes task. func (t *Task) Main() (err error) { - // trc("%p: %q", t, t.args) if dmesgs { defer func() { if err != nil { @@ -681,7 +669,7 @@ func (t *Task) Main() (err error) { opts.Opt("full-path-comments", func(opt string) error { t.fullPathComments = true; return nil }) opts.Opt("func-sig", func(opt string) error { t.funcSig = true; return nil }) opts.Opt("header", func(opt string) error { t.header = true; return nil }) - opts.Opt("ignore-undefined", func(opt string) error { t.ignoreUndefined = true; return nil }) + opts.Opt("ignore-unsupported-alignment", func(opt string) error { t.ignoreUnsupportedAligment = true; return nil }) opts.Opt("nocapi", func(opt string) error { t.noCapi = true; return nil }) opts.Opt("nostdinc", func(opt string) error { t.nostdinc = true; return nil }) opts.Opt("panic-stubs", func(opt string) error { t.panicStubs = true; return nil }) @@ -710,6 +698,13 @@ func (t *Task) Main() (err error) { } return nil }) + opts.Arg("ignore-object", false, func(arg, value string) error { + if t.ignoredObjects == nil { + t.ignoredObjects = map[string]struct{}{} + } + t.ignoredObjects[value] = struct{}{} + return nil + }) opts.Arg("save-config", false, func(arg, value string) error { if value == "" { return nil @@ -1120,6 +1115,9 @@ func (t *Task) link() (err error) { return } + if out, e := exec.Command("gofmt", "-r", "(x) -> x", "-l", "-s", "-w", t.o).CombinedOutput(); e != nil && err == nil { + err = fmt.Errorf(strings.Join([]string{string(out), e.Error()}, ": ")) + } if out, e := exec.Command("gofmt", "-l", "-s", "-w", t.o).CombinedOutput(); e != nil && err == nil { err = fmt.Errorf(strings.Join([]string{string(out), e.Error()}, ": ")) } @@ -1232,7 +1230,7 @@ type cdb struct { outputIndex map[string][]*cdbItem } -func (db *cdb) find(obj map[string]*cdbItem, nm string, ver, seqLimit int, path []string, cc, ar string) error { +func (db *cdb) find(obj map[string]*cdbItem, nm string, ver, seqLimit int, path []string, cc, ar string, ignored map[string]struct{}) error { // trc("%v: nm %q ver %v seqLimit %v path %q cc %q ar %q", origin(1), nm, ver, seqLimit, path, cc, ar) var item *cdbItem var k string @@ -1292,6 +1290,12 @@ func (db *cdb) find(obj map[string]*cdbItem, nm string, ver, seqLimit int, path } } if item == nil { + for k := range ignored { + if k == nm || strings.HasSuffix(nm, k) { + return nil + } + } + return fmt.Errorf("not found in compile DB: %s (max seq %d), path %v", k, seqLimit, path) } @@ -1302,7 +1306,7 @@ func (db *cdb) find(obj map[string]*cdbItem, nm string, ver, seqLimit int, path obj[k] = item var errs []string for _, v := range item.sources(cc, ar) { - if err := db.find(obj, v, -1, item.seq, append(path, nm), cc, ar); err != nil { + if err := db.find(obj, v, -1, item.seq, append(path, nm), cc, ar, ignored); err != nil { errs = append(errs, err.Error()) } } @@ -1380,7 +1384,7 @@ func (t *Task) useCompileDB(fn string, args []string) error { notFound := false for _, v := range args { v, ver := suffixNum(v, 0) - if err := cdb.find(obj, v, ver, -1, nil, t.ccLookPath, t.arLookPath); err != nil { + if err := cdb.find(obj, v, ver, -1, nil, t.ccLookPath, t.arLookPath, t.ignoredObjects); err != nil { notFound = true fmt.Fprintln(os.Stderr, err) } @@ -1584,9 +1588,19 @@ func hasPlusPrefix(s string) (n int, r string) { } func makeXParser(s string) (r []string, err error) { - n, s := hasPlusPrefix(s) - if n == 0 { - return nil, nil + switch { + case strings.HasPrefix(s, "libtool: link: ar "): + s = s[len("libtool: link:"):] + case strings.HasPrefix(s, "libtool: compile: "): + s = s[len("libtool: compile:"):] + for strings.HasPrefix(s, " ") { + s = s[1:] + } + default: + var n int + if n, s = hasPlusPrefix(s); n == 0 { + return nil, nil + } } if !strings.HasPrefix(s, " ") { @@ -1600,6 +1614,9 @@ func makeXParser(s string) (r []string, err error) { return nil, nil // ignore } } + if len(r) != 0 && filepath.Base(r[0]) == "libtool" { + r[0] = "libtool" + } return r, err } @@ -1692,13 +1709,20 @@ func (it *cdbItem) ccgoArgs(cc string) (r []string, err error) { strings.HasPrefix(arg, "-m"): // nop + case strings.HasPrefix(arg, ">"): + return opt.Skip(nil) default: return fmt.Errorf("unknown/unsupported CC option: %s", arg) } return nil }); err != nil { - return nil, err + switch err.(type) { + case opt.Skip: + // ok + default: + return nil, err + } } return r, nil @@ -1756,6 +1780,7 @@ func (it *cdbItem) sources(cc, ar string) (r []string) { case "libtool", ar, + filepath.Base(ar), cc: var prev string @@ -1780,6 +1805,7 @@ type cdbMakeWriter struct { b bytes.Buffer cc string ar string + arBase string dir string err error it cdbItem @@ -1793,6 +1819,7 @@ func (t *Task) newCdbMakeWriter(w *cdbWriter, dir string, parser func(s string) r := &cdbMakeWriter{ cc: t.ccLookPath, ar: t.arLookPath, + arBase: filepath.Base(t.arLookPath), dir: dir, parser: parser, w: w, @@ -1868,6 +1895,8 @@ func (w *cdbMakeWriter) Write(b []byte) (int, error) { fmt.Printf("CCGO CC: %q\n", args) err = w.handleGCC(args) case w.ar: + fallthrough + case w.arBase: if isCreateArchive(args[1]) { fmt.Printf("CCGO AR: %q\n", args) err = w.handleAR(args) diff --git a/vendor/modernc.org/ccgo/v3/lib/go.go b/vendor/modernc.org/ccgo/v3/lib/go.go index 0b826161d..4ee4ad6e8 100644 --- a/vendor/modernc.org/ccgo/v3/lib/go.go +++ b/vendor/modernc.org/ccgo/v3/lib/go.go @@ -105,8 +105,7 @@ const ( type flags byte const ( - fOutermost flags = 1 << iota - fForceConv + fForceConv flags = 1 << iota fForceNoConv fForceRuntimeConv fNoCondAssignment @@ -1180,7 +1179,7 @@ func (n *enumSpec) emit(p *project) { p.emitedEnums[nm] = struct{}{} p.w("%s%s = ", tidyComment("\n", en), p.enumConsts[nm]) - p.intConst(en, "", en.Operand, en.Operand.Type(), fOutermost|fForceNoConv) + p.intConst(en, "", en.Operand, en.Operand.Type(), fForceNoConv) p.w(";") } p.w(");") @@ -1334,7 +1333,7 @@ func (p *project) err(n cc.Node, s string, args ...interface{}) { s = s + "(" + origin(2) + ")" } if p.task.traceTranslationUnits { - trc("%v: error: %s (%v)", n.Position(), fmt.Sprintf(s, args...), origin(2)) + trc("%v: error: %s (%v)", pos(n), fmt.Sprintf(s, args...), origin(2)) } if !p.task.allErrors && len(p.errors) >= 10 { return @@ -1921,7 +1920,7 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string { // trc("%v: %q\n%s", p.pos(n), t.Tag(), info) b.WriteString("struct {") if info.NeedExplicitAlign { - fmt.Fprintf(b, "%s [0]uint%d;", p.padName(&npad), 8*p.align(t)) + fmt.Fprintf(b, "%s [0]uint%d;", p.padName(&npad), 8*p.align(n, t)) } var max uintptr for _, off := range info.Offsets { @@ -1974,7 +1973,7 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string { } max += ft.Size() - fmt.Fprintf(b, "%s %s;", p.fieldName2(n, f), p.typ(nil, ft)) + fmt.Fprintf(b, "%s %s;", p.fieldName2(n, f), p.typ(n, ft)) } } if info.PaddingAfter != 0 { @@ -1983,6 +1982,10 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string { b.WriteByte('}') case cc.Union: b.WriteString("struct {") + info := cc.NewStructLayout(t) + if info.NeedExplicitAlign { + fmt.Fprintf(b, "%s [0]uint%d;", p.padName(&npad), 8*p.align(n, t)) + } al := uintptr(t.Align()) sz := t.Size() if al > sz { @@ -2005,7 +2008,7 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string { fmt.Fprintf(b, "uint%d;", f.BitFieldBlockWidth()) fsz = uintptr(f.BitFieldBlockWidth()) >> 3 default: - fmt.Fprintf(b, "%s %s;", p.fieldName2(n, f), p.typ(nil, ft)) + fmt.Fprintf(b, "%s %s;", p.fieldName2(n, f), p.typ(n, ft)) } if pad := sz - fsz; pad != 0 { fmt.Fprintf(b, "%s [%d]byte;", p.padName(&npad), pad) @@ -2023,7 +2026,7 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string { return r } -func (p *project) align(t cc.Type) int { +func (p *project) align(nd cc.Node, t cc.Type) int { switch n := t.Align(); { case n <= 1: return 1 @@ -2031,7 +2034,12 @@ func (p *project) align(t cc.Type) int { return 2 case n <= 4: return 4 + case n <= 8: + return 8 default: + if !p.task.ignoreUnsupportedAligment { + p.err(nd, "unsupported alignment of type %s: %v", t, n) + } return 8 } } @@ -2554,8 +2562,12 @@ package %s p.o("\t\"fmt\"\n") } first := true + libc := false for _, v := range p.task.imported { if v.used { + if v.path == p.task.crtImportPath { + libc = true + } if first { p.o("\n") first = false @@ -2564,6 +2576,9 @@ package %s } } if p.task.crtImportPath != "" { + if !libc { + p.o("\t%q\n", p.task.crtImportPath) + } p.o("\t%q\n", p.task.crtImportPath+"/sys/types") } p.o(`) @@ -2574,6 +2589,9 @@ var _ atomic.Value var _ unsafe.Pointer `) if p.task.crtImportPath != "" { + if libc { + p.o("var _ *libc.TLS\n") + } p.o("var _ types.Size_t\n") } if p.isMain { @@ -2673,6 +2691,10 @@ package %s return } + if out, err := exec.Command("gofmt", "-r", "(x) -> x", "-l", "-s", "-w", p.task.capif).CombinedOutput(); err != nil { + p.err(nil, "%s: %v", out, err) + } + if out, err := exec.Command("gofmt", "-l", "-s", "-w", p.task.capif).CombinedOutput(); err != nil { p.err(nil, "%s: %v", out, err) } @@ -2703,12 +2725,12 @@ func (p *project) initPatches() { switch { case d != nil && d.Type().Kind() == cc.Function: p.w("\n*(*") - p.functionSignature(nil, d.Type(), "") + p.functionSignature(d, nil, d.Type(), "") p.w(")(unsafe.Pointer(uintptr(unsafe.Pointer(&%s))+%d%s)) = ", tld.name, init.Offset, fld) p.declarator(init, nil, d, d.Type(), exprFunc, 0) default: p.w("\n*(*%s)(unsafe.Pointer(uintptr(unsafe.Pointer(&%s))+%d%s)) = ", p.typ(init, patch.t), tld.name, init.Offset, fld) - p.assignmentExpression(nil, expr, patch.t, exprValue, fOutermost) + p.assignmentExpression(nil, expr, patch.t, exprValue, 0) } p.w("// %s:", p.pos(init)) } @@ -2932,7 +2954,7 @@ func (p *project) initDeclarator(f *function, n *cc.InitDeclarator, sep string, default: sv := f.condInitPrefix f.condInitPrefix = func() { - p.declarator(d, f, d, d.Type(), exprLValue, fOutermost) + p.declarator(d, f, d, d.Type(), exprLValue, 0) p.w(" = ") } switch { @@ -2953,7 +2975,7 @@ func (p *project) initDeclarator(f *function, n *cc.InitDeclarator, sep string, case local.isPinned: sv := f.condInitPrefix f.condInitPrefix = func() { - //TODO- p.declarator(d, f, d, d.Type(), exprLValue, fOutermost) + //TODO- p.declarator(d, f, d, d.Type(), exprLValue, 0) //TODO- p.w(" = ") p.w("*(*%s)(unsafe.Pointer(%s%s/* %s */)) = ", p.typ(n, d.Type()), f.bpName, nonZeroUintptr(local.off), local.name) } @@ -3026,7 +3048,7 @@ func (p *project) initDeclaratorDeclVLA(f *function, n *cc.InitDeclarator, sep s p.w("%s%s = %sXrealloc(%s, %s, types.Size_t(", sep, local.name, p.task.crt, f.tlsName, local.name) e := d.Type().LenExpr() - p.assignmentExpression(f, e, e.Operand.Type(), exprValue, fOutermost) + p.assignmentExpression(f, e, e.Operand.Type(), exprValue, 0) if sz := d.Type().Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -3095,7 +3117,7 @@ func (p *project) declaratorDecay(n cc.Node, f *function, d *cc.Declarator, t cc return } - p.w("%s%s/* &%s[0] */", f.bpName, nonZeroUintptr(local.off), local.name) + p.w("(%s%s)/* &%s[0] */", f.bpName, nonZeroUintptr(local.off), local.name) return } } @@ -3261,7 +3283,7 @@ func (p *project) declaratorValueArray(n cc.Node, f *function, d *cc.Declarator, if f != nil { if local := f.locals[d]; local != nil { if local.isPinned { - p.w("%s%s/* %s */", f.bpName, nonZeroUintptr(local.off), local.name) + p.w("(%s%s)/* %s */", f.bpName, nonZeroUintptr(local.off), local.name) return } @@ -3323,14 +3345,14 @@ func (p *project) declaratorFuncNormal(n cc.Node, f *function, d *cc.Declarator, if local := f.locals[d]; local != nil { if local.isPinned { p.w("(*(*") - p.functionSignature(f, u, "") + p.functionSignature(n, f, u, "") p.w(")(unsafe.Pointer(%s%s)))", f.bpName, nonZeroUintptr(local.off)) return } if d.IsParameter { p.w("(*(*") - p.functionSignature(f, u, "") + p.functionSignature(n, f, u, "") p.w(")(unsafe.Pointer(&%s)))", local.name) return } @@ -3340,7 +3362,7 @@ func (p *project) declaratorFuncNormal(n cc.Node, f *function, d *cc.Declarator, if x := p.tlds[d]; x != nil && d.IsStatic() { p.w("(*(*") - p.functionSignature(f, u, "") + p.functionSignature(n, f, u, "") p.w(")(unsafe.Pointer(&%s)))", x.name) return } @@ -3348,7 +3370,7 @@ func (p *project) declaratorFuncNormal(n cc.Node, f *function, d *cc.Declarator, switch x := p.symtab[d.Name().String()].(type) { case *tld: p.w("(*(*") - p.functionSignature(f, u, "") + p.functionSignature(n, f, u, "") p.w(")(unsafe.Pointer(&%s)))", x.name) case *imported: x.used = true @@ -3540,7 +3562,7 @@ func (p *project) declaratorAddrOfArrayParameter(n cc.Node, f *function, d *cc.D } local := f.locals[d] - p.w("%s%s/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name) + p.w("(%s%s)/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name) } func (p *project) declaratorAddrOfFunction(n cc.Node, f *function, d *cc.Declarator) { @@ -3550,7 +3572,7 @@ func (p *project) declaratorAddrOfFunction(n cc.Node, f *function, d *cc.Declara if x := p.tlds[d]; x != nil && d.IsStatic() { p.w("*(*uintptr)(unsafe.Pointer(&struct{f ") - p.functionSignature(f, d.Type(), "") + p.functionSignature(n, f, d.Type(), "") p.w("}{%s}))", x.name) return } @@ -3558,12 +3580,12 @@ func (p *project) declaratorAddrOfFunction(n cc.Node, f *function, d *cc.Declara switch x := p.symtab[d.Name().String()].(type) { case *tld: p.w("*(*uintptr)(unsafe.Pointer(&struct{f ") - p.functionSignature(f, d.Type(), "") + p.functionSignature(n, f, d.Type(), "") p.w("}{%s}))", x.name) case *imported: x.used = true p.w("*(*uintptr)(unsafe.Pointer(&struct{f ") - p.functionSignature(f, d.Type(), "") + p.functionSignature(n, f, d.Type(), "") p.w("}{%sX%s}))", x.qualifier, d.Name()) default: p.err(d, "back-end: undefined: %s", d.Name()) @@ -3579,7 +3601,7 @@ func (p *project) declaratorAddrOfUnion(n cc.Node, f *function, d *cc.Declarator } if local.isPinned { - p.w("%s%s/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name) + p.w("(%s%s)/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name) return } @@ -3612,7 +3634,7 @@ func (p *project) declaratorAddrOfNormal(n cc.Node, f *function, d *cc.Declarato } if local.isPinned { - p.w("%s%s/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name) + p.w("(%s%s)/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name) return } @@ -3654,7 +3676,7 @@ func (p *project) declaratorAddrOfArray(n cc.Node, f *function, d *cc.Declarator } if local.isPinned { - p.w("%s%s/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name) + p.w("(%s%s)/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name) return } @@ -3699,7 +3721,7 @@ func (p *project) convertType(n cc.Node, from, to cc.Type, flags flags) string { // trc("%v: %v -> %v\n%s", p.pos(n), from, to, debug.Stack()[:600]) //TODO- force := flags&fForceConv != 0 if from == nil { - p.w("%s(", p.typ(nil, to)) + p.w("%s(", p.typ(n, to)) return ")" } @@ -4015,7 +4037,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags) value := op.Value() if value == nil || !to.IsIntegerType() { if to.IsScalarType() { - p.w("%s(", p.typ(nil, to)) + p.w("%s(", p.typ(n, to)) return ")" } @@ -4093,7 +4115,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags) switch to.Size() { case 1: if x >= 0 && x <= math.MaxUint8 { - p.w("%s(", p.typ(nil, to)) + p.w("%s(", p.typ(n, to)) return ")" } @@ -4101,7 +4123,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags) return ")" case 2: if x >= 0 && x <= math.MaxUint16 { - p.w("%s(", p.typ(nil, to)) + p.w("%s(", p.typ(n, to)) return ")" } @@ -4109,7 +4131,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags) return ")" case 4: if x >= 0 && x <= math.MaxUint32 { - p.w("%s(", p.typ(nil, to)) + p.w("%s(", p.typ(n, to)) return ")" } @@ -4130,7 +4152,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags) switch to.Size() { case 1: if x <= math.MaxUint8 { - p.w("%s(", p.typ(nil, to)) + p.w("%s(", p.typ(n, to)) return ")" } @@ -4138,7 +4160,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags) return ")" case 2: if x <= math.MaxUint16 { - p.w("%s(", p.typ(nil, to)) + p.w("%s(", p.typ(n, to)) return ")" } @@ -4146,7 +4168,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags) return ")" case 4: if x <= math.MaxUint32 { - p.w("%s(", p.typ(nil, to)) + p.w("%s(", p.typ(n, to)) return ")" } @@ -4318,7 +4340,7 @@ func (p *project) tld(f *function, n *cc.InitDeclarator, sep string, staticLocal t = &tld{} t.name = p.tldScope.take(d.Name()) } - p.functionSignature2(nil, d.Type(), t.name) + p.functionSignature2(n, nil, d.Type(), t.name) } } return @@ -4427,7 +4449,7 @@ func (p *project) functionDefinition(n *cc.FunctionDefinition) { p.compoundStatement(f, n.CompoundStatement, "", false, false, 0) p.pass1 = false p.w("\n\n") - p.functionDefinitionSignature(f, tld) + p.functionDefinitionSignature(n, f, tld) if p.task.header && p.task.funcSig { return } @@ -4532,7 +4554,7 @@ func (p *project) compoundStatement(f *function, n *cc.CompoundStatement, scomme } if n.Parent() == nil && r == nil && f.rt.Kind() != cc.Void { p.w("\nreturn ") - p.zeroValue(f.rt) + p.zeroValue(n, f.rt) } s := tidyComment("\n", &n.Token2) p.w("%s", s) @@ -4545,15 +4567,15 @@ func (p *project) compoundStatement(f *function, n *cc.CompoundStatement, scomme f.block = sv } -func (p *project) zeroValue(t cc.Type) { +func (p *project) zeroValue(n cc.Node, t cc.Type) { if t.IsScalarType() { - p.w("%s(0)", p.typ(nil, t)) + p.w("%s(0)", p.typ(n, t)) return } switch t.Kind() { case cc.Struct, cc.Union: - p.w("%s{}", p.typ(nil, t)) + p.w("%s{}", p.typ(n, t)) default: panic(todo("", t, t.Kind())) } @@ -4596,6 +4618,8 @@ func (p *project) instrument(n cc.Node) { } } +var dummyJumpStatement = &cc.JumpStatement{} + func (p *project) statement(f *function, n *cc.Statement, forceCompoundStmtBrace, forceNoBraces, switchBlock bool, mode exprMode) (r *cc.JumpStatement) { if forceCompoundStmtBrace { p.w(" {") @@ -4618,7 +4642,8 @@ func (p *project) statement(f *function, n *cc.Statement, forceCompoundStmtBrace if mode != 0 { p.w("return ") e := n.ExpressionStatement.Expression - p.expression(f, e, e.Operand.Type(), exprValue, fOutermost) + p.expression(f, e, e.Operand.Type(), exprValue, 0) + r = dummyJumpStatement break } @@ -4687,21 +4712,21 @@ func (p *project) jumpStatement(f *function, n *cc.JumpStatement) (r *cc.JumpSta switch { case f.rt != nil && f.rt.Kind() == cc.Void: if n.Expression != nil { - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, 0) p.w(";") } p.w("return") case f.rt != nil && f.rt.Kind() != cc.Void: if n.Expression != nil { - p.expression(f, n.Expression, f.rt, exprCondReturn, fOutermost) + p.expression(f, n.Expression, f.rt, exprCondReturn, 0) break } p.w("return ") - p.zeroValue(f.rt) + p.zeroValue(n, f.rt) default: if n.Expression != nil { - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, 0) p.w(";") } p.w("return") @@ -4745,7 +4770,7 @@ func (p *project) expressionDecay(f *function, n *cc.Expression, t cc.Type, mode p.w("func() uintptr {") p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, flags) p.w("; return ") - p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags) p.w("}()") default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) @@ -4802,9 +4827,9 @@ func (p *project) expressionAddrOf(f *function, n *cc.Expression, t cc.Type, mod p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags) case cc.ExpressionComma: // Expression ',' AssignmentExpression p.w(" func() uintptr {") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, flags|fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, flags) p.w("; return ") - p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags) p.w("}()") default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) @@ -5084,12 +5109,10 @@ func (p *project) assignmentExpressionBool(f *function, n *cc.AssignmentExpressi // case cc.AssignmentExpressionAnd: // UnaryExpression "&=" AssignmentExpression // case cc.AssignmentExpressionXor: // UnaryExpression "^=" AssignmentExpression // case cc.AssignmentExpressionOr: // UnaryExpression "|=" AssignmentExpression - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0 ") - p.assignmentExpression(f, n, t, exprValue, flags|fOutermost) + p.assignmentExpression(f, n, t, exprValue, flags) } } @@ -5152,9 +5175,9 @@ func (p *project) assignmentExpressionValueAssignStructAddrof(f *function, n *cc if local.isPinned { if !p.pass1 { p.w("%sXmemmove(tls, ", p.task.crt) - p.unaryExpression(f, n.UnaryExpression, lhs, exprAddrOf, flags|fOutermost) + p.unaryExpression(f, n.UnaryExpression, lhs, exprAddrOf, flags) p.w(", ") - p.assignmentExpression(f, n.AssignmentExpression, rhs, exprAddrOf, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, rhs, exprAddrOf, flags) p.w(", %d)", lhs.Size()) return } @@ -5167,9 +5190,9 @@ func (p *project) assignmentExpressionValueAssignStructAddrof(f *function, n *cc } p.w("%sXmemmove(tls, ", p.task.crt) - p.unaryExpression(f, n.UnaryExpression, lhs, exprAddrOf, flags|fOutermost) + p.unaryExpression(f, n.UnaryExpression, lhs, exprAddrOf, flags) p.w(", ") - p.assignmentExpression(f, n.AssignmentExpression, rhs, exprAddrOf, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, rhs, exprAddrOf, flags) p.w(", %d)", lhs.Size()) } @@ -5231,9 +5254,9 @@ func (p *project) assignmentExpressionValueAssignStruct(f *function, n *cc.Assig } p.w(" func() %s { __v := ", p.typ(n, lhs)) - p.assignmentExpression(f, n.AssignmentExpression, rhs, exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, rhs, exprValue, flags) p.w(";") - p.unaryExpression(f, n.UnaryExpression, lhs, exprLValue, flags|fOutermost) + p.unaryExpression(f, n.UnaryExpression, lhs, exprLValue, flags) p.w(" = __v; return __v}()") } @@ -5249,7 +5272,7 @@ func (p *project) assignmentExpressionValueAssignBitfield(f *function, n *cc.Ass p.w("%sAssignBitFieldPtr%d%s(", p.task.crt, bf.BitFieldBlockWidth(), p.bfHelperType(lt)) p.unaryExpression(f, lhs, lt, exprAddrOf, flags) p.w(", ") - p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags) p.w(", %d, %d, %#x)", bf.BitFieldWidth(), bf.BitFieldOffset(), bf.Mask()) } @@ -5265,13 +5288,13 @@ func (p *project) assignmentExpressionValueAssignNormal(f *function, n *cc.Assig p.w("%sAssignPtr%s(", p.task.crt, p.helperType(d, d.Type())) p.w("%s%s /* %s */", f.bpName, nonZeroUintptr(local.off), local.name) p.w(", ") - p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags) return } defer p.w(")%s", p.convertType(n, d.Type(), t, flags)) p.w("%sAssign%s(&%s, ", p.task.crt, p.helperType(n, d.Type()), local.name) - p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags) return } } @@ -5280,7 +5303,7 @@ func (p *project) assignmentExpressionValueAssignNormal(f *function, n *cc.Assig p.w("%sAssignPtr%s(", p.task.crt, p.helperType(n, n.UnaryExpression.Operand.Type())) p.unaryExpression(f, n.UnaryExpression, n.UnaryExpression.Operand.Type(), exprAddrOf, flags) p.w(", ") - p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags) } func (p *project) assignmentExpressionVoid(f *function, n *cc.AssignmentExpression, t cc.Type, mode exprMode, flags flags) { @@ -5307,29 +5330,29 @@ func (p *project) assignmentExpressionVoid(f *function, n *cc.AssignmentExpressi p.unaryExpression(f, lhs, lt, exprLValue, flags) p.w(" = ") } - p.assignmentExpression(f, n.AssignmentExpression, lt, exprCondInit, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, lt, exprCondInit, flags) p.w(";") default: if d != nil && p.isVolatileOrAtomic(d) { - p.setVolatileDeclarator(d, f, n.AssignmentExpression, lt, mode, flags|fOutermost) + p.setVolatileDeclarator(d, f, n.AssignmentExpression, lt, mode, flags) return } p.unaryExpression(f, lhs, lt, exprLValue, flags) p.w(" = ") - p.assignmentExpression(f, n.AssignmentExpression, lt, mode, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, lt, mode, flags) } case opBitfield: bf := lt.BitField() p.w("%sSetBitFieldPtr%d%s(", p.task.crt, bf.BitFieldBlockWidth(), p.bfHelperType(lt)) p.unaryExpression(f, lhs, lt, exprAddrOf, flags) p.w(", ") - p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags) p.w(", %d, %#x)", bf.BitFieldOffset(), bf.Mask()) case opUnion: p.unaryExpression(f, lhs, lt, exprLValue, flags) p.w(" = ") - p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags) default: panic(todo("", n.Position(), k)) } @@ -5372,7 +5395,7 @@ func (p *project) setVolatileDeclarator(d *cc.Declarator, f *function, n *cc.Ass if local := f.locals[d]; local != nil { if local.isPinned { p.w("%sAtomicStoreP%s(%s%s /* %s */, ", p.task.crt, p.helperType(n, d.Type()), f.bpName, nonZeroUintptr(local.off), local.name) - p.assignmentExpression(f, n, t, mode, flags|fOutermost) + p.assignmentExpression(f, n, t, mode, flags) p.w(")") return } @@ -5522,11 +5545,11 @@ func (p *project) conditionalExpressionDecay(f *function, n *cc.ConditionalExpre case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression t = t.Decay() p.w(" func() %s { if ", p.typ(n, t)) - p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost) + p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" { return ") switch n.Expression.Operand.Type().Kind() { case cc.Array: - p.expression(f, n.Expression, t, exprDecay, flags|fOutermost) + p.expression(f, n.Expression, t, exprDecay, flags) case cc.Ptr: panic(todo("", n.Expression.Position(), n.Expression.Operand.Type())) default: @@ -5535,9 +5558,9 @@ func (p *project) conditionalExpressionDecay(f *function, n *cc.ConditionalExpre p.w("}; return ") switch n.ConditionalExpression.Operand.Type().Kind() { case cc.Array: - p.conditionalExpression(f, n.ConditionalExpression, t, exprDecay, flags|fOutermost) + p.conditionalExpression(f, n.ConditionalExpression, t, exprDecay, flags) default: - p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags|fOutermost) + p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags) } p.w("}()") default: @@ -5553,11 +5576,11 @@ func (p *project) conditionalExpressionInit(f *function, n *cc.ConditionalExpres case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression t = t.Decay() p.w("if ") - p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost) + p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" {") - p.expression(f, n.Expression, t, mode, flags|fOutermost) + p.expression(f, n.Expression, t, mode, flags) p.w("} else { ") - p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags|fOutermost) + p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags) p.w("}") default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) @@ -5572,11 +5595,11 @@ func (p *project) conditionalExpressionReturn(f *function, n *cc.ConditionalExpr case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression t = t.Decay() p.w("if ") - p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost) + p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" {") - p.expression(f, n.Expression, t, mode, flags|fOutermost) + p.expression(f, n.Expression, t, mode, flags) p.w("}; ") - p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags|fOutermost) + p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -5608,9 +5631,9 @@ func (p *project) conditionalExpressionFunc(f *function, n *cc.ConditionalExpres } p.w(" func() ") - p.functionSignature(f, t, "") + p.functionSignature(n, f, t, "") p.w("{ if ") - p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost) + p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" { return ") switch d := n.Expression.Declarator(); { case d != nil: @@ -5660,12 +5683,10 @@ func (p *project) conditionalExpressionBool(f *function, n *cc.ConditionalExpres case cc.ConditionalExpressionLOr: // LogicalOrExpression p.logicalOrExpression(f, n.LogicalOrExpression, t, mode, flags) case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0 ") - p.conditionalExpression(f, n, t, exprValue, flags|fOutermost) + p.conditionalExpression(f, n, t, exprValue, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -5678,11 +5699,11 @@ func (p *project) conditionalExpressionAddrOf(f *function, n *cc.ConditionalExpr case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression t = t.Decay() p.w(" func() %s { if ", p.typ(n, t)) - p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost) + p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" { return ") - p.expression(f, n.Expression, t, exprValue, flags|fOutermost) + p.expression(f, n.Expression, t, exprValue, flags) p.w("}; return ") - p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags|fOutermost) + p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags) p.w("}()") default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) @@ -5697,17 +5718,17 @@ func (p *project) conditionalExpressionVoid(f *function, n *cc.ConditionalExpres switch { case n.Expression.IsSideEffectsFree: p.w("if !(") - p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost) + p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(") {") - p.conditionalExpression(f, n.ConditionalExpression, n.ConditionalExpression.Operand.Type(), mode, flags|fOutermost) + p.conditionalExpression(f, n.ConditionalExpression, n.ConditionalExpression.Operand.Type(), mode, flags) p.w("}") default: p.w("if ") - p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost) + p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" {") - p.expression(f, n.Expression, n.Expression.Operand.Type(), mode, flags|fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), mode, flags) p.w("} else {") - p.conditionalExpression(f, n.ConditionalExpression, n.ConditionalExpression.Operand.Type(), mode, flags|fOutermost) + p.conditionalExpression(f, n.ConditionalExpression, n.ConditionalExpression.Operand.Type(), mode, flags) p.w("}") } default: @@ -5722,11 +5743,11 @@ func (p *project) conditionalExpressionValue(f *function, n *cc.ConditionalExpre case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression t = t.Decay() p.w(" func() %s { if ", p.typ(n, t)) - p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost) + p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" { return ") - p.expression(f, n.Expression, t, exprValue, flags|fOutermost) + p.expression(f, n.Expression, t, exprValue, flags) p.w("}; return ") - p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags|fOutermost) + p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags) p.w("}()") default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) @@ -5841,7 +5862,7 @@ func (p *project) logicalOrExpressionVoid(f *function, n *cc.LogicalOrExpression p.logicalAndExpression(f, n.LogicalAndExpression, t, mode, flags) case cc.LogicalOrExpressionLOr: // LogicalOrExpression "||" LogicalAndExpression p.w("_ = ") - p.logicalOrExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.logicalOrExpression(f, n, n.Operand.Type(), exprValue, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -5870,7 +5891,6 @@ func (p *project) binaryLogicalOrExpression(f *function, n *cc.LogicalOrExpressi } func (p *project) binaryLogicalOrExpressionBool(f *function, n *cc.LogicalOrExpression, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, n.Operand.Type(), &mode, flags)) p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" ||%s", tidyComment(" ", &n.Token)) @@ -5878,7 +5898,6 @@ func (p *project) binaryLogicalOrExpressionBool(f *function, n *cc.LogicalOrExpr } func (p *project) binaryLogicalOrExpressionValue(f *function, n *cc.LogicalOrExpression, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags)) p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags) p.w(" ||%s", tidyComment(" ", &n.Token)) @@ -5886,10 +5905,8 @@ func (p *project) binaryLogicalOrExpressionValue(f *function, n *cc.LogicalOrExp } func (p *project) booleanBinaryExpression(n cc.Node, from cc.Operand, to cc.Type, mode *exprMode, flags flags) (r string) { - if flags&fOutermost == 0 { - p.w("(") - r = ")" - } + p.w("(") + r = ")" switch *mode { case exprBool: *mode = exprValue @@ -6037,7 +6054,6 @@ func (p *project) binaryLogicalAndExpression(f *function, n *cc.LogicalAndExpres } func (p *project) binaryLogicalAndExpressionValue(f *function, n *cc.LogicalAndExpression, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags)) p.logicalAndExpression(f, n.LogicalAndExpression, n.LogicalAndExpression.Operand.Type(), exprBool, flags) p.w(" &&%s", tidyComment(" ", &n.Token)) @@ -6045,7 +6061,6 @@ func (p *project) binaryLogicalAndExpressionValue(f *function, n *cc.LogicalAndE } func (p *project) binaryLogicalAndExpressionBool(f *function, n *cc.LogicalAndExpression, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags)) p.logicalAndExpression(f, n.LogicalAndExpression, n.LogicalAndExpression.Operand.Type(), exprBool, flags) p.w(" &&%s", tidyComment(" ", &n.Token)) @@ -6160,7 +6175,7 @@ func (p *project) inclusiveOrExpressionVoid(f *function, n *cc.InclusiveOrExpres p.exclusiveOrExpression(f, n.ExclusiveOrExpression, t, mode, flags) case cc.InclusiveOrExpressionOr: // InclusiveOrExpression '|' ExclusiveOrExpression p.w("_ = ") - p.inclusiveOrExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.inclusiveOrExpression(f, n, n.Operand.Type(), exprValue, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -6203,7 +6218,6 @@ func (p *project) binaryInclusiveOrExpressionValue(f *function, n *cc.InclusiveO return } - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) switch { case orOverflows(n.InclusiveOrExpression.Operand, n.ExclusiveOrExpression.Operand, n.Promote()): @@ -6219,7 +6233,6 @@ func (p *project) binaryInclusiveOrExpressionValue(f *function, n *cc.InclusiveO func (p *project) binaryOrExpressionUint128(f *function, n *cc.InclusiveOrExpression, t cc.Type, mode exprMode, flags flags) { // InclusiveOrExpression '|' ExclusiveOrExpression - flags |= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) p.inclusiveOrExpression(f, n.InclusiveOrExpression, n.Promote(), exprValue, flags) p.w(".Or(") @@ -6228,7 +6241,6 @@ func (p *project) binaryOrExpressionUint128(f *function, n *cc.InclusiveOrExpres } func (p *project) binaryInclusiveOrExpressionBool(f *function, n *cc.InclusiveOrExpression, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) switch { case orOverflows(n.InclusiveOrExpression.Operand, n.ExclusiveOrExpression.Operand, n.Promote()): @@ -6252,10 +6264,8 @@ func orOverflows(lo, ro cc.Operand, promote cc.Type) bool { } func (p *project) artithmeticBinaryExpression(n cc.Node, from cc.Operand, to cc.Type, mode *exprMode, flags flags) (r string) { - if flags&fOutermost == 0 { - p.w("(") - r = ")" - } + p.w("(") + r = ")" switch *mode { case exprBool: p.w("(") @@ -6382,7 +6392,7 @@ func (p *project) exclusiveOrExpressionVoid(f *function, n *cc.ExclusiveOrExpres p.andExpression(f, n.AndExpression, t, mode, flags) case cc.ExclusiveOrExpressionXor: // ExclusiveOrExpression '^' AndExpression p.w("_ = ") - p.exclusiveOrExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.exclusiveOrExpression(f, n, n.Operand.Type(), exprValue, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -6423,7 +6433,6 @@ func (p *project) binaryExclusiveOrExpressionValue(f *function, n *cc.ExclusiveO return } - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) switch { case xorOverflows(n.ExclusiveOrExpression.Operand, n.AndExpression.Operand, n.Promote()): @@ -6439,7 +6448,6 @@ func (p *project) binaryExclusiveOrExpressionValue(f *function, n *cc.ExclusiveO func (p *project) binaryExclusiveOrExpressionUint128(f *function, n *cc.ExclusiveOrExpression, t cc.Type, mode exprMode, flags flags) { // ExclusiveOrExpression '^' AndExpression - flags |= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) p.exclusiveOrExpression(f, n.ExclusiveOrExpression, n.Promote(), exprValue, flags) p.w(".Xor(") @@ -6566,7 +6574,7 @@ func (p *project) andExpressionVoid(f *function, n *cc.AndExpression, t cc.Type, p.equalityExpression(f, n.EqualityExpression, t, mode, flags) case cc.AndExpressionAnd: // AndExpression '&' EqualityExpression p.w("_ = ") - p.andExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.andExpression(f, n, n.Operand.Type(), exprValue, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -6596,7 +6604,6 @@ func (p *project) binaryAndExpression(f *function, n *cc.AndExpression, t cc.Typ } func (p *project) binaryAndExpressionBool(f *function, n *cc.AndExpression, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, n.Operand.Type(), &mode, flags)) switch { case andOverflows(n.AndExpression.Operand, n.EqualityExpression.Operand, n.Promote()): @@ -6624,7 +6631,6 @@ func (p *project) binaryAndExpressionValue(f *function, n *cc.AndExpression, t c return } - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) switch { case andOverflows(n.AndExpression.Operand, n.EqualityExpression.Operand, n.Promote()): @@ -6640,7 +6646,6 @@ func (p *project) binaryAndExpressionValue(f *function, n *cc.AndExpression, t c func (p *project) binaryAndExpressionUint128(f *function, n *cc.AndExpression, t cc.Type, mode exprMode, flags flags) { // AndExpression '&' EqualityExpression - flags |= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) p.andExpression(f, n.AndExpression, n.Promote(), exprValue, flags) p.w(".And(") @@ -6781,7 +6786,7 @@ func (p *project) equalityExpressionVoid(f *function, n *cc.EqualityExpression, // case cc.EqualityExpressionEq: // EqualityExpression "==" RelationalExpression // case cc.EqualityExpressionNeq: // EqualityExpression "!=" RelationalExpression p.w("_ = ") - p.equalityExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.equalityExpression(f, n, n.Operand.Type(), exprValue, flags) } } @@ -6810,7 +6815,6 @@ func (p *project) binaryEqualityExpression(f *function, n *cc.EqualityExpression } func (p *project) binaryEqualityExpressionBool(f *function, n *cc.EqualityExpression, oper string, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags)) p.equalityExpression(f, n.EqualityExpression, n.Promote(), exprValue, flags) p.w(" %s%s", oper, tidyComment(" ", &n.Token)) @@ -6818,7 +6822,6 @@ func (p *project) binaryEqualityExpressionBool(f *function, n *cc.EqualityExpres } func (p *project) binaryEqualityExpressionValue(f *function, n *cc.EqualityExpression, oper string, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags)) p.equalityExpression(f, n.EqualityExpression, n.Promote(), exprValue, flags) p.w(" %s%s", oper, tidyComment(" ", &n.Token)) @@ -6979,7 +6982,7 @@ func (p *project) relationalExpressionVoid(f *function, n *cc.RelationalExpressi // case cc.RelationalExpressionLeq: // RelationalExpression "<=" ShiftExpression // case cc.RelationalExpressionGeq: // RelationalExpression ">=" ShiftExpression p.w("_ = ") - p.relationalExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.relationalExpression(f, n, n.Operand.Type(), exprValue, flags) } } @@ -7013,7 +7016,6 @@ func (p *project) binaryRelationalExpression(f *function, n *cc.RelationalExpres return } - flags &^= fOutermost defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags)) p.relationalExpression(f, n.RelationalExpression, n.Promote(), exprValue, flags) p.w(" %s%s", oper, tidyComment(" ", &n.Token)) @@ -7022,7 +7024,6 @@ func (p *project) binaryRelationalExpression(f *function, n *cc.RelationalExpres func (p *project) binaryRelationalExpressionInt128(f *function, n *cc.RelationalExpression, oper string, t cc.Type, mode exprMode, flags flags) { // RelationalExpression "<=" ShiftExpression - flags |= fOutermost defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags)) p.relationalExpression(f, n.RelationalExpression, n.Promote(), exprValue, flags) p.w(".Cmp(") @@ -7189,7 +7190,6 @@ func (p *project) todo(n cc.Node, t cc.Type) { } func (p *project) binaryShiftExpressionBool(f *function, n *cc.ShiftExpression, oper string, t cc.Type, mode exprMode, flags flags) { - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, n.Operand.Type(), &mode, flags)) switch { case n.ShiftExpression.Operand.Type().IsBitFieldType(): @@ -7231,14 +7231,13 @@ func bfValueMask(bf cc.Field) uint64 { func (p *project) binaryShiftExpressionValue(f *function, n *cc.ShiftExpression, oper string, t cc.Type, mode exprMode, flags flags) { // ShiftExpression "<<" AdditiveExpression - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) switch k := n.ShiftExpression.Operand.Type().Kind(); { case k == cc.Int128, k == cc.UInt128: p.w("(") - p.shiftExpression(f, n.ShiftExpression, n.Operand.Type(), exprValue, flags|fOutermost) + p.shiftExpression(f, n.ShiftExpression, n.Operand.Type(), exprValue, flags) p.w(").%s(", shiftOp(oper)) - p.additiveExpression(f, n.AdditiveExpression, p.intType, exprValue, flags|fOutermost) + p.additiveExpression(f, n.AdditiveExpression, p.intType, exprValue, flags) p.w(")") case n.ShiftExpression.Operand.Type().IsBitFieldType(): p.w("(") @@ -7416,7 +7415,7 @@ func (p *project) additiveExpressionVoid(f *function, n *cc.AdditiveExpression, cc.AdditiveExpressionSub: // AdditiveExpression '-' MultiplicativeExpression p.w("_ = ") - p.additiveExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.additiveExpression(f, n, n.Operand.Type(), exprValue, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -7449,7 +7448,6 @@ func (p *project) binaryAdditiveExpression(f *function, n *cc.AdditiveExpression func (p *project) binaryAdditiveExpressionBool(f *function, n *cc.AdditiveExpression, oper string, t cc.Type, mode exprMode, flags flags) { // AdditiveExpression '+' MultiplicativeExpression - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, n.Operand.Type(), &mode, flags)) lo := n.AdditiveExpression.Operand ro := n.MultiplicativeExpression.Operand @@ -7495,7 +7493,6 @@ func (p *project) binaryAdditiveExpressionValue(f *function, n *cc.AdditiveExpre return } - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) lo := n.AdditiveExpression.Operand ro := n.MultiplicativeExpression.Operand @@ -7554,7 +7551,7 @@ func (p *project) binaryAdditiveExpressionValue(f *function, n *cc.AdditiveExpre p.w("(") p.additiveExpression(f, n.AdditiveExpression, lt, exprValue, flags) p.w(" %s%s", oper, tidyComment(" ", &n.Token)) - p.multiplicativeExpression(f, n.MultiplicativeExpression, rt.Decay(), exprDecay, flags&^fOutermost) + p.multiplicativeExpression(f, n.MultiplicativeExpression, rt.Decay(), exprDecay, flags) p.w(")/%d", lt.Elem().Size()) case lt.Kind() == cc.Array && rt.Kind() == cc.Ptr && oper == "-": // p - q panic(todo("", p.pos(n))) @@ -7567,7 +7564,6 @@ func (p *project) binaryAdditiveExpressionValue(f *function, n *cc.AdditiveExpre func (p *project) binaryAdditiveExpressionUint128(f *function, n *cc.AdditiveExpression, oper string, t cc.Type, mode exprMode, flags flags) { // AdditiveExpression '+' MultiplicativeExpression - flags |= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) p.additiveExpression(f, n.AdditiveExpression, n.Promote(), exprValue, flags) switch oper { @@ -7793,12 +7789,10 @@ func (p *project) multiplicativeExpressionBool(f *function, n *cc.Multiplicative cc.MultiplicativeExpressionDiv, // MultiplicativeExpression '/' CastExpression cc.MultiplicativeExpressionMod: // MultiplicativeExpression '%' CastExpression - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0 ") - p.multiplicativeExpression(f, n, t, exprValue, flags|fOutermost) + p.multiplicativeExpression(f, n, t, exprValue, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -7873,7 +7867,6 @@ func (p *project) binaryMultiplicativeExpressionValue(f *function, n *cc.Multipl return } - flags &^= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) switch { case intMulOverflows(n, n.Operand, n.MultiplicativeExpression.Operand, n.CastExpression.Operand, oper, n.Promote()): @@ -7898,7 +7891,6 @@ func (p *project) binaryMultiplicativeExpressionValue(f *function, n *cc.Multipl func (p *project) binaryMultiplicativeExpressionUint128(f *function, n *cc.MultiplicativeExpression, oper string, t cc.Type, mode exprMode, flags flags) { // MultiplicativeExpression '*' CastExpression - flags |= fOutermost defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags)) p.multiplicativeExpression(f, n.MultiplicativeExpression, n.Promote(), exprValue, flags) switch oper { @@ -8065,7 +8057,7 @@ func (p *project) castExpressionFunc(f *function, n *cc.CastExpression, t cc.Typ switch et := ot.Elem(); et.Kind() { case cc.Function, cc.Void: p.w("(*(*") - p.functionSignature(f, ft, "") + p.functionSignature(n, f, ft, "") p.w(")(unsafe.Pointer(") p.castExpression(f, n.CastExpression, ot, exprAddrOf, flags) p.w(")))") @@ -8107,12 +8099,10 @@ func (p *project) castExpressionBool(f *function, n *cc.CastExpression, t cc.Typ case cc.CastExpressionUnary: // UnaryExpression p.unaryExpression(f, n.UnaryExpression, t, mode, flags) case cc.CastExpressionCast: // '(' TypeName ')' CastExpression - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0 ") - p.castExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.castExpression(f, n, n.Operand.Type(), exprValue, flags) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) } @@ -8212,7 +8202,7 @@ func (p *project) castExpressionValueNormal(f *function, n *cc.CastExpression, t panic(todo("", p.pos(n))) case isNegativeInt(op) && isUnsigned(t): defer p.w("%s", p.convertType(n, tn, t, flags|fForceConv)) - p.castExpression(f, n.CastExpression, tn, exprValue, flags|fOutermost) + p.castExpression(f, n.CastExpression, tn, exprValue, flags) default: defer p.w("%s", p.convertType(n, tn, t, flags)) p.castExpression(f, n.CastExpression, tn, exprValue, flags) @@ -8494,15 +8484,13 @@ func (p *project) unaryExpressionBool(f *function, n *cc.UnaryExpression, t cc.T p.postfixExpression(f, n.PostfixExpression, t, mode, flags) case cc.UnaryExpressionNot: // '!' CastExpression p.w("!(") - p.castExpression(f, n.CastExpression, t, mode, flags|fOutermost) + p.castExpression(f, n.CastExpression, t, mode, flags) p.w(")") default: - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0 ") - p.unaryExpression(f, n, t, exprValue, flags|fOutermost) + p.unaryExpression(f, n, t, exprValue, flags) } } @@ -8575,11 +8563,11 @@ func (p *project) unaryExpressionVoid(f *function, n *cc.UnaryExpression, t cc.T case n.CastExpression.Operand.Type().Kind() == cc.Array: panic(todo("", p.pos(n))) default: - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprAddrOf, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprAddrOf, flags) } case cc.UnaryExpressionDeref: // '*' CastExpression p.w("_ = *(*byte)(unsafe.Pointer(") - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags) p.w("))") case cc.UnaryExpressionPlus, // '+' CastExpression @@ -8588,8 +8576,8 @@ func (p *project) unaryExpressionVoid(f *function, n *cc.UnaryExpression, t cc.T cc.UnaryExpressionCpl: // '~' CastExpression p.w("_ = ") - defer p.w("%s", p.convert(n, n.CastExpression.Operand, p.intType, flags|fOutermost)) - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost) + defer p.w("%s", p.convert(n, n.CastExpression.Operand, p.intType, flags)) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags) case cc.UnaryExpressionSizeofExpr: // "sizeof" UnaryExpression // nop case cc.UnaryExpressionSizeofType: // "sizeof" '(' TypeName ')' @@ -8625,7 +8613,7 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc. case n.CastExpression.Operand.Type().Kind() == cc.Array: panic(todo("", p.pos(n))) default: - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprAddrOf, flags&^fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprAddrOf, flags) } case cc.UnaryExpressionDeref: // '*' CastExpression ot := n.CastExpression.Operand.Type() @@ -8682,7 +8670,7 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc. p.castExpression(f, n.CastExpression, n.Operand.Type(), exprValue, flags|fForceRuntimeConv) default: p.w("%sCpl%s(", p.task.crt, p.helperType(n, n.Operand.Type())) - p.castExpression(f, n.CastExpression, n.Operand.Type(), exprValue, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.Operand.Type(), exprValue, flags) p.w(")") } default: @@ -8691,9 +8679,10 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc. } case cc.UnaryExpressionNot: // '!' CastExpression p.w("%sBool%s(!(", p.task.crt, p.helperType(n, t)) - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprBool, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprBool, flags) p.w("))") case cc.UnaryExpressionSizeofExpr: // "sizeof" UnaryExpression + p.checkSizeof(n.UnaryExpression, n.UnaryExpression.Operand.Type()) defer p.w("%s", p.convertNil(n, t, flags)) if d := n.UnaryExpression.Declarator(); d != nil { var isLocal bool @@ -8747,6 +8736,7 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc. case cc.UnaryExpressionSizeofType: // "sizeof" '(' TypeName ')' defer p.w("%s", p.convertNil(n, t, flags)) t := n.TypeName.Type() + p.checkSizeof(n.TypeName, t) if t.Kind() == cc.Array { p.w("%d", t.Len()*t.Elem().Size()) break @@ -8829,6 +8819,27 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc. } } +func (p *project) checkSizeof(n cc.Node, t cc.Type) { + if !p.checkSizeof0(n, t) { + p.err(n, "sizeof type %s: not supported", t.Alias()) + } +} + +func (p *project) checkSizeof0(n cc.Node, t cc.Type) (ok bool) { + switch t.Kind() { + case cc.Array: + return !t.IsVLA() + case cc.Struct, cc.Union: + nf := t.NumField() + for i := []int{0}; i[0] < nf; i[0]++ { + if !p.checkSizeof0(n, t.FieldByIndex(i).Type()) { + return false + } + } + } + return true +} + func (p *project) unaryExpressionLValue(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) { switch n.Case { case cc.UnaryExpressionPostfix: // PostfixExpression @@ -9043,12 +9054,10 @@ func (p *project) unaryExpressionDeref(f *function, n *cc.UnaryExpression, t cc. func (p *project) unaryExpressionDerefBool(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) { // '*' CastExpression - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags) p.w(")) != 0") } @@ -9075,13 +9084,13 @@ func (p *project) unaryExpressionDerefLValue(f *function, n *cc.UnaryExpression, func (p *project) unaryExpressionDerefLValueArray(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) { defer p.w("))%s", p.convertType(n, n.CastExpression.Operand.Type().Elem(), t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags) } func (p *project) unaryExpressionDerefLValueNormal(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) { defer p.w("))%s", p.convertType(n, n.CastExpression.Operand.Type().Elem(), t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags) } func (p *project) unaryExpressionDerefValue(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) { @@ -9098,7 +9107,7 @@ func (p *project) unaryExpressionDerefValue(f *function, n *cc.UnaryExpression, func (p *project) unaryExpressionDerefValueArray(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) { defer p.w("%s", p.convertType(n, n.CastExpression.Operand.Type().Elem(), t, flags)) - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags) p.w("[0]") } @@ -9110,7 +9119,7 @@ func (p *project) unaryExpressionDerefValueNormal(f *function, n *cc.UnaryExpres default: defer p.w("))%s", p.convertType(n, n.CastExpression.Operand.Type().Elem(), t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), mode, flags|fOutermost) + p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), mode, flags) } } @@ -9149,14 +9158,14 @@ func (p *project) postfixExpressionDecay(f *function, n *cc.PostfixExpression, t p.w("(") switch { case pe.Kind() == cc.Array: - p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags) case pe.Kind() == cc.Ptr: - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) default: panic(todo("", p.pos(n))) } if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -9188,40 +9197,30 @@ func (p *project) postfixExpressionBool(f *function, n *cc.PostfixExpression, t case cc.PostfixExpressionPrimary: // PrimaryExpression p.primaryExpression(f, n.PrimaryExpression, t, mode, flags) case cc.PostfixExpressionIndex: // PostfixExpression '[' Expression ']' - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0") p.postfixExpression(f, n, t, exprValue, flags) case cc.PostfixExpressionCall: // PostfixExpression '(' ArgumentExpressionList ')' p.postfixExpressionCall(f, n, t, mode, flags) case cc.PostfixExpressionSelect: // PostfixExpression '.' IDENTIFIER - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0") p.postfixExpression(f, n, t, exprValue, flags) case cc.PostfixExpressionPSelect: // PostfixExpression "->" IDENTIFIER - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0") p.postfixExpression(f, n, t, exprValue, flags) case cc.PostfixExpressionInc: // PostfixExpression "++" - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0") p.postfixExpression(f, n, t, exprValue, flags) case cc.PostfixExpressionDec: // PostfixExpression "--" - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0") p.postfixExpression(f, n, t, exprValue, flags) case cc.PostfixExpressionComplit: // '(' TypeName ')' '{' InitializerList ',' '}' @@ -9229,10 +9228,8 @@ func (p *project) postfixExpressionBool(f *function, n *cc.PostfixExpression, t case cc.PostfixExpressionTypeCmp: // "__builtin_types_compatible_p" '(' TypeName ',' TypeName ')' panic(todo("", p.pos(n))) case cc.PostfixExpressionChooseExpr: - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0") p.postfixExpression(f, n, t, exprValue, flags) default: @@ -9350,28 +9347,24 @@ func (p *project) postfixExpressionPSelectIndexNormal(f *function, n *cc.Postfix case n.Operand.Type().Kind() == cc.Array: panic(todo("", p.pos(n))) case pe.Kind() == cc.Array: - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") p.w("(*(**%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type().Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Decay().Elem().Size(); sz != 1 { p.w("*%d", sz) } } p.w(")))") default: - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") p.w("(*(**%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type().Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Decay().Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -9467,7 +9460,7 @@ func (p *project) postfixExpressionSelectPSelectUnion(f *function, n *cc.Postfix pe := n.PostfixExpression.Operand.Type() defer p.w("%s", p.convert(n, n.Operand, t, flags)) p.w("(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) p.w("))") } } @@ -9533,7 +9526,7 @@ func (p *project) postfixExpressionSelectSelectStruct(f *function, n *cc.Postfix p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value) } pe := n.PostfixExpression.Operand.Type() - p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags) p.w(".%s", p.fieldName(n, n.Token2.Value)) } } @@ -9556,7 +9549,7 @@ func (p *project) postfixExpressionSelectSelectUnion(f *function, n *cc.PostfixE pe := n.PostfixExpression.Operand.Type() defer p.w("%s", p.convert(n, n.Operand, t, flags)) p.w("(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags) p.w("))") } } @@ -9585,9 +9578,9 @@ func (p *project) postfixExpressionSelectIndexArrayParamater(f *function, n *cc. panic(todo("", p.pos(n))) default: p.w("(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Decay().Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -9606,9 +9599,9 @@ func (p *project) postfixExpressionSelectIndexNormal(f *function, n *cc.PostfixE panic(todo("", p.pos(n))) case pe.Kind() != cc.Ptr: p.w("(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Decay().Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -9616,9 +9609,9 @@ func (p *project) postfixExpressionSelectIndexNormal(f *function, n *cc.PostfixE p.w("))") default: p.w("(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Decay().Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -9636,9 +9629,9 @@ func (p *project) postfixExpressionSelectIndexArray(f *function, n *cc.PostfixEx panic(todo("", p.pos(n))) default: pe := n.PostfixExpression.Operand.Type() - p.postfixExpression(f, n.PostfixExpression, pe, mode, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, mode, flags) p.w("[") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) p.w("]") } } @@ -9722,35 +9715,30 @@ func (p *project) postfixExpressionAddrOf(f *function, n *cc.PostfixExpression, func (p *project) postfixExpressionAddrOfPSelect(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) { // PostfixExpression "->" IDENTIFIER - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") pe := n.PostfixExpression.Operand.Type() switch { case n.Operand.Type().IsBitFieldType(): - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) p.bitFldOff(pe.Elem(), n.Token2) case pe.Kind() == cc.Array: - p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags) p.fldOff(pe.Elem(), n.Token2) default: - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) p.fldOff(pe.Elem(), n.Token2) } } func (p *project) postfixExpressionAddrOfIndex(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) { // PostfixExpression '[' Expression ']' - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") switch { case n.Operand.Type().Kind() == cc.Array: fallthrough default: - flags &^= fOutermost pe := n.PostfixExpression.Operand.Type() d := n.PostfixExpression.Declarator() switch { @@ -9772,20 +9760,18 @@ func (p *project) postfixExpressionAddrOfIndex(f *function, n *cc.PostfixExpress func (p *project) postfixExpressionAddrOfSelect(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) { // PostfixExpression '.' IDENTIFIER - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") switch { case n.Operand.Type().IsBitFieldType(): pe := n.PostfixExpression.Operand.Type() - p.postfixExpression(f, n.PostfixExpression, nil, mode, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, nil, mode, flags) p.bitFldOff(pe, n.Token2) case n.Operand.Type().Kind() == cc.Array: fallthrough default: pe := n.PostfixExpression.Operand.Type() - p.postfixExpression(f, n.PostfixExpression, nil, mode, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, nil, mode, flags) p.fldOff(pe, n.Token2) } } @@ -9799,11 +9785,9 @@ func (p *project) postfixExpressionFunc(f *function, n *cc.PostfixExpression, t case cc.Ptr: switch et := n.Operand.Type().Elem(); et.Kind() { case cc.Function: - p.w("(*(*") - p.functionSignature(f, n.Operand.Type().Elem(), "") - p.w(")(unsafe.Pointer(") - p.postfixExpression(f, n, n.Operand.Type(), exprAddrOf, flags) - p.w(")))") + p.fnVal(n, f, func() { + p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags) + }, nil, n.Operand.Type(), 0, mode, flags) default: panic(todo("", p.pos(n), et, et.Kind())) } @@ -9815,11 +9799,9 @@ func (p *project) postfixExpressionFunc(f *function, n *cc.PostfixExpression, t case cc.Ptr: switch et := n.Operand.Type().Elem(); et.Kind() { case cc.Function: - p.w("(*(*") - p.functionSignature(f, n.Operand.Type().Elem(), "") - p.w(")(unsafe.Pointer(") - p.postfixExpressionCall(f, n, t, exprValue, flags) - p.w(")))") + p.fnVal(n, f, func() { + p.postfixExpressionCall(f, n, t, exprValue, flags) + }, nil, n.Operand.Type(), 0, mode, flags) default: panic(todo("", p.pos(n), et, et.Kind())) } @@ -9866,15 +9848,15 @@ func (p *project) postfixExpressionVoid(f *function, n *cc.PostfixExpression, t p.primaryExpression(f, n.PrimaryExpression, t, mode, flags) case cc.PostfixExpressionIndex: // PostfixExpression '[' Expression ']' p.w("_ = ") - p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags) case cc.PostfixExpressionCall: // PostfixExpression '(' ArgumentExpressionList ')' p.postfixExpressionCall(f, n, n.Operand.Type(), mode, flags) case cc.PostfixExpressionSelect: // PostfixExpression '.' IDENTIFIER p.w("_ = ") - p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags) case cc.PostfixExpressionPSelect: // PostfixExpression "->" IDENTIFIER p.w("_ = ") - p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags) case cc.PostfixExpressionInc: // PostfixExpression "++" p.postfixExpressionIncDec(f, n, "++", "+=", t, mode, flags) case cc.PostfixExpressionDec: // PostfixExpression "--" @@ -10178,13 +10160,11 @@ func (p *project) postfixExpressionValueIndexArrayParameter(f *function, n *cc.P switch { case n.Operand.Type().Kind() == cc.Array: defer p.w("%s", p.convert(n, n.Operand, t, flags)) - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost) + p.w("(") + defer p.w(")") + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -10192,9 +10172,9 @@ func (p *project) postfixExpressionValueIndexArrayParameter(f *function, n *cc.P default: defer p.w("%s", p.convert(n, n.Operand, t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -10207,15 +10187,13 @@ func (p *project) postfixExpressionValueIndexNormal(f *function, n *cc.PostfixEx // PostfixExpression '[' Expression ']' switch { case n.Operand.Type().Kind() == cc.Array: - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") pe := n.PostfixExpression.Operand.Type() defer p.w("%s", p.convert(n, n.Operand, t, flags)) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -10225,9 +10203,9 @@ func (p *project) postfixExpressionValueIndexNormal(f *function, n *cc.PostfixEx case cc.Ptr: defer p.w("%s", p.convert(n, n.Operand, t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -10236,9 +10214,9 @@ func (p *project) postfixExpressionValueIndexNormal(f *function, n *cc.PostfixEx case cc.Array: defer p.w("%s", p.convert(n, n.Operand, t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -10256,22 +10234,20 @@ func (p *project) postfixExpressionValueIndexArray(f *function, n *cc.PostfixExp switch n.Operand.Type().Kind() { case cc.Array: defer p.w("%s", p.convert(n, n.Operand, t, flags)) - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } - p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags|fOutermost) + p.w("(") + defer p.w(")") + p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } } default: defer p.w("%s", p.convert(n, n.Operand, t, flags)) - p.postfixExpression(f, n.PostfixExpression, pe, mode, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, mode, flags) p.w("[") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) p.w("]") } } @@ -10305,14 +10281,14 @@ func (p *project) postfixExpressionValueSelectUnion(f *function, n *cc.PostfixEx p.w("<<%d>>%[1]d", int(fld.Promote().Size()*8)-fld.BitFieldWidth()) } case n.Operand.Type().Kind() == cc.Array: - p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags) default: if fld.IsBitField() { p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value) } defer p.w("%s", p.convert(n, n.Operand, t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags) p.w("))") } } @@ -10346,7 +10322,7 @@ func (p *project) postfixExpressionValueSelectStruct(f *function, n *cc.PostfixE p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value) } defer p.w("%s", p.convert(n, n.Operand, t, flags)) - p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags) p.w(".%s", p.fieldName(n, n.Token2.Value)) } } @@ -10389,7 +10365,7 @@ func (p *project) postfixExpressionLValuePSelect(f *function, n *cc.PostfixExpre } p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.postfixExpression(f, pe, pe.Operand.Type(), exprValue, flags|fOutermost) + p.postfixExpression(f, pe, pe.Operand.Type(), exprValue, flags) p.fldOff(pe.Operand.Type().Elem(), n.Token2) p.w("))") case opUnion: @@ -10463,9 +10439,9 @@ func (p *project) postfixExpressionLValueIndexArrayParameter(f *function, n *cc. defer p.w("%s", p.convert(n, n.Operand, t, flags)) pe := n.PostfixExpression.Operand.Type() p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -10483,9 +10459,9 @@ func (p *project) postfixExpressionLValueIndexNormal(f *function, n *cc.PostfixE case cc.Ptr: defer p.w("%s", p.convert(n, n.Operand, t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -10494,9 +10470,9 @@ func (p *project) postfixExpressionLValueIndexNormal(f *function, n *cc.PostfixE case cc.Array: defer p.w("%s", p.convert(n, n.Operand, t, flags)) p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem())) - p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags) if !n.Expression.Operand.IsZero() { - p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand) + p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand) if sz := pe.Elem().Size(); sz != 1 { p.w("*%d", sz) } @@ -10511,9 +10487,9 @@ func (p *project) postfixExpressionLValueIndexNormal(f *function, n *cc.PostfixE func (p *project) postfixExpressionLValueIndexArray(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) { // PostfixExpression '[' Expression ']' pe := n.PostfixExpression.Operand.Type() - p.postfixExpression(f, n.PostfixExpression, pe, mode, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, mode, flags) p.w("[") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) p.w("]") } @@ -10528,7 +10504,7 @@ func (p *project) postfixExpressionLValueSelect(f *function, n *cc.PostfixExpres } p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.postfixExpression(f, pe, pe.Operand.Type(), exprAddrOf, flags|fOutermost) + p.postfixExpression(f, pe, pe.Operand.Type(), exprAddrOf, flags) p.fldOff(pe.Operand.Type(), n.Token2) p.w("))") case opUnion: @@ -10561,7 +10537,7 @@ func (p *project) postfixExpressionLValueSelectUnion(f *function, n *cc.PostfixE p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value) } p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type())) - p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags) nonZeroUintptr(fld.Offset()) p.w("))") } @@ -10578,7 +10554,7 @@ func (p *project) postfixExpressionLValueSelectStruct(f *function, n *cc.Postfix p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value) } pe := n.PostfixExpression.Operand.Type() - p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags) p.w(".%s", p.fieldName(n, n.Token2.Value)) } } @@ -10836,10 +10812,8 @@ func (p *project) postfixExpressionCall(f *function, n *cc.PostfixExpression, t func (p *project) postfixExpressionCallBool(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) { // PostfixExpression '(' ArgumentExpressionList ')' - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } + p.w("(") + defer p.w(")") defer p.w(" != 0") if d := n.PostfixExpression.Declarator(); d != nil { switch d.Name() { @@ -10866,7 +10840,7 @@ func (p *project) postfixExpressionCallBool(f *function, n *cc.PostfixExpression if f != nil { va = f.vaLists[n] } - p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags) p.argumentExpressionList(f, n.PostfixExpression, n.ArgumentExpressionList, va) } @@ -10916,7 +10890,7 @@ func (p *project) postfixExpressionCallValue(f *function, n *cc.PostfixExpressio if f != nil { va = f.vaLists[n] } - p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags) p.argumentExpressionList(f, n.PostfixExpression, n.ArgumentExpressionList, va) } @@ -10948,7 +10922,7 @@ func (p *project) mulOverflow(f *function, n *cc.PostfixExpression, t cc.Type, m types := []cc.Type{vt, vt, pt} for i, v := range args[:3] { p.w(", ") - p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost) + p.assignmentExpression(f, v, types[i], exprValue, flags) } p.w(")") return @@ -10985,7 +10959,7 @@ func (p *project) subOverflow(f *function, n *cc.PostfixExpression, t cc.Type, m types := []cc.Type{vt, vt, pt} for i, v := range args[:3] { p.w(", ") - p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost) + p.assignmentExpression(f, v, types[i], exprValue, flags) } p.w(")") return @@ -11022,7 +10996,7 @@ func (p *project) addOverflow(f *function, n *cc.PostfixExpression, t cc.Type, m types := []cc.Type{vt, vt, pt} for i, v := range args[:3] { p.w(", ") - p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost) + p.assignmentExpression(f, v, types[i], exprValue, flags) } p.w(")") return @@ -11068,7 +11042,7 @@ func (p *project) atomicLoadN(f *function, n *cc.PostfixExpression, t cc.Type, m if i != 0 { p.w(", ") } - p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost) + p.assignmentExpression(f, v, types[i], exprValue, flags) } p.w(")") return @@ -11115,7 +11089,7 @@ func (p *project) postfixExpressionCallVoid(f *function, n *cc.PostfixExpression if f != nil { va = f.vaLists[n] } - p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags&^fOutermost) + p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags) p.argumentExpressionList(f, n.PostfixExpression, n.ArgumentExpressionList, va) } @@ -11159,7 +11133,7 @@ func (p *project) atomicStoreN(f *function, n *cc.PostfixExpression, t cc.Type, if i == 1 { p.w("%s(", strings.ToLower(p.helperType(n, vt))) } - p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost) + p.assignmentExpression(f, v, types[i], exprValue, flags) if i == 1 { p.w(")") } @@ -11230,14 +11204,14 @@ func (p *project) argumentExpressionList(f *function, pe *cc.PostfixExpression, case isTransparentUnion(params[i].Type()): p.callArgTransparentUnion(f, arg, pt) default: - p.assignmentExpression(f, arg, arg.Promote(), mode, fOutermost) + p.assignmentExpression(f, arg, arg.Promote(), mode, 0) } case va && i == len(params): p.w("%sVaList(%s%s, ", p.task.crt, f.bpName, nonZeroUintptr(bpOff)) paren = ")" fallthrough default: - flags := fOutermost + var flags flags if arg.Promote().IsIntegerType() { switch x := arg.Operand.Value().(type) { case cc.Int64Value: @@ -11322,7 +11296,7 @@ func (p *project) callArgTransparentUnion(f *function, n *cc.AssignmentExpressio panic(todo("", n.Position(), k, pt)) } - p.assignmentExpression(f, n, ot, exprValue, fOutermost) + p.assignmentExpression(f, n, ot, exprValue, 0) default: panic(todo("", n.Position(), k, pt)) } @@ -11452,7 +11426,7 @@ func (p *project) primaryExpressionVoid(f *function, n *cc.PrimaryExpression, t switch n.Case { case cc.PrimaryExpressionIdent: // IDENTIFIER p.w("_ = ") - p.primaryExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost) + p.primaryExpression(f, n, n.Operand.Type(), exprValue, flags) case cc.PrimaryExpressionInt, // INTCONST cc.PrimaryExpressionFloat, // FLOATCONST cc.PrimaryExpressionEnum, // ENUMCONST @@ -11463,7 +11437,7 @@ func (p *project) primaryExpressionVoid(f *function, n *cc.PrimaryExpression, t // nop case cc.PrimaryExpressionExpr: // '(' Expression ')' - p.expression(f, n.Expression, n.Expression.Operand.Type(), mode, flags|fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), mode, flags) case cc.PrimaryExpressionStmt: // '(' CompoundStatement ')' p.compoundStatement(f, n.CompoundStatement, "", true, false, 0) default: @@ -11472,7 +11446,7 @@ func (p *project) primaryExpressionVoid(f *function, n *cc.PrimaryExpression, t } func (p *project) primaryExpressionBool(f *function, n *cc.PrimaryExpression, t cc.Type, mode exprMode, flags flags) { - if flags&fOutermost == 0 && n.Case != cc.PrimaryExpressionExpr { + if n.Case != cc.PrimaryExpressionExpr { p.w("(") defer p.w(")") } @@ -11505,7 +11479,7 @@ func (p *project) primaryExpressionBool(f *function, n *cc.PrimaryExpression, t case cc.PrimaryExpressionExpr: // '(' Expression ')' p.w("(") defer p.w(")") - p.expression(f, n.Expression, t, mode, flags|fOutermost) + p.expression(f, n.Expression, t, mode, flags) case cc.PrimaryExpressionStmt: // '(' CompoundStatement ')' p.w("func() %v {", p.typ(n, n.CompoundStatement.Operand.Type())) p.compoundStatement(f, n.CompoundStatement, "", true, false, exprValue) @@ -11700,11 +11674,9 @@ func (p *project) primaryExpressionValue(f *function, n *cc.PrimaryExpression, t case cc.PrimaryExpressionLString: // LONGSTRINGLITERAL p.w("%s", p.wideStringLiteral(n.Operand.Value(), 0)) case cc.PrimaryExpressionExpr: // '(' Expression ')' - if flags&fOutermost == 0 { - p.w("(") - defer p.w(")") - } - p.expression(f, n.Expression, t, mode, flags|fOutermost) + p.w("(") + defer p.w(")") + p.expression(f, n.Expression, t, mode, flags) case cc.PrimaryExpressionStmt: // '(' CompoundStatement ')' p.statementExpression(f, n.CompoundStatement, t, mode, flags) default: @@ -11745,7 +11717,7 @@ func (p *project) primaryExpressionLValue(f *function, n *cc.PrimaryExpression, case cc.PrimaryExpressionExpr: // '(' Expression ')' p.w("(") defer p.w(")") - p.expression(f, n.Expression, t, mode, flags|fOutermost) + p.expression(f, n.Expression, t, mode, flags) case cc.PrimaryExpressionStmt: // '(' CompoundStatement ')' p.err(n, "statement expressions not supported") default: @@ -11766,7 +11738,7 @@ func (p *project) stringLiteralString(s string) string { p.ts.WriteByte(0) p.tsOffs[id] = off } - return fmt.Sprintf("%s%s%s", p.tsNameP, nonZeroUintptr(off), p.stringSnippet(s)) + return fmt.Sprintf("(%s%s)%s", p.tsNameP, nonZeroUintptr(off), p.stringSnippet(s)) } func (p *project) stringLiteral(v cc.Value) string { @@ -11785,7 +11757,7 @@ func (p *project) stringLiteral(v cc.Value) string { p.ts.WriteByte(0) p.tsOffs[id] = off } - return fmt.Sprintf("%s%s%s", p.tsNameP, nonZeroUintptr(off), p.stringSnippet(s)) + return fmt.Sprintf("(%s%s)%s", p.tsNameP, nonZeroUintptr(off), p.stringSnippet(s)) default: panic(todo("%T", x)) } @@ -11821,7 +11793,7 @@ func (p *project) wideStringLiteral(v cc.Value, pad int) string { p.tsW = append(p.tsW, 0) p.tsWOffs[id] = off } - return fmt.Sprintf("%s%s", p.tsWNameP, nonZeroUintptr(off)) + return fmt.Sprintf("(%s%s)", p.tsWNameP, nonZeroUintptr(off)) default: panic(todo("%T", x)) } @@ -11861,38 +11833,50 @@ func (p *project) charConst(n cc.Node, src string, op cc.Operand, to cc.Type, fl p.w("%d", on) return case to.IsSignedType(): + var in int64 + var ok bool switch to.Size() { case 1: - mask = math.MaxInt8 + in = int64(int8(on)) + ok = int8(on) >= 0 case 2: - mask = math.MaxInt16 + in = int64(int16(on)) + ok = int16(on) >= 0 case 4: - mask = math.MaxInt32 + in = int64(int32(on)) + ok = int32(on) >= 0 case 8: - mask = math.MaxInt64 + in = int64(int64(on)) + ok = in >= 0 default: panic(todo("", op.Type().Size())) } + if ok && rValid && uint64(in) == on { // Prefer original form + p.w("%s", src) + return + } + + p.w("%d", in) default: switch to.Size() { case 1: - mask = math.MaxUint8 + mask = 0xff case 2: - mask = math.MaxUint16 + mask = 0xffff case 4: - mask = math.MaxUint32 + mask = 0xffffffff case 8: - mask = math.MaxUint64 + mask = 0xffffffffffffffff default: panic(todo("", op.Type().Size())) } - } - if rValid && uint64(r)&mask == on { // Prefer original form - p.w("%s", src) - return - } + if rValid && uint64(r)&mask == on { // Prefer original form + p.w("%s", src) + return + } - p.w("%d", mask&on) + p.w("%d", on&mask) + } } func (p *project) floatConst(n cc.Node, src string, op cc.Operand, to cc.Type, flags flags) { @@ -12116,15 +12100,15 @@ func (p *project) assignShiftOpVoidNormal(f *function, n *cc.AssignmentExpressio if d := n.UnaryExpression.Declarator(); d != nil { switch d.Type().Kind() { case cc.Int128, cc.UInt128: - p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost) + p.declarator(n, f, d, d.Type(), exprLValue, flags) p.w(".LValue%s(", oper2) - p.assignmentExpression(f, n.AssignmentExpression, p.intType, exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, p.intType, exprValue, flags) p.w(")") return default: - p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost) + p.declarator(n, f, d, d.Type(), exprLValue, flags) p.w(" %s= ", oper) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) return } } @@ -12133,9 +12117,9 @@ func (p *project) assignShiftOpVoidNormal(f *function, n *cc.AssignmentExpressio switch { case lhs.Operand.Type().IsArithmeticType(): p.w("%sAssign%sPtr%s(", p.task.crt, oper2, p.helperType(n, lhs.Operand.Type())) - p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost) + p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags) p.w(", int(") - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) p.w("))") default: panic(todo("", p.pos(n), lhs.Operand.Type())) @@ -12186,11 +12170,11 @@ func (p *project) assignOpValueBitfield(f *function, n *cc.AssignmentExpression, switch pe.Case { case cc.PostfixExpressionSelect: // PostfixExpression '.' IDENTIFIER p.w("__p := ") - p.postfixExpression(f, pe, pe.Operand.Type(), exprAddrOf, flags|fOutermost) + p.postfixExpression(f, pe, pe.Operand.Type(), exprAddrOf, flags) p.w("; __v := ") p.readBitfield(lhs, "__p", bf, ot) p.w(" %s (", oper) - p.assignmentExpression(f, n.AssignmentExpression, ot, exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, ot, exprValue, flags) p.w("); return %sAssignBitFieldPtr%d%s(__p, __v, %d, %d, %#x)", p.task.crt, bf.BitFieldBlockWidth(), p.bfHelperType(ot), bf.BitFieldWidth(), bf.BitFieldOffset(), bf.Mask()) case cc.PostfixExpressionPSelect: // PostfixExpression "->" IDENTIFIER panic(todo("", p.pos(n))) @@ -12231,12 +12215,12 @@ func (p *project) assignOpValueNormal(f *function, n *cc.AssignmentExpression, t case lhs.Operand.Type().IsArithmeticType(): defer p.w("%s", p.convertType(n, lhs.Operand.Type(), t, flags)) p.w("%sAssign%sPtr%s(", p.task.crt, oper2, p.helperType(n, lhs.Operand.Type())) - p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost) + p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags) p.w(", ") if asInt { p.w("int(") } - p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags) if asInt { p.w(")") } @@ -12251,23 +12235,23 @@ func (p *project) assignOpValueNormal(f *function, n *cc.AssignmentExpression, t case d.Type().Kind() == cc.Ptr: defer p.w("%s", p.convertType(n, d.Type(), t, flags)) p.w("%sAssign%s%s(&", p.task.crt, oper2, p.helperType(n, d.Type())) - p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost) + p.declarator(n, f, d, d.Type(), exprLValue, flags) p.w(", ") if dd := p.incDelta(d, d.Type()); dd != 1 { p.w("%d*(", dd) defer p.w(")") } - p.assignmentExpression(f, n.AssignmentExpression, d.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, d.Type(), exprValue, flags) p.w(")") case d.Type().IsArithmeticType(): defer p.w("%s", p.convertType(n, d.Type(), t, flags)) p.w("%sAssign%s%s(&", p.task.crt, oper2, p.helperType(n, d.Type())) - p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost) + p.declarator(n, f, d, d.Type(), exprLValue, flags) p.w(", ") if asInt { p.w("int(") } - p.assignmentExpression(f, n.AssignmentExpression, d.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, d.Type(), exprValue, flags) p.w(")") if asInt { p.w(")") @@ -12282,12 +12266,12 @@ func (p *project) assignOpValueNormal(f *function, n *cc.AssignmentExpression, t case lhs.Operand.Type().IsArithmeticType(): defer p.w("%s", p.convertType(n, lhs.Operand.Type(), t, flags)) p.w("%sAssign%sPtr%s(", p.task.crt, oper2, p.helperType(n, lhs.Operand.Type())) - p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost) + p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags) p.w(", ") if asInt { p.w("int(") } - p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags) if asInt { p.w(")") } @@ -12322,7 +12306,7 @@ func (p *project) assignOpVoidArrayParameter(f *function, n *cc.AssignmentExpres case local != nil && local.isPinned: p.w("*(*uintptr)(unsafe.Pointer(%s%s))", f.bpName, nonZeroUintptr(local.off)) default: - p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost) + p.declarator(n, f, d, d.Type(), exprLValue, flags) } p.w(" %s= ", oper) @@ -12330,7 +12314,7 @@ func (p *project) assignOpVoidArrayParameter(f *function, n *cc.AssignmentExpres p.w("%d*", dd) } p.w("uintptr(") - p.assignmentExpression(f, n.AssignmentExpression, n.AssignmentExpression.Operand.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.AssignmentExpression.Operand.Type(), exprValue, flags) p.w(")") } @@ -12351,7 +12335,7 @@ func (p *project) assignOpVoidBitfield(f *function, n *cc.AssignmentExpression, p.unaryExpression(f, lhs, lt, exprValue, flags) p.w(")%s %s ", s, oper) s = p.convertType(n, lt, n.Promote(), flags) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) p.w("%s", s) p.w(", %d, %#x)", bf.BitFieldOffset(), bf.Mask()) case cc.PostfixExpressionPSelect: // PostfixExpression "->" IDENTIFIER @@ -12387,11 +12371,11 @@ func (p *project) assignOpVoidNormal(f *function, n *cc.AssignmentExpression, t defer p.w(")") } defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags)) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) case d.Type().IsArithmeticType(): p.w(" %s= ", oper) defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags)) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) default: panic(todo("", n.Position(), d.Type().Kind())) } @@ -12444,22 +12428,22 @@ func (p *project) assignOpVoidNormal(f *function, n *cc.AssignmentExpression, t } p.w("%sAtomicAdd%s(&%s, %s%s(", p.task.crt, ht, nm, sign, p.typ(n, d.Type())) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) p.w("))") return default: p.warn(n, "unsupported volatile declarator operation: %v", oper) p.w("%s = ", nm) defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags)) - p.declarator(n, f, d, n.Promote(), exprValue, flags|fOutermost) + p.declarator(n, f, d, n.Promote(), exprValue, flags) p.w(" %s (", oper) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) p.w(")") return } } - p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost) + p.declarator(n, f, d, d.Type(), exprLValue, flags) switch d.Type().Kind() { case cc.Ptr: if oper != "+" && oper != "-" { @@ -12472,19 +12456,19 @@ func (p *project) assignOpVoidNormal(f *function, n *cc.AssignmentExpression, t defer p.w(")") } defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags)) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) case cc.Int128, cc.UInt128: p.w(" = ") - p.declarator(n, f, d, n.Promote(), exprValue, flags|fOutermost) + p.declarator(n, f, d, n.Promote(), exprValue, flags) p.w(".%s(", oper2) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) p.w(")") default: p.w(" = ") defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags)) - p.declarator(n, f, d, n.Promote(), exprValue, flags|fOutermost) + p.declarator(n, f, d, n.Promote(), exprValue, flags) p.w(" %s (", oper) - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) p.w(")") } return @@ -12494,17 +12478,17 @@ func (p *project) assignOpVoidNormal(f *function, n *cc.AssignmentExpression, t switch { case lhs.Operand.Type().IsArithmeticType(): p.w("*(*%s)(unsafe.Pointer(", p.typ(n, lhs.Operand.Type())) - p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost) + p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags) p.w(")) %s= ", oper) defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), lhs.Operand.Type(), flags)) p.w("(") - p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags) p.w(")") case lhs.Operand.Type().Kind() == cc.Ptr: p.w("*(*%s)(unsafe.Pointer(", p.typ(n, lhs.Operand.Type())) - p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost) + p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags) p.w(")) %s= (", oper) - p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags|fOutermost) + p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags) p.w(")") if dd := p.incDelta(n, lhs.Operand.Type()); dd != 1 { p.w("*%d", dd) @@ -12545,7 +12529,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) { f.continueCtx = a f.breakCtx = b p.w("__%d: if !(", a) - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.w(") { goto __%d };", b) p.statement(f, n.Statement, false, false, false, 0) p.w("; goto __%d; __%d:", a, b) @@ -12553,7 +12537,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) { } p.w("for ") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.statement(f, n.Statement, true, false, false, 0) case cc.IterationStatementDo: // "do" Statement "while" '(' Expression ')' ';' if f.hasJumps { @@ -12568,7 +12552,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) { p.w("__%d:", a) p.statement(f, n.Statement, false, false, false, 0) p.w(";goto __%d; __%[1]d: if ", b) - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.w("{goto __%d};goto __%d;__%[2]d:", a, c) break } @@ -12578,7 +12562,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) { v = f.scope.take(cc.String(v)) } p.w("for %v := true; %[1]v; %[1]v = ", v) - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.statement(f, n.Statement, true, false, false, 0) case cc.IterationStatementFor: // "for" '(' Expression ';' Expression ';' Expression ')' Statement if f.hasJumps || n.Expression3 != nil && n.Expression3.Case == cc.ExpressionComma { @@ -12594,7 +12578,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) { c := f.flatLabel() f.breakCtx = c if n.Expression != nil { - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fNoCondAssignment) } semi := "" if n.Expression != nil || n.Expression2 != nil || n.Expression3 != nil { @@ -12603,14 +12587,14 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) { p.w("%s__%d:", semi, a) if n.Expression2 != nil { p.w("if !(") - p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprBool, 0) p.w(") { goto __%d }", c) } p.w("%s", semi) p.statement(f, n.Statement, false, false, false, 0) p.w(";goto __%d; __%[1]d:", b) if n.Expression3 != nil { - p.expression(f, n.Expression3, n.Expression3.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment) + p.expression(f, n.Expression3, n.Expression3.Operand.Type(), exprVoid, fNoCondAssignment) } p.w("%sgoto __%d; goto __%d;__%[3]d:", semi, a, c) break @@ -12618,21 +12602,21 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) { expr := true if n.Expression != nil && n.Expression.Case == cc.ExpressionComma { - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, 0) p.w(";") expr = false } p.w("for ") if expr && n.Expression != nil { - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fNoCondAssignment) } p.w("; ") if n.Expression2 != nil { - p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprBool, 0) } p.w("; ") if n.Expression3 != nil { - p.expression(f, n.Expression3, n.Expression3.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment) + p.expression(f, n.Expression3, n.Expression3.Operand.Type(), exprVoid, fNoCondAssignment) } p.statement(f, n.Statement, true, false, false, 0) case cc.IterationStatementForDecl: // "for" '(' Declaration Expression ';' Expression ')' Statement @@ -12658,14 +12642,14 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) { p.w("__%d:", a) if n.Expression != nil { p.w("if !(") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.w(") { goto __%d }", c) } p.w(";") p.statement(f, n.Statement, false, false, false, 0) p.w(";goto __%d; __%[1]d:", b) if n.Expression2 != nil { - p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment) + p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprVoid, fNoCondAssignment) } p.w("; goto __%d; goto __%d;__%[2]d:\n}", a, c) default: @@ -12687,7 +12671,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) { f.ifCtx = n a := f.flatLabel() p.w("if !(") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.w(") { goto __%d };", a) p.statement(f, n.Statement, false, false, false, 0) p.w(";__%d: ", a) @@ -12695,7 +12679,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) { } p.w("if ") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.statement(f, n.Statement, true, false, false, 0) case cc.SelectionStatementIfElse: // "if" '(' Expression ')' Statement "else" Statement sv := f.ifCtx @@ -12711,7 +12695,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) { a := f.flatLabel() b := f.flatLabel() p.w("if !(") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.w(") { goto __%d };", a) p.statement(f, n.Statement, false, false, false, 0) p.w(";goto __%d; __%d:", b, a) @@ -12721,7 +12705,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) { } p.w("if ") - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0) p.statement(f, n.Statement, true, false, false, 0) p.w(" else ") switch { @@ -12746,7 +12730,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) { f.switchCtx = inSwitchFirst p.w("switch ") - p.expression(f, n.Expression, n.Promote(), exprValue, fOutermost) + p.expression(f, n.Expression, n.Promote(), exprValue, 0) p.statement(f, n.Statement, true, false, true, 0) default: panic(todo("%v: internal error: %v", n.Position(), n.Case)) @@ -12780,7 +12764,7 @@ func (p *project) flatSwitch(f *function, n *cc.SelectionStatement) { svBreakCtx := f.breakCtx f.breakCtx = f.flatLabel() p.w("switch ") - p.expression(f, n.Expression, n.Promote(), exprValue, fOutermost) + p.expression(f, n.Expression, n.Promote(), exprValue, 0) p.w("{") for _, ls := range cases { switch ls.Case { @@ -12788,7 +12772,7 @@ func (p *project) flatSwitch(f *function, n *cc.SelectionStatement) { continue case cc.LabeledStatementCaseLabel: // "case" ConstantExpression ':' Statement p.w("%scase ", tidyComment("\n", ls)) - p.constantExpression(f, ls.ConstantExpression, ls.ConstantExpression.Operand.Type(), exprValue, fOutermost) + p.constantExpression(f, ls.ConstantExpression, ls.ConstantExpression.Operand.Type(), exprValue, 0) p.w(":") case cc.LabeledStatementDefault: // "default" ':' Statement p.w("%sdefault:", tidyComment("\n", ls)) @@ -12817,7 +12801,7 @@ func (p *project) expressionStatement(f *function, n *cc.ExpressionStatement) { return } - p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost) + p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, 0) } func (p *project) labeledStatement(f *function, n *cc.LabeledStatement) (r *cc.JumpStatement) { @@ -12886,7 +12870,7 @@ func (p *project) labeledStatementCase(f *function, n *cc.LabeledStatement) { p.w("%s__%d:", tidyComment("\n", n), f.flatSwitchLabels[n]) default: p.w("%scase ", tidyComment("\n", n)) - p.constantExpression(f, n.ConstantExpression, n.ConstantExpression.Operand.Type(), exprValue, fOutermost) + p.constantExpression(f, n.ConstantExpression, n.ConstantExpression.Operand.Type(), exprValue, 0) p.w(":") } case cc.LabeledStatementDefault: // "default" ':' Statement @@ -12907,17 +12891,17 @@ func (p *project) constantExpression(f *function, n *cc.ConstantExpression, t cc p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags) } -func (p *project) functionDefinitionSignature(f *function, tld *tld) { +func (p *project) functionDefinitionSignature(n cc.Node, f *function, tld *tld) { switch { case f.mainSignatureForced: p.w("%sfunc %s(%s *%sTLS, _ int32, _ uintptr) int32", tidyComment("\n", f.fndef), tld.name, f.tlsName, p.task.crt) default: p.w("%s", tidyComment("\n", f.fndef)) - p.functionSignature(f, f.fndef.Declarator.Type(), tld.name) + p.functionSignature(n, f, f.fndef.Declarator.Type(), tld.name) } } -func (p *project) functionSignature2(f *function, t cc.Type, nm string) { +func (p *project) functionSignature2(n cc.Node, f *function, t cc.Type, nm string) { p.w("func %s", nm) p.w("(_ *%sTLS", p.task.crt) suffix := 1 @@ -12941,11 +12925,11 @@ func (p *project) functionSignature2(f *function, t cc.Type, nm string) { } p.w(")") if rt := t.Result(); rt != nil && rt.Kind() != cc.Void { - p.w(" %s", p.typ(nil, rt)) + p.w(" %s", p.typ(n, rt)) } } -func (p *project) functionSignature(f *function, t cc.Type, nm string) { +func (p *project) functionSignature(n cc.Node, f *function, t cc.Type, nm string) { p.w("func") if nm != "" { p.w(" %s", nm) @@ -12982,7 +12966,7 @@ func (p *project) functionSignature(f *function, t cc.Type, nm string) { } p.w(")") if rt := t.Result(); rt != nil && rt.Kind() != cc.Void { - p.w(" %s", p.typ(nil, rt)) + p.w(" %s", p.typ(n, rt)) } } @@ -13000,7 +12984,7 @@ func (p *project) paramTyp(n cc.Node, t cc.Type) string { } } - return p.typ(nil, t) + return p.typ(n, t) } func (p *project) dbg(a ...interface{}) { @@ -13034,7 +13018,7 @@ func (p *project) fnVal(n cc.Node, f *function, expr func(), exprDecl *cc.Declar case 0: // (*struct{ f func()})(unsafe.Pointer(&struct{uintptr}{fprintfptr})).f() p.w("(*struct{ f ") - p.functionSignature(f, et, "") + p.functionSignature(n, f, et, "") p.w("})(unsafe.Pointer(&struct{uintptr}{") expr() p.w("})).f") @@ -13051,7 +13035,7 @@ func (p *project) fnVal(n cc.Node, f *function, expr func(), exprDecl *cc.Declar default: // (*struct{ f func()})(unsafe.Pointer(&struct{uintptr}{fprintfptr})).f() p.w("(*(**struct{ f ") - p.functionSignature(f, et2, "") + p.functionSignature(n, f, et2, "") p.w("})(unsafe.Pointer(&struct{uintptr}{") expr() p.w("}))).f") diff --git a/vendor/modernc.org/ccgo/v3/lib/init.go b/vendor/modernc.org/ccgo/v3/lib/init.go index ad443cd2e..db3ad9133 100644 --- a/vendor/modernc.org/ccgo/v3/lib/init.go +++ b/vendor/modernc.org/ccgo/v3/lib/init.go @@ -59,7 +59,7 @@ func (p *project) initializerInner(tag string, off uintptr, f *function, s []*cc tld.patches = append(tld.patches, initPatch{t, s[0], patchField}) p.w(" 0 ") default: - p.assignmentExpression(f, s[0].AssignmentExpression, t, exprValue, fOutermost) + p.assignmentExpression(f, s[0].AssignmentExpression, t, exprValue, 0) } return } @@ -79,7 +79,7 @@ func (p *project) initializerInner(tag string, off uintptr, f *function, s []*cc case cc.Struct, cc.Union: if compatibleStructOrUnion(t, s[0].AssignmentExpression.Operand.Type()) { p.w("%s%s", tidyComment("", s[0]), tag) - p.assignmentExpression(f, s[0].AssignmentExpression, t, exprValue, fOutermost) + p.assignmentExpression(f, s[0].AssignmentExpression, t, exprValue, 0) return } } @@ -258,7 +258,7 @@ func (p *project) initializerStruct(tag string, off uintptr, f *function, s []*c bitFld := v.Field p.w("%s%s", tidyComment("", v.AssignmentExpression), tag) tag = "" - p.assignmentExpression(f, v.AssignmentExpression, bft, exprValue, fOutermost) + p.assignmentExpression(f, v.AssignmentExpression, bft, exprValue, 0) p.w("&%#x", uint64(1)<<uint64(bitFld.BitFieldWidth())-1) if o := bitFld.BitFieldOffset() + 8*int((bitFld.Offset()-off0)); o != 0 { p.w("<<%d", o) @@ -387,14 +387,14 @@ func (p *project) initializerUnion(tag string, off uintptr, f *function, s []*cc case fld != nil && fld.IsBitField(): bft := p.bitFileType(part, fld.BitFieldBlockWidth()) p.w("*(*%s)(unsafe.Pointer(uintptr(unsafe.Pointer(&r))+%d)) |= ", p.typ(part, bft), part.Offset-off) - p.assignmentExpression(f, part.AssignmentExpression, bft, exprValue, fOutermost) + p.assignmentExpression(f, part.AssignmentExpression, bft, exprValue, 0) p.w("&%#x", uint64(1)<<uint64(fld.BitFieldWidth())-1) if o := fld.BitFieldOffset(); o != 0 { p.w("<<%d", o) } default: p.w("*(*%s)(unsafe.Pointer(uintptr(unsafe.Pointer(&r))+%d)) = ", p.typ(part, ft), part.Offset-off) - p.assignmentExpression(f, part.AssignmentExpression, ft, exprValue, fOutermost) + p.assignmentExpression(f, part.AssignmentExpression, ft, exprValue, 0) } p.w("\n") } |