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

            Bug ID: 90060
           Summary: libphobos.druntime_shared/core/thread.d FAILs on
                    Solaris/SPARC
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: d
          Assignee: ibuclaw at gdcproject dot org
          Reporter: ro at gcc dot gnu.org
  Target Milestone: ---
            Target: sparc*-sun-solaris2.11

Created attachment 46150
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46150&action=edit
Use __makecontext_v2 on Solaris/SPARC

With PR d/90059 fixed, (at least) the core.thread unittest FAILs:

FAIL: libphobos.druntime_shared/core/thread.d execution test

Segmentation fault while running unittests:
----------------

Program terminated with signal SIGSEGV, Segmentation fault.
#0  sparc64_is_sighandler (nframes=<synthetic pointer>, 
    cfa=0xffffffff7fffd470, pc=0xffffffff7f5c3fc8) at ./md-unwind-support.h:39
39      ./md-unwind-support.h: No such file or directory.
[Current thread is 2 (Thread 1 (LWP 1))]
(gdb) where
#0  sparc64_is_sighandler (nframes=<synthetic pointer>, 
    cfa=0xffffffff7fffd470, pc=0xffffffff7f5c3fc8) at ./md-unwind-support.h:39
#1  sparc64_fallback_frame_state (fs=0xffffffff7fffbf40, 
    context=0xffffffff7fffbb50) at ./md-unwind-support.h:271
#2  uw_frame_state_for (context=context@entry=0xffffffff7fffbb50, 
    fs=fs@entry=0xffffffff7fffbf40)
    at
/builds2/ulhg/workspace/Solaris_Trunk/Userland/full-build/02b-build-sparc/components/gcc7/gcc-7.3.0/libgcc/unwind-dw2.c:1257
#3  0xffffffff73b0ed50 in _Unwind_Backtrace (
    trace=0xffffffff5d362438 <simple_unwind>, 
    trace_argument=0xffffffff7fffc6d0)
    at
/builds2/ulhg/workspace/Solaris_Trunk/Userland/full-build/02b-build-sparc/components/gcc7/gcc-7.3.0/libgcc/unwind.inc:290
#4  0xffffffff5d3624dc in backtrace_simple (state=0xffffffff7f5e8000, 
    skip=<optimized out>, callback=0xffffffff5d2e40c4 <simpleCallback>, 
    error_callback=0xffffffff5d2e4c28 <simpleErrorCallback>, 
    data=0xffffffff7fffc860)
    at /vol/gcc/src/hg/trunk/solaris/libbacktrace/simple.c:106
#5  0xffffffff5d2e521c in gcc.backtrace.LibBacktrace.this(int) (
    this=0xffffffff7fffc860, firstFrame=1)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/gcc/backtrace.d:227
#6  0xffffffff5d2cd248 in
core.runtime.runModuleUnitTests().unittestSegvHandler(int,
core.sys.posix.signal.siginfo_t*, void*) (signum=11, 
    info=0xffffffff7fffd370, ptr=0xffffffff7fffd060)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/core/runtime.d:492
#7  <signal handler called>
#8  0xffffffff7ef261b0 in memset%sun4v-hwcap4 () from /lib/64/libc.so.1
#9  0xffffffff7ede9108 in makecontext () from /lib/64/libc.so.1
#10 0x0000000100015bbc in core.thread.Fiber.initStack() (
    this=0xffffffff7f1f6000)
    at
/vol/gcc/src/hg/trunk/solaris/libphobos/testsuite/../libdruntime/core/thread.d:5051
#11 0x0000000100015930 in core.thread.Fiber.reset() (this=0xffffffff7f1f6000)
    at
/vol/gcc/src/hg/trunk/solaris/libphobos/testsuite/../libdruntime/core/thread.d:4294
#12 0x000000010001536c in core.thread.Fiber.reset(void() delegate) (
    this=0xffffffff7f1f6000, dg=...)
    at
/vol/gcc/src/hg/trunk/solaris/libphobos/testsuite/../libdruntime/core/thread.d:4309
#13 0x00000001000152a4 in core.thread.Fiber.this(void() delegate, ulong, ulong)
    (this=0xffffffff7f1f6000, dg=..., sz=32768, guardPageSize=8192)
    at
