On Mon, May 5, 2025 at 10:55 AM Jonathan Wakely <jwakely....@gmail.com>
wrote:

>
>
> On Mon, 5 May 2025, 09:23 Sam James, <s...@gentoo.org> wrote:
>
>> Jonathan Wakely <jwak...@redhat.com> writes:
>>
>> > [...]
>> > +void
>> > +std::breakpoint() noexcept
>> > +{
>> > +  PROBE(std::breakpoint);
>> > +
>> > +  if (__gnu_cxx::debugger_signal_for_breakpoint > 0)
>> > +    std::raise(__gnu_cxx::debugger_signal_for_breakpoint);
>> > +
>>
>> glib's
>> https://gitlab.gnome.org/GNOME/glib/-/blob/main/glib/gbacktrace.h#L58 is
>> a useful reference. It has an entry for alpha and also MSVC (though I
>> can't imagine MSVC matters here).
>>
>
> I can't load that page, Anubis takes 10s then I get "invalid response".
>
Relevant content:

/** * G_BREAKPOINT: * * Inserts a breakpoint instruction into the
code. * * On architectures which support it, this is implemented as a
soft interrupt * and on other architectures it raises a `SIGTRAP`
signal. * * `SIGTRAP` is used rather than abort() to allow breakpoints
to be skipped past * in a debugger if they are not the desired target
of debugging. */#if (defined (__i386__) || defined (__x86_64__)) &&
defined (__GNUC__) && __GNUC__ >= 2#  define G_BREAKPOINT()
G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END#elif
(defined (_MSC_VER) || defined (__DMC__)) && defined (_M_IX86)#
define G_BREAKPOINT()        G_STMT_START{ __asm int 3h
}G_STMT_END#elif defined (_MSC_VER)#  define G_BREAKPOINT()
G_STMT_START{ __debugbreak(); }G_STMT_END#elif defined (__alpha__) &&
!defined(__osf__) && defined (__GNUC__) && __GNUC__ >= 2#  define
G_BREAKPOINT()        G_STMT_START{ __asm__ __volatile__ ("bpt");
}G_STMT_END#elif defined (__APPLE__) || (defined(_WIN32) &&
(defined(__clang__) || defined(__GNUC__)))#  define G_BREAKPOINT()
   G_STMT_START{ __builtin_trap(); }G_STMT_END#else   /* !__i386__ &&
!__alpha__ */#  define G_BREAKPOINT()        G_STMT_START{ raise
(SIGTRAP); }G_STMT_END#endif  /* __i386__ */G_END_DECLS



>
>
>> > +#if _GLIBCXX_HAVE_DEBUGAPI_H && defined(_WIN32) && !defined(__CYGWIN__)
>> > +  DebugBreak();
>> > +#elif __has_builtin(__builtin_debugtrap)
>> > +  __builtin_debugtrap(); // Clang
>> > +#elif defined(__i386__) || defined(__x86_64__)
>> > +  __asm__ volatile ("int3; nop");
>> > +#elifdef __thumb__
>> > +  __asm__ volatile (".inst 0xde01");
>> > +#elifdef __aarch64__
>> > +  __asm__ volatile (".inst 0xd4200000");
>> > +#elifdef __arm__
>> > +  __asm__ volatile (".inst 0xe7f001f0");
>> > +#elifdef __riscv
>> > +  /* section 2.8 in the RISC-V unprivileged ISA manual says for
>> semi-hosted
>> > +   * environments we want the sequence:
>> > +   * slli x0, x0, 0x1f     # Entry NOP
>> > +   * ebreak         # Break to debugger
>> > +   * srai x0, x0, 7    # NOP encoding the semihosting call number 7
>> > +   */
>> > +  __asm__ volatile (".4byte 0x00100073");
>> > +#elifdef __powerpc__
>> > +  __asm__ volatile(".4byte 0x7d821008");
>> > +#else
>> > +  __builtin_trap();
>> > +#endif
>> > +} // If the debugger stops here, std::breakpoint() was called.
>> > +
>> > [...]
>>
>

Reply via email to