aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/c-common.c2
-rw-r--r--gcc/c-cppbuiltin.c3
-rw-r--r--gcc/config/i386/i386.h4
-rw-r--r--gcc/defaults.h5
-rw-r--r--gcc/doc/extend.texi28
-rw-r--r--gcc/doc/tm.texi5
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr38736_main.C18
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr38736_x.C15
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr38736_y.C6
-rw-r--r--gcc/testsuite/g++.dg/other/macro-1.C3
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr38736_main.c18
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr38736_x.c15
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr38736_y.c6
-rw-r--r--gcc/testsuite/gcc.dg/macro-1.c3
16 files changed, 148 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1448c0d..fed14be 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,20 @@
+2009-01-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/38736
+ * c-common.c (handle_aligned_attribute): Use
+ ATTRIBUTE_ALIGNED_VALUE instead of BIGGEST_ALIGNMENT for
+ default alignment value.
+
+ * c-cppbuiltin.c (c_cpp_builtins): Define __BIGGEST_ALIGNMENT__.
+
+ * defaults.h (ATTRIBUTE_ALIGNED_VALUE): New.
+ * config/i386/i386.h (ATTRIBUTE_ALIGNED_VALUE): Likewise.
+
+ * doc/extend.texi: Update __attribute__ ((aligned)). Document
+ __BIGGEST_ALIGNMENT__.
+
+ * doc/tm.texi: Document ATTRIBUTE_ALIGNED_VALUE.
+
2009-01-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/38819
diff --git a/gcc/c-common.c b/gcc/c-common.c
index b94ac1b..5eed1dc 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -5906,7 +5906,7 @@ handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args,
tree *type = NULL;
int is_type = 0;
tree align_expr = (args ? TREE_VALUE (args)
- : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
+ : size_int (ATTRIBUTE_ALIGNED_VALUE / BITS_PER_UNIT));
int i;
if (DECL_P (*node))
diff --git a/gcc/c-cppbuiltin.c b/gcc/c-cppbuiltin.c
index 58b1796..c6112d8 100644
--- a/gcc/c-cppbuiltin.c
+++ b/gcc/c-cppbuiltin.c
@@ -762,6 +762,9 @@ c_cpp_builtins (cpp_reader *pfile)
format. */
if (ENABLE_DECIMAL_FLOAT && ENABLE_DECIMAL_BID_FORMAT)
cpp_define (pfile, "__DECIMAL_BID_FORMAT__");
+
+ builtin_define_with_int_value ("__BIGGEST_ALIGNMENT__",
+ BIGGEST_ALIGNMENT / BITS_PER_UNIT);
}
/* Pass an object-like macro. If it doesn't lie in the user's
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 5593598..14e7438 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -710,6 +710,10 @@ enum target_cpu_default
/* Maximum stack alignment. */
#define MAX_STACK_ALIGNMENT MAX_OFILE_ALIGNMENT
+/* Alignment value for attribute ((aligned)). It is a constant since
+ it is the part of the ABI. We shouldn't change it with -mavx. */
+#define ATTRIBUTE_ALIGNED_VALUE 128
+
/* Decide whether a variable of mode MODE should be 128 bit aligned. */
#define ALIGN_MODE_128(MODE) \
((MODE) == XFmode || SSE_REG_MODE_P (MODE))
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 282a14a..c909734 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -944,4 +944,9 @@ along with GCC; see the file COPYING3. If not see
((TYPE) ? LOCAL_ALIGNMENT ((TYPE), (ALIGN)) : (ALIGN))
#endif
+/* Alignment value for attribute ((aligned)). */
+#ifndef ATTRIBUTE_ALIGNED_VALUE
+#define ATTRIBUTE_ALIGNED_VALUE BIGGEST_ALIGNMENT
+#endif
+
#endif /* ! GCC_DEFAULTS_H */
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index f131a4d..5a7e2d8 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -3697,21 +3697,27 @@ that forces the union to be double-word aligned.
As in the preceding examples, you can explicitly specify the alignment
(in bytes) that you wish the compiler to use for a given variable or
structure field. Alternatively, you can leave out the alignment factor
-and just ask the compiler to align a variable or field to the maximum
-useful alignment for the target machine you are compiling for. For
-example, you could write:
+and just ask the compiler to align a variable or field to the
+default alignment for the target architecture you are compiling for.
+The default alignment is sufficient for all scalar types, but may not be
+enough for all vector types on a target which supports vector operations.
+The default alignment is fixed for a particular target ABI.
+
+Gcc also provides a target specific macro @code{__BIGGEST_ALIGNMENT__},
+which is the largest alignment ever used for any data type on the
+target machine you are compiling for. For example, you could write:
@smallexample
-short array[3] __attribute__ ((aligned));
+short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
@end smallexample
-Whenever you leave out the alignment factor in an @code{aligned} attribute
-specification, the compiler automatically sets the alignment for the declared
-variable or field to the largest alignment which is ever used for any data
-type on the target machine you are compiling for. Doing this can often make
-copy operations more efficient, because the compiler can use whatever
-instructions copy the biggest chunks of memory when performing copies to
-or from the variables or fields that you have aligned this way.
+The compiler automatically sets the alignment for the declared
+variable or field to @code{__BIGGEST_ALIGNMENT__}. Doing this can
+often make copy operations more efficient, because the compiler can
+use whatever instructions copy the biggest chunks of memory when
+performing copies to or from the variables or fields that you have
+aligned this way. Note that the value of @code{__BIGGEST_ALIGNMENT__}
+may change depending on command line options.
When used on a struct, or struct member, the @code{aligned} attribute can
only increase the alignment; in order to decrease it, the @code{packed}
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index d748a75..92de6e5 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -1105,6 +1105,11 @@ Alignment, in bits, a C conformant malloc implementation has to
provide. If not defined, the default value is @code{BITS_PER_WORD}.
@end defmac
+@defmac ATTRIBUTE_ALIGNED_VALUE
+Alignment used by the @code{__attribute__ ((aligned))} construct. If
+not defined, the default value is @code{BIGGEST_ALIGNMENT}.
+@end defmac
+
@defmac MINIMUM_ATOMIC_ALIGNMENT
If defined, the smallest alignment, in bits, that can be given to an
object that can be referenced in one operation, without disturbing any
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 43fe9a9..8f42d58 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,15 @@
+2009-01-18 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/38736
+ * g++.dg/compat/abi/pr38736_main.C: New.
+ * g++.dg/compat/abi/pr38736_x.C: Likewise.
+ * g++.dg/compat/abi/pr38736_y.C: Likewise.
+ * g++.dg/other/macro-1.C: Likewise.
+ * gcc.dg/macro-1.c: Likewise.
+ * gcc.dg/compat/pr38736_main.c: Likewise.
+ * gcc.dg/compat/pr38736_x.c: Likewise.
+ * gcc.dg/compat/pr38736_y.c: Likewise.
+
2009-01-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/38819
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C
new file mode 100644
index 0000000..b9f6ac8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C
@@ -0,0 +1,18 @@
+/* PR target/38736 */
+/* { dg-skip-if "attribute ((aligned))" { ! { i?86-*-* x86_64-*-* } } } */
+/* { dg-require-effective-target avx } */
+
+/* Test compatibility of attribute ((aligned)) with and without -mavx. */
+
+extern int aligned_x (void);
+extern int aligned_y_avx (void);
+extern "C" void abort (void);
+
+int
+main ()
+{
+ if (aligned_x () != aligned_y_avx ())
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C
new file mode 100644
index 0000000..aeab257
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C
@@ -0,0 +1,15 @@
+/* PR target/38736 */
+/* { dg-options "-O2" } */
+
+struct alignment_test_struct
+{
+ char space[4] __attribute__((__aligned__));
+};
+
+extern int aligned_x (void);
+
+int
+aligned_x (void)
+{
+ return __alignof__(struct alignment_test_struct);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C
new file mode 100644
index 0000000..bade1b2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C
@@ -0,0 +1,6 @@
+/* PR target/38736 */
+/* { dg-options "-O2 -mavx" } */
+
+#define aligned_x aligned_y_avx
+
+#include "pr38736_x.C"
diff --git a/gcc/testsuite/g++.dg/other/macro-1.C b/gcc/testsuite/g++.dg/other/macro-1.C
new file mode 100644
index 0000000..e1d9d34
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/macro-1.C
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+
+short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
diff --git a/gcc/testsuite/gcc.dg/compat/pr38736_main.c b/gcc/testsuite/gcc.dg/compat/pr38736_main.c
new file mode 100644
index 0000000..88c3586
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr38736_main.c
@@ -0,0 +1,18 @@
+/* PR target/38736 */
+/* { dg-skip-if "attribute ((aligned))" { ! { i?86-*-* x86_64-*-* } } } */
+/* { dg-require-effective-target avx } */
+
+/* Test compatibility of attribute ((aligned)) with and without -mavx. */
+
+extern int aligned_x (void);
+extern int aligned_y_avx (void);
+extern void abort (void);
+
+int
+main ()
+{
+ if (aligned_x () != aligned_y_avx ())
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr38736_x.c b/gcc/testsuite/gcc.dg/compat/pr38736_x.c
new file mode 100644
index 0000000..aeab257
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr38736_x.c
@@ -0,0 +1,15 @@
+/* PR target/38736 */
+/* { dg-options "-O2" } */
+
+struct alignment_test_struct
+{
+ char space[4] __attribute__((__aligned__));
+};
+
+extern int aligned_x (void);
+
+int
+aligned_x (void)
+{
+ return __alignof__(struct alignment_test_struct);
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr38736_y.c b/gcc/testsuite/gcc.dg/compat/pr38736_y.c
new file mode 100644
index 0000000..7e46afa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr38736_y.c
@@ -0,0 +1,6 @@
+/* PR target/38736 */
+/* { dg-options "-O2 -mavx" } */
+
+#define aligned_x aligned_y_avx
+
+#include "pr38736_x.c"
diff --git a/gcc/testsuite/gcc.dg/macro-1.c b/gcc/testsuite/gcc.dg/macro-1.c
new file mode 100644
index 0000000..e1d9d34
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/macro-1.c
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+
+short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));