]> gcc.gnu.org Git - gcc.git/blobdiff - libgo/runtime/go-signal.c
runtime: portable access to sigev_notify_thread_id
[gcc.git] / libgo / runtime / go-signal.c
index 9c919e1568a15736d89a73a20935c80bf4c31b36..aa1b6305ad09d90e6938330b5fda679d7b61becf 100644 (file)
@@ -183,6 +183,24 @@ setSigactionHandler(struct sigaction* sa, uintptr handler)
        sa->sa_sigaction = (void*)(handler);
 }
 
+#ifdef __linux__
+
+// Workaround for https://sourceware.org/bugzilla/show_bug.cgi?id=27417
+#ifndef sigev_notify_thread_id
+  #define sigev_notify_thread_id _sigev_un._tid
+#endif
+
+void setSigeventTID(struct sigevent*, int32_t)
+       __asm__ (GOSYM_PREFIX "runtime.setSigeventTID");
+
+void
+setSigeventTID(struct sigevent *sev, int32_t v)
+{
+       sev->sigev_notify_thread_id = v;
+}
+
+#endif // defined(__linux__)
+
 // C code to fetch values from the siginfo_t and ucontext_t pointers
 // passed to a signal handler.
 
@@ -230,15 +248,14 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused)))
        ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_EIP];
 #elif defined(__alpha__) && defined(__linux__)
        ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.sc_pc;
+#elif defined(__PPC64__) && defined(__linux__)
+       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gp_regs[32];
 #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.
+# if defined(__GLIBC__)
+       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.uc_regs->gregs[32];
+# else
        ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[32];
-#endif
+# endif
 #elif defined(__PPC__) && defined(_AIX)
        ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.jmp_context.iar;
 #elif defined(__aarch64__) && defined(__linux__)
@@ -349,30 +366,37 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u
                runtime_printf("sp  %X\n", m->sc_regs[30]);
                runtime_printf("pc  %X\n", m->sc_pc);
          }
-#elif defined(__PPC__) && defined(__LITTLE_ENDIAN__) && defined(__linux__)
+#elif defined(__PPC__) && defined(__linux__)
          {
-               mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
                int i;
 
-#if defined(__PPC64__) || defined(__GLIBC__)
+# if defined(__PPC64__)
+               mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
+
                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);
-               runtime_printf("msr %X\n", m->regs->msr);
-               runtime_printf("cr  %X\n", m->regs->ccr);
-               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
+                       runtime_printf("r%d %X\n", i, m->gp_regs[i]);
+               runtime_printf("pc  %X\n", m->gp_regs[32]);
+               runtime_printf("msr %X\n", m->gp_regs[33]);
+               runtime_printf("cr  %X\n", m->gp_regs[38]);
+               runtime_printf("lr  %X\n", m->gp_regs[36]);
+               runtime_printf("ctr %X\n", m->gp_regs[35]);
+               runtime_printf("xer %X\n", m->gp_regs[37]);
+# else
+#  if defined(__GLIBC__)
+               mcontext_t *m = ((ucontext_t*)(context))->uc_mcontext.uc_regs;
+#  else
+               mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
+#  endif
+
                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
+                       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)
          {
This page took 0.028045 seconds and 5 git commands to generate.