]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
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 cb56d217caadae9791de000cf0da4cbe6a5ab647..23329d0a8cb8843c58123e775b8f8ed902aedaa5 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 62a1531e7afbbd37fc0ae01bb654af3b3d00b169..8fc54bc7cf016e3682c131eb2cf5831256d44784 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;