re PR go/72814 (reflect FAILs on 32-bit Solaris/SPARC: SIGILL)
authorIan Lance Taylor <iant@google.com>
Mon, 8 Aug 2016 19:53:44 +0000 (19:53 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 8 Aug 2016 19:53:44 +0000 (19:53 +0000)
commitf432d1282d585bbedaa4293ec4bac0b7c8c2024a
tree30584249a7b8d17b5cdd6db69cfa4ce4069aa72c
parent5c9343960762bda86bc64dc19862dcf3088102cd
re PR go/72814 (reflect FAILs on 32-bit Solaris/SPARC: SIGILL)

PR go/72814

    runtime: treat zero-sized result value as void

    Change the FFI interface to treat a call to a function that returns a
    zero-sized result as a call to a function that returns void.

    This is part of the fix for https://gcc.gnu.org/PR72814.  On 32-bit
    SPARC systems, a call to a function that returns a non-zero-sized struct
    is followed by an unimp instruction that describes the size of the
    struct.  The function returns to the address after the unimp
    instruction.  The libffi library can not represent a zero-sized struct,
    so we wind up treating it as a 1-byte struct.  Thus in that case libffi
    calls the function with an unimp instruction, but the function does not
    adjust the return address.  The result is that the program attempts to
    execute the unimp instruction, causing a crash.

    This is part of a change that fixes the crash by treating all functions
    that return zero bytes as functions that return void.

    Reviewed-on: https://go-review.googlesource.com/25585

* go-gcc.cc (Gcc_backend::function_type): If the return type is
zero bytes, treat the function as returning void.
(return_statement): If the return type is zero bytes, don't
actually return any values.

From-SVN: r239252
gcc/go/ChangeLog
gcc/go/go-gcc.cc
gcc/go/gofrontend/MERGE
libgo/runtime/go-ffi.c