Commit 03e3fbe4 authored by Ian Lance Taylor's avatar Ian Lance Taylor

cmd/cgo: make the gccgo init function no_split_stack

This works around what appears to be a bug in current clang (2018-11-09).
Details are in the comment in the code.

Change-Id: Ib4783b6c03d531c69ebc4cb0ac023bea5bee7d40
Reviewed-on: https://go-review.googlesource.com/c/148819Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent e496e612
...@@ -246,7 +246,22 @@ func (p *Package) writeDefs() { ...@@ -246,7 +246,22 @@ func (p *Package) writeDefs() {
init := gccgoInit.String() init := gccgoInit.String()
if init != "" { if init != "" {
fmt.Fprintln(fc, "static void init(void) __attribute__ ((constructor));") // The init function does nothing but simple
// assignments, so it won't use much stack space, so
// it's OK to not split the stack. Splitting the stack
// can run into a bug in clang (as of 2018-11-09):
// this is a leaf function, and when clang sees a leaf
// function it won't emit the split stack prologue for
// the function. However, if this function refers to a
// non-split-stack function, which will happen if the
// cgo code refers to a C function not compiled with
// -fsplit-stack, then the linker will think that it
// needs to adjust the split stack prologue, but there
// won't be one. Marking the function explicitly
// no_split_stack works around this problem by telling
// the linker that it's OK if there is no split stack
// prologue.
fmt.Fprintln(fc, "static void init(void) __attribute__ ((constructor, no_split_stack));")
fmt.Fprintln(fc, "static void init(void) {") fmt.Fprintln(fc, "static void init(void) {")
fmt.Fprint(fc, init) fmt.Fprint(fc, init)
fmt.Fprintln(fc, "}") fmt.Fprintln(fc, "}")
......
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