step-into-handler.c compilation failure on ppc64

Jan Kratochvil jan.kratochvil at redhat.com
Mon Dec 14 00:41:22 UTC 2009


On Sat, 05 Dec 2009 18:19:20 +0100, Roland McGrath wrote:
> How about this?
> 
> --- step-into-handler.c	10 Dec 2008 04:42:43 -0800	1.8
> +++ step-into-handler.c	05 Dec 2009 09:18:54 -0800	
[...]
> @@ -113,11 +114,11 @@ handler_alrm_get (void)
>  {
>  #if defined __powerpc64__
>    /* ppc64 `handler_alrm' resolves to the function descriptor.  */
> -  return *(void **) handler_alrm;
> +  return *(void **) (uintptr_t) handler_alrm;
>  /* __s390x__ defines both the symbols.  */
>  #elif defined __s390__ && !defined __s390x__
>    /* s390 bit 31 is zero here but I am not sure if it cannot be arbitrary.  */
[...]

On Sat, 05 Dec 2009 18:39:05 +0100, CAI Qian wrote:
> Thanks. Fixed.

I have to say it did not help for me (gcc-4.4.2-7.el6.ppc64).
	error: dereferencing type-punned pointer will break strict-aliasing rules

Checked-in the union-based fix below (both tests PASS on ppc64).


Regards,
Jan

--- erestartsys.c	27 Nov 2009 22:50:31 -0000	1.13
+++ erestartsys.c	14 Dec 2009 00:38:42 -0000	1.14
@@ -38,6 +38,7 @@
 #include <stddef.h>
 #include <pty.h>
 #include <string.h>
+#include <stdint.h>
 
 #if defined __x86_64__
 # define REGISTER_IP .rip
@@ -298,8 +299,23 @@ main (int argc, char **argv)
   user = user_orig;
   user REGISTER_IP = (unsigned long) func;
 #ifdef __powerpc64__
-  user.nip = ((const unsigned long *) func)[0]; /* entry */
-  user.gpr[2] = ((const unsigned long *) func)[1]; /* TOC */
+  {
+    /* ppc64 `func' resolves to the function descriptor.  */
+    union
+      {
+	void (*f) (void);
+	struct
+	  {
+	    void *entry;
+	    void *toc;
+	  }
+	*p;
+      }
+    const func_u = { func };
+
+    user.nip = (uintptr_t) func_u.p->entry;
+    user.gpr[2] = (uintptr_t) func_u.p->toc;
+  }
 #endif
   /* GDB amd64_linux_write_pc():  */
   /* We must be careful with modifying the program counter.  If we
--- step-into-handler.c	8 Dec 2008 18:23:41 -0000	1.8
+++ step-into-handler.c	14 Dec 2009 00:38:42 -0000	1.9
@@ -113,7 +113,19 @@ handler_alrm_get (void)
 {
 #if defined __powerpc64__
   /* ppc64 `handler_alrm' resolves to the function descriptor.  */
-  return *(void **) handler_alrm;
+  union
+    {
+      void (*f) (int signo);
+      struct
+	{
+	  void *entry;
+	  void *toc;
+	}
+      *p;
+    }
+  const func_u = { handler_alrm };
+
+  return func_u.p->entry;
 /* __s390x__ defines both the symbols.  */
 #elif defined __s390__ && !defined __s390x__
   /* s390 bit 31 is zero here but I am not sure if it cannot be arbitrary.  */




More information about the utrace-devel mailing list