Commit 11695596 authored by Russ Cox's avatar Russ Cox

cgo: use correct frame size for 0 arguments

Passing a frame size of 1 was causing the cgo callback
to push 1 byte of arguments onto the stack, making
the stack pointer misaligned, which had the effect of
hiding all the pointers on the stack from the garbage
collector.

SWIG only wraps calls to C++ virtual methods, so it
always has at least 1 argument, so SWIG does not need
to be fixed too.

Fixes #1328.

R=iant
CC=golang-dev
https://golang.org/cl/4261046
parent d42bfe26
...@@ -180,7 +180,6 @@ func (p *Package) structType(n *Name) (string, int64) { ...@@ -180,7 +180,6 @@ func (p *Package) structType(n *Name) (string, int64) {
} }
if off == 0 { if off == 0 {
fmt.Fprintf(&buf, "\t\tchar unused;\n") // avoid empty struct fmt.Fprintf(&buf, "\t\tchar unused;\n") // avoid empty struct
off++
} }
fmt.Fprintf(&buf, "\t}") fmt.Fprintf(&buf, "\t}")
return buf.String(), off return buf.String(), off
...@@ -225,6 +224,9 @@ func (p *Package) writeDefsFunc(fc, fgo2 *os.File, n *Name) { ...@@ -225,6 +224,9 @@ func (p *Package) writeDefsFunc(fc, fgo2 *os.File, n *Name) {
fmt.Fprintf(fc, "void _cgo%s%s(void*);\n", cPrefix, n.Mangle) fmt.Fprintf(fc, "void _cgo%s%s(void*);\n", cPrefix, n.Mangle)
fmt.Fprintf(fc, "\n") fmt.Fprintf(fc, "\n")
fmt.Fprintf(fc, "void\n") fmt.Fprintf(fc, "void\n")
if argSize == 0 {
argSize++
}
fmt.Fprintf(fc, "·%s(struct{uint8 x[%d];}p)\n", n.Mangle, argSize) fmt.Fprintf(fc, "·%s(struct{uint8 x[%d];}p)\n", n.Mangle, argSize)
fmt.Fprintf(fc, "{\n") fmt.Fprintf(fc, "{\n")
fmt.Fprintf(fc, "\truntime·cgocall(_cgo%s%s, &p);\n", cPrefix, n.Mangle) fmt.Fprintf(fc, "\truntime·cgocall(_cgo%s%s, &p);\n", cPrefix, n.Mangle)
...@@ -392,7 +394,6 @@ func (p *Package) writeExports(fgo2, fc, fm *os.File) { ...@@ -392,7 +394,6 @@ func (p *Package) writeExports(fgo2, fc, fm *os.File) {
} }
if ctype == "struct {\n" { if ctype == "struct {\n" {
ctype += "\t\tchar unused;\n" // avoid empty struct ctype += "\t\tchar unused;\n" // avoid empty struct
off++
} }
ctype += "\t}" ctype += "\t}"
...@@ -444,7 +445,7 @@ func (p *Package) writeExports(fgo2, fc, fm *os.File) { ...@@ -444,7 +445,7 @@ func (p *Package) writeExports(fgo2, fc, fm *os.File) {
func(i int, atype ast.Expr) { func(i int, atype ast.Expr) {
fmt.Fprintf(fgcc, "\ta.p%d = p%d;\n", i, i) fmt.Fprintf(fgcc, "\ta.p%d = p%d;\n", i, i)
}) })
fmt.Fprintf(fgcc, "\tcrosscall2(_cgoexp%s_%s, &a, (int) sizeof a);\n", cPrefix, exp.ExpName) fmt.Fprintf(fgcc, "\tcrosscall2(_cgoexp%s_%s, &a, %d);\n", cPrefix, exp.ExpName, off)
if gccResult != "void" { if gccResult != "void" {
if len(fntype.Results.List) == 1 && len(fntype.Results.List[0].Names) <= 1 { if len(fntype.Results.List) == 1 && len(fntype.Results.List[0].Names) <= 1 {
fmt.Fprintf(fgcc, "\treturn a.r0;\n") fmt.Fprintf(fgcc, "\treturn a.r0;\n")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment