This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
Re: [patch 4/4] unwinder: s390 and s390x
- From: Mark Wielaard <mjw at redhat dot com>
- To: elfutils-devel at lists dot fedorahosted dot org
- Date: Wed, 18 Dec 2013 18:10:16 +0100
- Subject: Re: [patch 4/4] unwinder: s390 and s390x
On Wed, 2013-12-18 at 17:51 +0100, Jan Kratochvil wrote:
> Yes, I am fine with the patch, please check it in.
Thanks, checked in as attached.
>From a3afdb212742e28c6d309ae919e81c52afb44542 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw@redhat.com>
Date: Wed, 18 Dec 2013 18:02:42 +0100
Subject: [PATCH] backends: Avoid type-punning issue in s390_set_initial_registers_tid.
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 | 5 +++++
backends/s390_initreg.c | 15 +++++++++++++--
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/backends/ChangeLog b/backends/ChangeLog
index cb56d21..23329d0 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -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
diff --git a/backends/s390_initreg.c b/backends/s390_initreg.c
index 62a1531..8fc54bc 100644
--- a/backends/s390_initreg.c
+++ b/backends/s390_initreg.c
@@ -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;
--
1.7.1