summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2007-07-12 13:43:33 +0000
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2007-07-12 13:43:33 +0000
commit6c96b31e2b66078aca6d4db371053cc879d936e9 (patch)
tree1768a9d093d8c397f3d10649233aaf7917fff2df /gcc
parentddafc9f5b36f82cf1692a50bda2ef0e701899e04 (diff)
downloadgcc-6c96b31e2b66078aca6d4db371053cc879d936e9.tar.gz
* builtins.c (get_pointer_alignment): Honor DECL_ALIGN on a
FUNCTION_DECL. * tree.c (build_decl_stat): Move code from here... (make_node_stat): ... to here. Don't uselessly clear DECL_USER_ALIGN. (expr_align): Honor DECL_ALIGN on a FUNCTION_DECL. Add comment about using DECL_ALIGN of LABEL_DECL and CONST_DECL. * tree.h (DECL_USER_ALIGN): Fix misplaced comment. * varasm.c (assemble_start_function): Use DECL_ALIGN instead of FUNCTION_BOUNDARY. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@126588 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/builtins.c4
-rw-r--r--gcc/tree.c22
-rw-r--r--gcc/tree.h6
-rw-r--r--gcc/varasm.c4
5 files changed, 27 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 620775cb09d..c1264e3cd63 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2007-07-12 Geoffrey Keating <geoffk@apple.com>
+
+ * builtins.c (get_pointer_alignment): Honor DECL_ALIGN on a
+ FUNCTION_DECL.
+ * tree.c (build_decl_stat): Move code from here...
+ (make_node_stat): ... to here. Don't uselessly clear DECL_USER_ALIGN.
+ (expr_align): Honor DECL_ALIGN on a FUNCTION_DECL. Add comment
+ about using DECL_ALIGN of LABEL_DECL and CONST_DECL.
+ * tree.h (DECL_USER_ALIGN): Fix misplaced comment.
+ * varasm.c (assemble_start_function): Use DECL_ALIGN instead of
+ FUNCTION_BOUNDARY.
+
2007-07-12 Dorit Nuzman <dorit@il.ibm.com>
* target.h (builtin_vectorization_cost): Add new target builtin.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index da76f61db32..44cfc0d48b2 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -355,9 +355,7 @@ get_pointer_alignment (tree exp, unsigned int max_align)
else if (offset)
inner = MIN (inner, BITS_PER_UNIT);
}
- if (TREE_CODE (exp) == FUNCTION_DECL)
- align = FUNCTION_BOUNDARY;
- else if (DECL_P (exp))
+ if (DECL_P (exp))
align = MIN (inner, DECL_ALIGN (exp));
#ifdef CONSTANT_ALIGNMENT
else if (CONSTANT_CLASS_P (exp))
diff --git a/gcc/tree.c b/gcc/tree.c
index 6359ff9cec5..21a87a22f5a 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -588,9 +588,13 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
DECL_IN_SYSTEM_HEADER (t) = in_system_header;
if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
{
- if (code != FUNCTION_DECL)
+ if (code == FUNCTION_DECL)
+ {
+ DECL_ALIGN (t) = FUNCTION_BOUNDARY;
+ DECL_MODE (t) = FUNCTION_MODE;
+ }
+ else
DECL_ALIGN (t) = 1;
- DECL_USER_ALIGN (t) = 0;
/* We have not yet computed the alias set for this declaration. */
DECL_POINTER_ALIAS_SET (t) = -1;
}
@@ -1914,14 +1918,13 @@ expr_align (tree t)
align1 = expr_align (TREE_OPERAND (t, 2));
return MIN (align0, align1);
+ /* FIXME: LABEL_DECL and CONST_DECL never have DECL_ALIGN set
+ meaningfully, it's always 1. */
case LABEL_DECL: case CONST_DECL:
case VAR_DECL: case PARM_DECL: case RESULT_DECL:
- if (DECL_ALIGN (t) != 0)
- return DECL_ALIGN (t);
- break;
-
case FUNCTION_DECL:
- return FUNCTION_BOUNDARY;
+ gcc_assert (DECL_ALIGN (t) != 0);
+ return DECL_ALIGN (t);
default:
break;
@@ -3311,11 +3314,6 @@ build_decl_stat (enum tree_code code, tree name, tree type MEM_STAT_DECL)
if (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
layout_decl (t, 0);
- else if (code == FUNCTION_DECL)
- {
- DECL_MODE (t) = FUNCTION_MODE;
- DECL_ALIGN (t) = FUNCTION_BOUNDARY;
- }
return t;
}
diff --git a/gcc/tree.h b/gcc/tree.h
index 7b051ebb0af..64e028eb3f0 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2589,10 +2589,8 @@ struct tree_memory_partition_tag GTY(())
#define DECL_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.align)
/* The alignment of NODE, in bytes. */
#define DECL_ALIGN_UNIT(NODE) (DECL_ALIGN (NODE) / BITS_PER_UNIT)
-/* For FIELD_DECLs, off_align holds the number of low-order bits of
- DECL_FIELD_OFFSET which are known to be always zero.
- DECL_OFFSET_ALIGN thus returns the alignment that DECL_FIELD_OFFSET
- has. */
+/* Set if the alignment of this DECL has been set by the user, for
+ example with an 'aligned' attribute. */
#define DECL_USER_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.user_align)
/* Holds the machine mode corresponding to the declaration of a variable or
field. Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 854a80df3c6..2b29093c533 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -1638,7 +1638,7 @@ assemble_start_function (tree decl, const char *fnname)
if (flag_reorder_blocks_and_partition)
{
switch_to_section (unlikely_text_section ());
- assemble_align (FUNCTION_BOUNDARY);
+ assemble_align (DECL_ALIGN (decl));
ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label);
/* When the function starts with a cold section, we need to explicitly
@@ -1648,7 +1648,7 @@ assemble_start_function (tree decl, const char *fnname)
&& BB_PARTITION (ENTRY_BLOCK_PTR->next_bb) == BB_COLD_PARTITION)
{
switch_to_section (text_section);
- assemble_align (FUNCTION_BOUNDARY);
+ assemble_align (DECL_ALIGN (decl));
ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
hot_label_written = true;
first_function_block_is_cold = true;