Summary: | reflect FAILs on 32-bit Solaris/SPARC: SIGILL | ||
---|---|---|---|
Product: | gcc | Reporter: | Rainer Orth <ro> |
Component: | go | Assignee: | Ian Lance Taylor <ian> |
Status: | RESOLVED FIXED | ||
Severity: | normal | ||
Priority: | P3 | ||
Version: | 7.0 | ||
Target Milestone: | 7.0 | ||
Host: | sparc*-sun-solaris2.* | Target: | sparc*-sun-solaris2.* |
Build: | sparc*-sun-solaris2.* | Known to work: | |
Known to fail: | Last reconfirmed: | 2016-08-08 00:00:00 |
Description
Rainer Orth
2016-08-05 12:14:15 UTC
The failing test is a function that returns a zero-sized struct. The libffi library does not support a zero-sized struct, so libgo and libffi togther wind up treating the return type as a struct whose size is 1 byte. On 32-bit SPARC, a call to a function that returns a struct whose size is larger than 0 is followed by an unimp instruction. The function is compiled to skip the unimp instruction when it returns. See the handling of %) in sparc_print_operand in gcc/config/sparc/sparc.c. So libffi, thinking that the function returns a non-empty struct, provides an unimp instruction to be skipped. But the actual function returns an empty struct, and therefore does not expect the unimp instruction, and therefore does not skip it. The result is an attempt to execute the instruction, causing the SIGILL. Author: ian Date: Mon Aug 8 19:53:44 2016 New Revision: 239252 URL: https://gcc.gnu.org/viewcvs?rev=239252&root=gcc&view=rev Log: 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. Modified: trunk/gcc/go/ChangeLog trunk/gcc/go/go-gcc.cc trunk/gcc/go/gofrontend/MERGE trunk/libgo/runtime/go-ffi.c Fixed. |