[ltrace/f18] PPC64 passes floating point equivalent structures in registers
Petr Machata
pmachata at fedoraproject.org
Thu Aug 30 10:07:18 UTC 2012
commit ba67ad5a360c4d29a16ed220133cd83d5a9716f2
Author: Petr Machata <pmachata at redhat.com>
Date: Thu Aug 30 12:02:22 2012 +0200
PPC64 passes floating point equivalent structures in registers
ltrace-0.6.0-ppc-flteqv.patch | 162 +++++++++++++++++++++++++++++++++++++++++
ltrace.spec | 7 ++-
2 files changed, 168 insertions(+), 1 deletions(-)
---
diff --git a/ltrace-0.6.0-ppc-flteqv.patch b/ltrace-0.6.0-ppc-flteqv.patch
new file mode 100644
index 0000000..758e935
--- /dev/null
+++ b/ltrace-0.6.0-ppc-flteqv.patch
@@ -0,0 +1,162 @@
+From fcf256ceeab4b0b74cf1e18122e894aafce94fdc Mon Sep 17 00:00:00 2001
+From: Petr Machata <pmachata at redhat.com>
+Date: Thu, 30 Aug 2012 01:37:23 +0200
+Subject: [PATCH] PPC64 passes floating point equivalent structures in
+ registers as well
+
+Extract the structure unpacking code from s390 back end into the generic
+type module. Call this from both s390 and ppc back ends.
+---
+ sysdeps/linux-gnu/ppc/fetch.c | 21 +++++++++++++++++++--
+ sysdeps/linux-gnu/s390/fetch.c | 31 +------------------------------
+ type.c | 34 ++++++++++++++++++++++++++++++++++
+ type.h | 7 +++++++
+ 4 files changed, 61 insertions(+), 32 deletions(-)
+
+diff --git a/sysdeps/linux-gnu/ppc/fetch.c b/sysdeps/linux-gnu/ppc/fetch.c
+index 44cd056..40c91d9 100644
+--- a/sysdeps/linux-gnu/ppc/fetch.c
++++ b/sysdeps/linux-gnu/ppc/fetch.c
+@@ -340,13 +340,30 @@ allocate_argument(struct fetch_context *ctx, struct Process *proc,
+ while (slots-- > 0) {
+ struct value val;
+ value_init(&val, proc, NULL, long_info, 0);
+- int rc = allocate_gpr(ctx, proc, long_info, &val);
++
++ /* Floating point registers [...] are used [...] to
++ pass [...] one member aggregates passed by value
++ containing a floating point value[.] Note that for
++ one member aggregates, "containing" extends to
++ aggregates within aggregates ad infinitum. */
++ int rc;
++ struct arg_type_info *fp_info
++ = type_get_fp_equivalent(valuep->type);
++ if (fp_info != NULL)
++ rc = allocate_float(ctx, proc, fp_info, &val);
++ else
++ rc = allocate_gpr(ctx, proc, long_info, &val);
++
+ if (rc >= 0) {
+ memcpy(ptr, value_get_data(&val, NULL), width);
+ ptr += width;
+ }
+ value_destroy(&val);
+- if (rc < 0)
++
++ /* Bail out if we failed or if we are dealing with
++ * FP-equivalent. Those don't need the adjustments
++ * made below. */
++ if (rc < 0 || fp_info != NULL)
+ return rc;
+ }
+
+diff --git a/sysdeps/linux-gnu/s390/fetch.c b/sysdeps/linux-gnu/s390/fetch.c
+index 5d26b35..c46ef7c 100644
+--- a/sysdeps/linux-gnu/s390/fetch.c
++++ b/sysdeps/linux-gnu/s390/fetch.c
+@@ -61,35 +61,6 @@ s390x(struct fetch_context *ctx)
+ }
+
+ static int
+-fp_equivalent(struct arg_type_info *info)
+-{
+- switch (info->type) {
+- case ARGTYPE_VOID:
+- case ARGTYPE_INT:
+- case ARGTYPE_UINT:
+- case ARGTYPE_LONG:
+- case ARGTYPE_ULONG:
+- case ARGTYPE_CHAR:
+- case ARGTYPE_SHORT:
+- case ARGTYPE_USHORT:
+- case ARGTYPE_ARRAY:
+- case ARGTYPE_POINTER:
+- return 0;
+-
+- case ARGTYPE_FLOAT:
+- case ARGTYPE_DOUBLE:
+- return 1;
+-
+- case ARGTYPE_STRUCT:
+- if (type_struct_size(info) != 1)
+- return 0;
+- return fp_equivalent(type_element(info, 0));
+- }
+- assert(info->type != info->type);
+- abort();
+-}
+-
+-static int
+ fetch_register_banks(struct Process *proc, struct fetch_context *ctx)
+ {
+ ptrace_area parea;
+@@ -256,7 +227,7 @@ arch_fetch_arg_next(struct fetch_context *ctx, enum tof type,
+ return 0;
+
+ case ARGTYPE_STRUCT:
+- if (fp_equivalent(info))
++ if (type_get_fp_equivalent(info) != NULL)
+ /* fall through */
+ case ARGTYPE_FLOAT:
+ case ARGTYPE_DOUBLE:
+diff --git a/type.c b/type.c
+index 6341042..4b9a645 100644
+--- a/type.c
++++ b/type.c
+@@ -513,3 +513,37 @@ type_is_signed(enum arg_type type)
+ }
+ abort();
+ }
++
++struct arg_type_info *
++type_get_fp_equivalent(struct arg_type_info *info)
++{
++ /* Extract innermost structure. Give up early if any
++ * component has more than one element. */
++ while (info->type == ARGTYPE_STRUCT) {
++ if (type_struct_size(info) != 1)
++ return NULL;
++ info = type_element(info, 0);
++ }
++
++ switch (info->type) {
++ case ARGTYPE_CHAR:
++ case ARGTYPE_SHORT:
++ case ARGTYPE_INT:
++ case ARGTYPE_LONG:
++ case ARGTYPE_UINT:
++ case ARGTYPE_ULONG:
++ case ARGTYPE_USHORT:
++ case ARGTYPE_VOID:
++ case ARGTYPE_ARRAY:
++ case ARGTYPE_POINTER:
++ return NULL;
++
++ case ARGTYPE_FLOAT:
++ case ARGTYPE_DOUBLE:
++ return info;
++
++ case ARGTYPE_STRUCT:
++ abort();
++ }
++ abort();
++}
+diff --git a/type.h b/type.h
+index 545173c..53123b8 100644
+--- a/type.h
++++ b/type.h
+@@ -130,4 +130,11 @@ int type_is_integral(enum arg_type type);
+ /* Whether TYPE, which shall be integral, is a signed type. */
+ int type_is_signed(enum arg_type type);
+
++/* If INFO is floating point equivalent type, return the corresponding
++ * floating point type. Otherwise return NULL. Floating point
++ * equivalent types are either ARGTYPE_FLOAT, or ARGTYPE_DOUBLE, or
++ * ARGTYPE_STRUCT whose sole member is a floating point equivalent
++ * type. */
++struct arg_type_info *type_get_fp_equivalent(struct arg_type_info *info);
++
+ #endif /* TYPE_H */
+--
+1.7.6.5
+
diff --git a/ltrace.spec b/ltrace.spec
index 0781da1..0575a16 100644
--- a/ltrace.spec
+++ b/ltrace.spec
@@ -1,7 +1,7 @@
Summary: Tracks runtime library calls from dynamically linked executables
Name: ltrace
Version: 0.6.0
-Release: 17%{?dist}
+Release: 18%{?dist}
URL: http://ltrace.alioth.debian.org/
License: GPLv2+
Group: Development/Debuggers
@@ -36,6 +36,7 @@ Patch20: ltrace-0.6.0-dash-n.patch
Patch21: ltrace-0.6.0-demangle.patch
Patch22: ltrace-0.6.0-abi.patch
Patch23: ltrace-0.6.0-abi-s390.patch
+Patch24: ltrace-0.6.0-ppc-flteqv.patch
%description
Ltrace is a debugging program which runs a specified command until the
@@ -70,6 +71,7 @@ execution of processes.
%patch21 -p1
%patch22 -p1
%patch23 -p1
+%patch24 -p1
%build
# This ugly hack is necessary to build and link files for correct
@@ -97,6 +99,9 @@ echo ====================TESTING END=====================
%config(noreplace) %{_sysconfdir}/ltrace.conf
%changelog
+* Thu Aug 30 2012 Petr Machata <pmachata at redhat.com> - 0.6.0-18
+- PPC64 passes floating point equivalent structures in registers
+
* Thu Jul 19 2012 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0.6.0-17
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
More information about the scm-commits
mailing list