This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Some DECL_ALIGN cleanup
- From: gkeating at apple dot com (Geoffrey Keating)
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 12 Jul 2007 06:41:43 -0700 (PDT)
- Subject: Some DECL_ALIGN cleanup
I was going to try to make DECL_ALIGN apply only to FUNCTION_DECLs,
VAR_DECLs, and FIELD_DECLs, but it turns out that PARM_DECLs and
RESULT_DECLs also have DECL_ALIGN based off the type (although I'm not
completely sure that this is correct, aren't there ABIs where values
are passed or returned misaligned?) and there's even weird code that
looks at DECL_ALIGN of CONST_DECLs and LABEL_DECLs. I hope there's no
code that looks at DECL_ALIGN of TYPE_DECLs but...
Anyway, so this patch improves a bunch of things that I noticed while
trying to limit DECL_ALIGN.
Bootstrapped & tested on powerpc-darwin8.
--
- Geoffrey Keating <geoffk@apple.com>
===File ~/patches/gcc-functionaligncleanup.patch============
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.
Index: gcc/tree.c
===================================================================
--- gcc/tree.c (revision 126529)
+++ gcc/tree.c (working copy)
@@ -588,9 +588,13 @@
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 @@
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 @@
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;
}
Index: gcc/tree.h
===================================================================
--- gcc/tree.h (revision 126529)
+++ gcc/tree.h (working copy)
@@ -2589,10 +2589,8 @@
#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
Index: gcc/builtins.c
===================================================================
--- gcc/builtins.c (revision 126496)
+++ gcc/builtins.c (working copy)
@@ -355,9 +355,7 @@
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))
Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c (revision 126529)
+++ gcc/varasm.c (working copy)
@@ -1638,7 +1638,7 @@
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 @@
&& 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;
============================================================