Hi Ian,

Thanks for committing a first fix! Unfortunately, your changes don't
work on ppc64le musl since you are now still using .regs on ppc64le the
include of asm/ptrace.h (as added in the v1 of my patch) is missing.
Hence, your patch fails to compile on ppc64le musl with the following
error message:

        go-signal.c:230:63: error: invalid use of undefined type 'struct 
pt_regs'
          230 |         ret.sigpc = 
((ucontext_t*)(context))->uc_mcontext.regs->nip;

If you want to continue using .regs on ppc64le an include of
asm/ptrace.h is needed since both glibc and musl declare `struct
pt_regs` as an incomplete type (with glibc asm/ptrace.h is included
indirectly by other headers used by go-signal.c it seems).

See https://gcc.gnu.org/pipermail/gcc-patches/2022-January/587520.html

Would be nice if this could be fixed :)

Sincerely,
Sören

Ian Lance Taylor <i...@golang.org> wrote:
> On Thu, Mar 31, 2022 at 9:41 AM Sören Tempel <soe...@soeren-tempel.net> wrote:
> >
> > Ping.
> >
> > Would be nice to get this integrated since this one of the changes needed to
> > make gccgo work with musl libc. Let me know if the patch needs to be revised
> > further.
> 
> I went with a simpler solution, more verbose but easier to read.  Now
> committed to mainline.  Please let me know if you have any problems
> with this.  Thanks.
> 
> Ian
> fad0ecb68c08512ac24852b6d5264cdb9809dc6d
> diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
> index afaccb0e9e6..f93eaf48e28 100644
> --- a/gcc/go/gofrontend/MERGE
> +++ b/gcc/go/gofrontend/MERGE
> @@ -1,4 +1,4 @@
> -7f33baa09a8172bb2c5f1ca0435d9efe3e194c9b
> +45108f37070afb696b069768700e39a269f1fecb
>  
>  The first line of this file holds the git revision number of the last
>  merge done from the gofrontend repository.
> diff --git a/libgo/runtime/go-signal.c b/libgo/runtime/go-signal.c
> index 0cb90304730..9c919e1568a 100644
> --- a/libgo/runtime/go-signal.c
> +++ b/libgo/runtime/go-signal.c
> @@ -231,7 +231,14 @@ getSiginfo(siginfo_t *info, void *context 
> __attribute__((unused)))
>  #elif defined(__alpha__) && defined(__linux__)
>       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.sc_pc;
>  #elif defined(__PPC__) && defined(__linux__)
> +     // For some reason different libc implementations use
> +     // different names.
> +#if defined(__PPC64__) || defined(__GLIBC__)
>       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.regs->nip;
> +#else
> +     // Assumed to be ppc32 musl.
> +     ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[32];
> +#endif
>  #elif defined(__PPC__) && defined(_AIX)
>       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.jmp_context.iar;
>  #elif defined(__aarch64__) && defined(__linux__)
> @@ -347,6 +354,7 @@ dumpregs(siginfo_t *info __attribute__((unused)), void 
> *context __attribute__((u
>               mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
>               int i;
>  
> +#if defined(__PPC64__) || defined(__GLIBC__)
>               for (i = 0; i < 32; i++)
>                       runtime_printf("r%d %X\n", i, m->regs->gpr[i]);
>               runtime_printf("pc  %X\n", m->regs->nip);
> @@ -355,6 +363,16 @@ dumpregs(siginfo_t *info __attribute__((unused)), void 
> *context __attribute__((u
>               runtime_printf("lr  %X\n", m->regs->link);
>               runtime_printf("ctr %X\n", m->regs->ctr);
>               runtime_printf("xer %X\n", m->regs->xer);
> +#else
> +             for (i = 0; i < 32; i++)
> +                     runtime_printf("r%d %X\n", i, m->gregs[i]);
> +             runtime_printf("pc  %X\n", m->gregs[32]);
> +             runtime_printf("msr %X\n", m->gregs[33]);
> +             runtime_printf("cr  %X\n", m->gregs[38]);
> +             runtime_printf("lr  %X\n", m->gregs[36]);
> +             runtime_printf("ctr %X\n", m->gregs[35]);
> +             runtime_printf("xer %X\n", m->gregs[37]);
> +#endif
>         }
>  #elif defined(__PPC__) && defined(_AIX)
>         {

Reply via email to