backends: Avoid type-punning issue in s390_set_initial_registers_tid.
authorMark Wielaard <mjw@redhat.com>
Wed, 18 Dec 2013 17:02:42 +0000 (18:02 +0100)
committerMark Wielaard <mjw@redhat.com>
Wed, 18 Dec 2013 17:02:42 +0000 (18:02 +0100)
Use union to avoid type-punning when assigning a double to a Dwarf_Word.
gcc complains otherwise. error: dereferencing type-punned pointer will
break strict-aliasing rules.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
backends/ChangeLog
backends/s390_initreg.c

index cb56d21..23329d0 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * 390_initreg.c (s390_set_initial_registers_tid): Use union
+       to avoid type-punning when assigning a double to a Dwarf_Word.
+
 2013-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        unwinder: s390 and s390x
index 62a1531..8fc54bc 100644 (file)
@@ -68,8 +68,19 @@ s390_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
   eu_static_assert (sizeof user_regs.regs.fp_regs.fprs[0]
                    == sizeof dwarf_regs[0]);
   for (unsigned u = 0; u < 16; u++)
-    dwarf_regs[u] = *((const __typeof (dwarf_regs[0]) *)
-                     &user_regs.regs.fp_regs.fprs[u]);
+    {
+      // Store the double bits as is in the Dwarf_Word without conversion.
+      union
+       {
+         double d;
+         Dwarf_Word w;
+       } fpr = { .d = user_regs.regs.fp_regs.fprs[u] };
+      dwarf_regs[u] = fpr.w;
+    }
+   if (! setfunc (16, 16, dwarf_regs, arg))
+     return false;
+   dwarf_regs[0] = user_regs.regs.psw.addr;
+
   if (! setfunc (16, 16, dwarf_regs, arg))
     return false;
   dwarf_regs[0] = user_regs.regs.psw.addr;