https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117047
David Malcolm <dmalcolm at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Summary|[15 regression] Segfault in |[15 regression] Segfault in
|gcc/jit/jit-playback.cc |libgccjit garbage
|when compiling GNU Emacs |collection when compiling
|with Native Compilation |GNU Emacs with Native
| |Compilation
--- Comment #2 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
(In reply to Dario Gjorgjevski from comment #0)
> GCC commit ff889b359
> GNU Emacs commit 9ed82c2
>
> When I attempt to compile GNU Emacs with `Native Compilation
> <https://www.gnu.org/software/emacs/manual/html_node/elisp/Native-
> Compilation.html>_, there is a segfault in gcc/jit/jit-playback.cc.
>
> (lldb) run
> Process 96017 launched: '/Volumes/src/emacs/src/bootstrap-emacs' (x86_64)
> Process 96017 stopped
> * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS
> (code=1, address=0x0)
> frame #0: 0x0000000104ce7553
> libgccjit.0.dylib`gcc::jit::wrapper_finalizer(ptr=0x0000000104777f50) at
> jit-playback.cc:1900:22
> 1897 wrapper_finalizer (void *ptr)
> 1898 {
> 1899 playback::wrapper *wrapper = reinterpret_cast
> <playback::wrapper
> *> (ptr);
> -> 1900 wrapper->finalizer ();
> 1901 }
> 1902
> 1903 /* gcc::jit::playback::wrapper subclasses are GC-managed:
> Target 0: (bootstrap-emacs) stopped.
> (lldb) bt
> * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS
> (code=1, address=0x0)
> * frame #0: 0x0000000104ce7553
> libgccjit.0.dylib`gcc::jit::wrapper_finalizer(ptr=0x0000000104777f50) at
> jit-playback.cc:1900:22
> frame #1: 0x0000000105acc827 libgccjit.0.dylib`ggc_collect(ggc_collect)
> [inlined] finalizer::call(this=0x00007fca639372f8) const at
> ggc-page.cc:333:35
> frame #2: 0x0000000105acc820 libgccjit.0.dylib`ggc_collect(ggc_collect)
> at ggc-page.cc:1932:15
> frame #3: 0x0000000105acc7c2
> libgccjit.0.dylib`ggc_collect(mode=<unavailable>) at ggc-page.cc:2232:25
> frame #4: 0x0000000105b8f767
> libgccjit.0.dylib`cgraph_node::finalize_function(decl=0x0000000100c56c00,
> no_collect=<unavailable>) at cgraphunit.cc:506:17
> frame #5: 0x0000000104ce8f0e
> libgccjit.0.dylib`gcc::jit::playback::function::
> postprocess(this=0x0000000100c25d70) at jit-playback.cc:2111:38
> frame #6: 0x0000000104cea49a
> libgccjit.0.dylib`gcc::jit::playback::context::
> replay(this=0x00007ff7bfef6c30) at jit-playback.cc:3455:22
> frame #7: 0x0000000107adb9e0 libgccjit.0.dylib`global_options_set + 6400
> frame #8: 0x00000001078ecfa0
> libgccjit.0.dylib`hard_frame_pointer_adjustment + 24
> frame #9: 0x0000000107adb9e0 libgccjit.0.dylib`global_options_set + 6400
>
> The issue does not happen with the releases/gcc-14 branch -- commit
> be06962b3 in particular.
>
> Any hints how to debug this further?
What does printing *wrapper in the debugger look like?
FWIW from the libgccjit side, there's gcc_jit_context_dump_reproducer_to_file
https://gcc.gnu.org/onlinedocs/jit/topics/contexts.html#c.gcc_jit_context_dump_reproducer_to_file
which in theory ought to give you a standalone C reproducer (without needing
emacs), but I don't know if that's exposed in an easy way from the emacs
native-compilation code that's invoking libgccjit.
The backtrace shows this is happening during GCC's garbage collection, so I
wonder if this is a dormant bug in memory management that your use case is
happening to trigger. You could try:
gcc_jit_context_set_bool_option (GCC_JIT_BOOL_OPTION_SELFCHECK_GC);
as per
https://gcc.gnu.org/onlinedocs/jit/topics/contexts.html#c.gcc_jit_context_set_bool_option.GCC_JIT_BOOL_OPTION_SELFCHECK_GC
to see if it triggers the bug earlier (or perhaps on gcc-14) but note that that
option will make libgccjit *really* slow at compiling.