aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@cygnus.com>2000-08-24 23:48:25 +0000
committerJim Wilson <wilson@gcc.gnu.org>2000-08-24 16:48:25 -0700
commitaee3c6b0389ecf8b01ee17fa25dc00b0666ee27c (patch)
tree70d3c839eb90150ba7ddac50375f76c2c2778b2e
parenta1066c99f7071d94c76612f303b57fab60fdc067 (diff)
downloadgcc-aee3c6b0389ecf8b01ee17fa25dc00b0666ee27c.zip
gcc-aee3c6b0389ecf8b01ee17fa25dc00b0666ee27c.tar.gz
gcc-aee3c6b0389ecf8b01ee17fa25dc00b0666ee27c.tar.bz2
Fix ia64-linux setjmp failures due to attribute aligned on typedef bug.
* c-common.c (decl_attributes, case A_ALIGN): Revert last change. Copy type in a TYPE_DECL, just like pushdecl does. From-SVN: r35966
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-common.c22
2 files changed, 19 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2b15780..40f8f0b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-08-24 Jim Wilson <wilson@cygnus.com>
+
+ * c-common.c (decl_attributes, case A_ALIGN): Revert last change.
+ Copy type in a TYPE_DECL, just like pushdecl does.
+
2000-08-24 Richard Henderson <rth@cygnus.com>
* toplev.c (main): Enable flag_reorder_blocks at -O2.
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 9af892a..e2e57c5 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -788,16 +788,22 @@ decl_attributes (node, attributes, prefix_attributes)
error ("requested alignment is too large");
else if (is_type)
{
- if (decl)
+ /* If we have a TYPE_DECL, then copy the type, so that we
+ don't accidentally modify a builtin type. See pushdecl. */
+ if (decl && TREE_TYPE (decl) != error_mark_node
+ && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
{
- DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;
- DECL_USER_ALIGN (decl) = 1;
- }
- else
- {
- TYPE_ALIGN (type) = (1 << i) * BITS_PER_UNIT;
- TYPE_USER_ALIGN (type) = 1;
+ tree tt = TREE_TYPE (decl);
+ DECL_ORIGINAL_TYPE (decl) = tt;
+ tt = build_type_copy (tt);
+ TYPE_NAME (tt) = decl;
+ TREE_USED (tt) = TREE_USED (decl);
+ TREE_TYPE (decl) = tt;
+ type = tt;
}
+
+ TYPE_ALIGN (type) = (1 << i) * BITS_PER_UNIT;
+ TYPE_USER_ALIGN (type) = 1;
}
else if (TREE_CODE (decl) != VAR_DECL
&& TREE_CODE (decl) != FIELD_DECL)