From d872ada0175de73128885455c0ea198dfff236e8 Mon Sep 17 00:00:00 2001 From: Geoffrey Keating Date: Thu, 12 Jul 2007 13:43:33 +0000 Subject: [PATCH] builtins.c (get_pointer_alignment): Honor DECL_ALIGN on a FUNCTION_DECL. * 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. From-SVN: r126588 --- gcc/ChangeLog | 12 ++++++++++++ gcc/builtins.c | 4 +--- gcc/tree.c | 22 ++++++++++------------ gcc/tree.h | 6 ++---- gcc/varasm.c | 4 ++-- 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 + + * 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 * 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;