/vol/gcc/src/hg/trunk/solaris/libphobos/testsuite/../libdruntime/core/thread.d:4157
#14 0x000000010001620c in core.thread.TestFiber.this() (
    this=0xffffffff7f1f6000)
    at
/vol/gcc/src/hg/trunk/solaris/libphobos/testsuite/../libdruntime/core/thread.d:5175
#15 0x0000000100016300 in core.thread.runTen() ()
    at
/vol/gcc/src/hg/trunk/solaris/libphobos/testsuite/../libdruntime/core/thread.d:5195
#16 0x0000000100016578 in core.thread.__unittestL5218_20() ()
    at
/vol/gcc/src/hg/trunk/solaris/libphobos/testsuite/../libdruntime/core/thread.d:5220
#17 0x0000000100018cf8 in core.thread.__modtest() () at <no_file>:1
#18 0xffffffff5d2cd388 in __foreachbody2 (this=0xffffffff7fffe308, 
    m=0x1001208b8 <ModuleInfo for core.gdc.modtest__thread>)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/core/runtime.d:558
#19 0xffffffff5d2f49ec in object.ModuleInfo.__lambda2 (
    this=0xffffffff7fffe230, 
    m=0x1001208b8 <ModuleInfo for core.gdc.modtest__thread>)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/object.d:1599
#20 0xffffffff5d30f600 in rt.minfo.__foreachbody2 (this=0xffffffff7fffe158, 
    sg=...)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/minfo.d:777
#21 0xffffffff5d314410 in rt.sections_elf_shared.DSO.opApply(scope int(ref
rt.sections_elf_shared.DSO) delegate) (dg=...)
    at
/vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/sections_elf_shared.d:69
#22 0xffffffff5d30f4e8 in rt.minfo.moduleinfos_apply(scope
int(immutable(object.ModuleInfo*)) delegate) (dg=...)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/minfo.d:770
#23 0xffffffff5d2f26bc in object.ModuleInfo.opApply(scope
int(object.ModuleInfo*) delegate) (dg=...)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/object.d:1598
#24 0xffffffff5d2cd074 in runModuleUnitTests ()
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/core/runtime.d:548
#25 0xffffffff5d3031fc in runAll (this=0xffffffff7fffe640)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/dmain2.d:484
#26 0xffffffff5d30313c in tryExec (this=0xffffffff7fffe640, dg=...)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/dmain2.d:460
#27 0xffffffff5d303034 in _d_run_main (argc=1, argv=0xffffffff7fffe898, 
    mainFunc=0x100018dfc <D main>)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/dmain2.d:493
#28 0x0000000100018dac in main (argc=1, argv=0xffffffff7fffe898)
    at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/__entrypoint.di:44
#29 0x000000010000d3ec in _start ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

truss shows that this is an access to unmapped memory

/1:     getcontext(0xFFFFFFFF7F1F6060)
    Incurred fault #6, FLTBOUNDS  %pc = 0xFFFFFFFF7EF261B0
      siginfo: SIGSEGV SEGV_MAPERR addr=0xFFFFFFFF7F5C3F40
    Received signal #11, SIGSEGV [caught]
      siginfo: SIGSEGV SEGV_MAPERR addr=0xFFFFFFFF7F5C3F40

which initially seemed weird happening when makecontext calls memset. 
Ultimately
I remembered that Solaris/SPARC has a weird quirk in makecontext, as documented
in makecontext(3C):

NOTES
       The  semantics  of the uc_stack member of the ucontext_t structure have
       changed as they apply to inputs to makecontext(). Prior to Solaris  10,
       the  ss_sp member of the uc_stack structure represented the high memory
       address of the area reserved for the stack. The ss_sp member now repre-
       sents  the  base  (low  memory  address), in keeping with other uses of
       ss_sp.

Compatibility with older code is achieved by this snippet in <ucontext.h>:

#ifdef __sparc
#ifdef __PRAGMA_REDEFINE_EXTNAME
#pragma redefine_extname        makecontext     __makecontext_v2

The attached patch does the same in ucontext.d, which makes the test PASS.

Reply via email to