diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-07-11 09:23:32 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-07-11 09:23:32 +0000 |
commit | 738ab6f51ce3bb0ec1b2ee03249a0738db98b0cf (patch) | |
tree | b700b07fc721a69f0f74991e6005fdca45a0e888 | |
parent | 88e81a691d4025461c124183e3a253f8a3ad351a (diff) | |
download | gcc-738ab6f51ce3bb0ec1b2ee03249a0738db98b0cf.tar.gz |
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/trunk@149511 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/function.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr40668.c | 35 |
4 files changed, 58 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3e626352ec1..17bb0cd6962 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-11 Paolo Bonzini <bonzini@gnu.org> * expmed.c (emit_store_flag_1): Fix choice of zero vs. sign extension. diff --git a/gcc/function.c b/gcc/function.c index 93244dba76b..258f5941950 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2976,9 +2976,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 7a477b3b9b6..87d57084e95 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-11 Paolo Bonzini <bonzini@gnu.org> * gcc.c-torture/execute/20090711-1.c: New test. 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; +} |