aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2009-07-11 09:26:23 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2009-07-11 09:26:23 +0000
commitc4fc130da7001f609228d3fd1e8ad962c70c7320 (patch)
treec367ec799615abc00c4914f6976a6f2f257f3824 /gcc
parentf17796f74ed0436521524cf139cd429b7aeeed4a (diff)
PR target/40668
* function.c (assign_parm_setup_stack): Adjust MEM_OFFSET (data->stack_parm) if promoted_mode is different from nominal_mode on big endian. * gcc.c-torture/execute/pr40668.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_4-branch@149512 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/function.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr40668.c35
4 files changed, 58 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d65b5c286cd..23a721d73d0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2009-07-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/40668
+ * function.c (assign_parm_setup_stack): Adjust
+ MEM_OFFSET (data->stack_parm) if promoted_mode is different
+ from nominal_mode on big endian.
+
2009-07-08 Richard Henderson <rth@redhat.com>
PR target/38900
diff --git a/gcc/function.c b/gcc/function.c
index e8d99015e4d..b68beb60719 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -2977,9 +2977,17 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
TYPE_UNSIGNED (TREE_TYPE (parm)));
if (data->stack_parm)
- /* ??? This may need a big-endian conversion on sparc64. */
- data->stack_parm
- = adjust_address (data->stack_parm, data->nominal_mode, 0);
+ {
+ int offset = subreg_lowpart_offset (data->nominal_mode,
+ GET_MODE (data->stack_parm));
+ /* ??? This may need a big-endian conversion on sparc64. */
+ data->stack_parm
+ = adjust_address (data->stack_parm, data->nominal_mode, 0);
+ if (offset && MEM_OFFSET (data->stack_parm))
+ set_mem_offset (data->stack_parm,
+ plus_constant (MEM_OFFSET (data->stack_parm),
+ offset));
+ }
}
if (data->entry_parm != data->stack_parm)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 28ce702525e..9c018131d30 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/40668
+ * gcc.c-torture/execute/pr40668.c: New test.
+
2009-07-10 Jakub Jelinek <jakub@redhat.com>
PR c++/40502
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr40668.c b/gcc/testsuite/gcc.c-torture/execute/pr40668.c
new file mode 100644
index 00000000000..70fe63f8916
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr40668.c
@@ -0,0 +1,35 @@
+static void
+foo (unsigned int x, void *p)
+{
+ __builtin_memcpy (p, &x, sizeof x);
+}
+
+void
+bar (int type, void *number)
+{
+ switch (type)
+ {
+ case 1:
+ foo (0x12345678, number);
+ break;
+ case 7:
+ foo (0, number);
+ break;
+ case 8:
+ foo (0, number);
+ break;
+ case 9:
+ foo (0, number);
+ break;
+ }
+}
+
+int
+main (void)
+{
+ unsigned int x;
+ bar (1, &x);
+ if (x != 0x12345678)
+ __builtin_abort ();
+ return 0;
+}