https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97107

            Bug ID: 97107
           Summary: libgo fails to build for power10
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: amodra at gmail dot com
  Target Milestone: ---

ld.gold: error: runtime/.libs/go-cdiv.o: failed to match split-stack sequence
at section 1 offset 0
ld.gold: error: runtime/.libs/go-cdiv.o: failed to match split-stack sequence
at section 1 offset 70
ld.gold: error: runtime/.libs/runtime_c.o: failed to match split-stack sequence
at section 1 offset 310
ld.gold: error: reflect/.libs/makefunc_ffi_c.o: failed to match split-stack
sequence at section 1 offset 1a0

Recently added rs6000 backend code allows sibcalls when pcrel.  In the
go-cdiv.o cases we have tail calls to __divsc3 and __divdc3 both of which are
non-split-stack functions.  The functions making those calls don't have a stack
frame, and therefore don't have the magic split-stack instruction sequence that
gold patches to allocate a larger stack.  Now those __div libgcc functions
don't have large stack frames that might blow the very limited stack provided,
but in general you can't tail call non-split-stack functions from split-stack
code.

It isn't actually the sibcall that is the problem, but that
rs6000_expand_split_stack_prologue didn't emit the magic code gold patches and
a __morestack call.  ie. a sibcall to non-split-stack code from split-stack is
fine if there is sufficient stack memory mapped.  __morestack is quite a
surprising function on powerpc in that it calls back to its caller - and a tail
call will continue running in the context of extra stack mapped until it
returns.

Reply via email to