From 1eee24cf0a571f56674368c561e9ff0f78670c5f Mon Sep 17 00:00:00 2001 From: rguenth Date: Fri, 10 Mar 2006 16:44:01 +0000 Subject: [PATCH] 2006-03-10 Richard Guenther PR middle-end/26565 * builtins.c (get_pointer_alignment): Handle component references for field alignment. * gcc.dg/torture/pr26565.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111934 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/builtins.c | 14 ++++++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr26565.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr26565.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d1f4a0c..77ce19e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-03-10 Richard Guenther + + PR middle-end/26565 + * builtins.c (get_pointer_alignment): Handle component + references for field alignment. + 2006-03-10 J"orn Rennecke * config.gcc (sh*-superh-elf, sh*elf (newlib)): Use newlib.h diff --git a/gcc/builtins.c b/gcc/builtins.c index f6095e8..1ce6083 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -275,15 +275,21 @@ get_pointer_alignment (tree exp, unsigned int max_align) case ADDR_EXPR: /* See what we are pointing at and look at its alignment. */ exp = TREE_OPERAND (exp, 0); + while (handled_component_p (exp)) + { + if (TREE_CODE (exp) == COMPONENT_REF) + align = MIN (align, DECL_ALIGN (TREE_OPERAND (exp, 1))); + exp = TREE_OPERAND (exp, 0); + } if (TREE_CODE (exp) == FUNCTION_DECL) - align = FUNCTION_BOUNDARY; + align = MIN (align, FUNCTION_BOUNDARY); else if (DECL_P (exp)) - align = DECL_ALIGN (exp); + align = MIN (align, DECL_ALIGN (exp)); #ifdef CONSTANT_ALIGNMENT else if (CONSTANT_CLASS_P (exp)) - align = CONSTANT_ALIGNMENT (exp, align); + align = MIN (align, (unsigned)CONSTANT_ALIGNMENT (exp, align)); #endif - return MIN (align, max_align); + return align; default: return align; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d8890a0..4c47054 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-03-10 Richard Guenther + + PR middle-end/26565 + * gcc.dg/torture/pr26565.c: New testcase. + 2006-03-09 Jerry DeLisle PR libgfortran/26499 diff --git a/gcc/testsuite/gcc.dg/torture/pr26565.c b/gcc/testsuite/gcc.dg/torture/pr26565.c new file mode 100644 index 0000000..9b43140 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr26565.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ + +void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n); + +struct timeval { + long tv_sec; +}; + +struct outdata { + long align; + char seq; + struct timeval tv __attribute__((packed)); +}; + +void send_probe(struct outdata *outdata, struct timeval *tp) __attribute__((noinline)); +void send_probe(struct outdata *outdata, struct timeval *tp) +{ + memcpy(&outdata->tv, tp, sizeof outdata->tv); +} + +struct timeval t; +struct outdata outdata; + +int main() +{ + send_probe(&outdata, &t); + return 0; +} -- 2.7.4