> gcc/c-family/:
>
> 2014-09-15 Andi Kleen <[email protected]>
>
> * c-common.c (handle_no_reorder_attribute): New function.
> (c_common_attribute_table): Add no_reorder attribute.
>
> gcc/:
>
> 2014-09-14 Andi Kleen <[email protected]>
>
> * cgraph.h (symtab_node): Add no_reorder attribute.
> (symbol_table::output_asm_statements): Remove.
> * cgraphclones.c (cgraph_node::create_clone): Copy no_reorder.
> (cgraph_node::create_version_clone): Dito.
> (symbol_table::output_asm_statements): Remove.
> * trans-mem.c (ipa_tm_create_version_alias): Dito.
> * cgraphunit.c (varpool_node::finalize_decl): Check no_reorder.
> (output_in_order): Add no_reorder flag. Only handle no_reorder
> nodes when set.
> (symbol_table::compile): Add separate pass for no_reorder nodes.
> * doc/extend.texi (no_reorder): Document no_reorder attribute.
> * ipa-visibility.c (function_and_variable_visibility): Set
> no_reorder flag in symtab_node from declaration.
> * lto-cgraph.c (lto_output_node): Serialize no_reorder.
> (lto_output_varpool_node): Dito.
> (input_overwrite_node): Dito.
> (input_varpool_node): Dito.
> * varpool.c (varpool_node::add): Set no_reorder attribute.
> (symbol_table::remove_unreferenced_decls): Handle no_reorder.
> (symbol_table::output_variables): Dito.
> * symtab.c (symtab_node::dump_base): Print no_reorder.
>
> gcc/lto/:
>
> 2014-09-13 Andi Kleen <[email protected]>
>
> * lto-partition.c (node_cmp): Update comment.
> (varpool_node_cmp): Use symtab_node for comparison.
> (add_sorted_nodes): New function.
> (lto_balanced_map): Change to keep ordered queue
> of ordered node. Handle no_reorder attribute.
> ---
> gcc/c-family/c-common.c | 28 ++++++++++++
> gcc/cgraph.h | 5 +--
> gcc/cgraphclones.c | 2 +
> gcc/cgraphunit.c | 38 +++++++---------
> gcc/doc/extend.texi | 12 +++++-
> gcc/ipa-visibility.c | 6 +++
> gcc/lto-cgraph.c | 4 ++
> gcc/lto/lto-partition.c | 112
> ++++++++++++++++++++++++++++++------------------
> gcc/symtab.c | 2 +
> gcc/trans-mem.c | 1 +
> gcc/varpool.c | 21 +++++++--
> 11 files changed, 159 insertions(+), 72 deletions(-)
>
> diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
> index 39be956..d0845d1 100644
> --- a/gcc/c-family/c-common.c
> +++ b/gcc/c-family/c-common.c
> @@ -328,6 +328,8 @@ static tree handle_used_attribute (tree *, tree, tree,
> int, bool *);
> static tree handle_unused_attribute (tree *, tree, tree, int, bool *);
> static tree handle_externally_visible_attribute (tree *, tree, tree, int,
> bool *);
> +static tree handle_no_reorder_attribute (tree *, tree, tree, int,
> + bool *);
> static tree handle_const_attribute (tree *, tree, tree, int, bool *);
> static tree handle_transparent_union_attribute (tree *, tree, tree,
> int, bool *);
> @@ -652,6 +654,8 @@ const struct attribute_spec c_common_attribute_table[] =
> handle_unused_attribute, false },
> { "externally_visible", 0, 0, true, false, false,
> handle_externally_visible_attribute, false },
> + { "no_reorder", 0, 0, true, false, false,
> + handle_no_reorder_attribute, false },
> /* The same comments as for noreturn attributes apply to const ones. */
> { "const", 0, 0, true, false, false,
> handle_const_attribute, false },
> @@ -6953,6 +6957,30 @@ handle_externally_visible_attribute (tree *pnode, tree
> name,
> return NULL_TREE;
> }
>
> +/* Handle the "no_reorder" attribute. Arguments as in
> + struct attribute_spec.handler. */
> +
> +static tree
> +handle_no_reorder_attribute (tree *pnode,
> + tree name,
> + tree,
> + int,
> + bool *no_add_attrs)
> +{
> + tree node = *pnode;
> +
> + if ((TREE_CODE (node) != FUNCTION_DECL && TREE_CODE (node) != VAR_DECL)
> + && !(TREE_STATIC (node) || (DECL_P (node) && DECL_EXTERNAL (node))))
> + {
> + warning (OPT_Wattributes,
> + "%qE attribute only affects top level objects",
> + name);
> + *no_add_attrs = true;
> + }
You explicitly check that NODE is FUNCTION_DECL or VAR_DECL
(use VAR_OR_FUNCTION_DECL_P) so you can also remove DECL_P.
TREE_STACK || DECL_EXTERNAL should be enough.
> diff --git a/gcc/ipa-visibility.c b/gcc/ipa-visibility.c
> index 32199af..541d568 100644
> --- a/gcc/ipa-visibility.c
> +++ b/gcc/ipa-visibility.c
> @@ -492,6 +492,9 @@ function_and_variable_visibility (bool whole_program)
> node->externally_visible = false;
> node->forced_by_abi = false;
> }
> + if (lookup_attribute ("no_reorder",
> + DECL_ATTRIBUTES (node->decl)))
> + node->no_reorder = 1;
> if (!node->externally_visible
> && node->definition && !node->weakref
> && !DECL_EXTERNAL (node->decl))
> @@ -633,6 +636,9 @@ function_and_variable_visibility (bool whole_program)
> vnode->externally_visible = false;
> vnode->forced_by_abi = false;
> }
> + if (lookup_attribute ("no_reorder",
> + DECL_ATTRIBUTES (vnode->decl)))
> + vnode->no_reorder = 1;
> if (!vnode->externally_visible
> && !vnode->weakref)
> {
I would still move this into process_common_attributes in cgraphunit.c
so we do not introduce more places where attributes are converted to flags...
OK,
thanks!
Honza