diff options
author | pfg <pfg@FreeBSD.org> | 2013-12-28 20:30:31 +0000 |
---|---|---|
committer | pfg <pfg@FreeBSD.org> | 2013-12-28 20:30:31 +0000 |
commit | c5923c049866aa2c60072e109579beebbe729a35 (patch) | |
tree | 8a005a8478b0d93d6ae4875eb4a9d4e16240b10e /contrib/gcc | |
parent | 1c4d56ceec31bf945caf216fc7b46f1d17584721 (diff) | |
download | FreeBSD-src-c5923c049866aa2c60072e109579beebbe729a35.zip FreeBSD-src-c5923c049866aa2c60072e109579beebbe729a35.tar.gz |
gcc: Add support for label attributes and "unavailable" attribute.
Apple GCC has extensions to support for both label attributes and
an "unavailable" attribute. These are critical for objc but are
also useful in regular C/C++.
Apparently at least the label attributes might have found their way to
upstream GCC but the code doesn't seem available on the GPLv2 tree so
we are taking the code directly from Apple. To make this clearer we
are preserving the annoying "APPLE LOCAL" tags and the ChangeLogs
when they are available.
Obtained from: Apple GCC 4.2 - 5531
MFC after: 3 weeks
Diffstat (limited to 'contrib/gcc')
29 files changed, 753 insertions, 161 deletions
diff --git a/contrib/gcc/ChangeLog.apple b/contrib/gcc/ChangeLog.apple new file mode 100644 index 0000000..b2004ee --- /dev/null +++ b/contrib/gcc/ChangeLog.apple @@ -0,0 +1,51 @@ +006-02-15 Fariborz Jahanian <fjahanian@apple.com> + + Radar 4445586 + * c-common.def (DO_STMT): Takes an extra argument. + +/* APPLE LOCAL merge marger */ +/* Stuff under is in fsf mainline, but not in the 4.2 branch */ + +2007-08-02 Geoffrey Keating <geoffk@apple.com> + + Radar 3274130, 5295549 + * c-parser.c (c_parser_while_statement): Handle attributes. + (c_parser_do_statement): Handle attributes. + (c_parser_for_statement): Handle attributes. + * c-common.c (handle_unused_attribute): Warn if a statement + is marked as unused. + * c-tree.h (c_finish_loop): Add extra parameter. + * c-typeck.c (c_finish_loop): Handle attributes. + * doc/extend.texi (Attribute Syntax): Document statement attributes. + (Label Attributes): Explain how they apply to statements. + * tree-cfg.c (cleanup_dead_labels): Preserve labels with + user-specified alignment or attributes. + * stmt.c (expand_label): Update and correct documentation. + + * c-common.c (handle_aligned_attribute): Handle LABEL_DECL. + * rtl.def (CODE_LABEL): Add 8th operand. + * rtl.h (LABEL_ALIGN_LOG): New. + (LABEL_MAX_SKIP): New. + (SET_LABEL_ALIGN): New. + * emit-rtl.c (gen_label_rtx): Adjust. + * print-rtl.c (print_rtx): Print LABEL_ALIGN_LOG. + * stmt.c (label_rtx): Set CODE_LABEL's alignment from DECL_ALIGN. + (expand_label): Update documentation. + * final.c (struct label_alignment): Delete. + (label_align): Delete. + (min_labelno): Delete. + (max_labelno): Delete. + (LABEL_TO_ALIGNMENT): Delete. + (LABEL_TO_MAX_SKIP): Delete. + (label_to_alignment): Adjust for LABEL_ALIGN_LOG. + (align_fuzz): Likewise. + (compute_alignments): Likewise. + (shorten_branches): Remove code to set up label_align. + Adjust for LABEL_ALIGN_LOG. + (final_scan_insn): Adjust for LABEL_ALIGN_LOG. + * doc/extend.texi (C Extensions): Add 'Label Attributes' to menu. + (Attribute Syntax): Move label content to Label Attributes. + (Function Attributes): Mention label attributes. + (Variable Attributes): Mention label attributes. + (Type Attributes): Mention label attributes. + (Label Attributes): New. diff --git a/contrib/gcc/c-common.c b/contrib/gcc/c-common.c index b1fa91d..4b47ef4 100644 --- a/contrib/gcc/c-common.c +++ b/contrib/gcc/c-common.c @@ -541,6 +541,9 @@ static tree handle_pure_attribute (tree *, tree, tree, int, bool *); static tree handle_novops_attribute (tree *, tree, tree, int, bool *); static tree handle_deprecated_attribute (tree *, tree, tree, int, bool *); +/* APPLE LOCAL begin "unavailable" attribute (Radar 2809697) --ilr */ +static tree handle_unavailable_attribute (tree *, tree, tree, int, bool *); +/* APPLE LOCAL end "unavailable" attribute --ilr */ static tree handle_vector_size_attribute (tree *, tree, tree, int, bool *); static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *); @@ -626,6 +629,10 @@ const struct attribute_spec c_common_attribute_table[] = handle_novops_attribute }, { "deprecated", 0, 0, false, false, false, handle_deprecated_attribute }, + /* APPLE LOCAL begin "unavailable" attribute (Radar 2809697) --ilr */ + { "unavailable", 0, 0, false, false, false, + handle_unavailable_attribute }, + /* APPLE LOCAL end "unavailable" attribute --ilr */ { "vector_size", 1, 1, false, true, false, handle_vector_size_attribute }, { "visibility", 1, 1, false, false, false, @@ -4394,7 +4401,10 @@ handle_unused_attribute (tree *node, tree name, tree ARG_UNUSED (args), if (TREE_CODE (decl) == PARM_DECL || TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL - || TREE_CODE (decl) == LABEL_DECL +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + || (TREE_CODE (decl) == LABEL_DECL + && ! DECL_ARTIFICIAL (decl)) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ || TREE_CODE (decl) == TYPE_DECL) TREE_USED (decl) = 1; else @@ -4842,7 +4852,10 @@ handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args, TYPE_USER_ALIGN (*type) = 1; } else if (! VAR_OR_FUNCTION_DECL_P (decl) - && TREE_CODE (decl) != FIELD_DECL) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + && TREE_CODE (decl) != FIELD_DECL + && TREE_CODE (decl) != LABEL_DECL) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ { error ("alignment may not be specified for %q+D", decl); *no_add_attrs = true; @@ -5345,6 +5358,67 @@ handle_deprecated_attribute (tree *node, tree name, return NULL_TREE; } +/* APPLE LOCAL begin "unavailable" attribute (Radar 2809697) --ilr */ +/* Handle a "unavailable" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_unavailable_attribute (tree *node, tree name, + tree args ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED, + bool *no_add_attrs) +{ + tree type = NULL_TREE; + int warn = 0; + const char *what = NULL; + + if (DECL_P (*node)) + { + tree decl = *node; + type = TREE_TYPE (decl); + + if (TREE_CODE (decl) == TYPE_DECL + || TREE_CODE (decl) == PARM_DECL + || TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == FUNCTION_DECL) + { + TREE_UNAVAILABLE (decl) = 1; + } + else + warn = 1; + } + else if (TYPE_P (*node)) + { + if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) + *node = build_variant_type_copy (*node); + TREE_UNAVAILABLE (*node) = 1; + type = *node; + } + else + warn = 1; + + if (warn) + { + *no_add_attrs = true; + if (type && TYPE_NAME (type)) + { + if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) + what = IDENTIFIER_POINTER (TYPE_NAME (*node)); + else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL + && DECL_NAME (TYPE_NAME (type))) + what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); + } + if (what) + warning (0, "`%s' attribute ignored for `%s'", + IDENTIFIER_POINTER (name), what); + else + warning (0, "`%s' attribute ignored", IDENTIFIER_POINTER (name)); + } + + return NULL_TREE; +} +/* APPLE LOCAL end "unavailable" attribute --ilr */ + /* Handle a "vector_size" attribute; arguments as in struct attribute_spec.handler. */ diff --git a/contrib/gcc/c-decl.c b/contrib/gcc/c-decl.c index 3cdd69b..7b3833c 100644 --- a/contrib/gcc/c-decl.c +++ b/contrib/gcc/c-decl.c @@ -453,10 +453,17 @@ add_stmt (tree t) with __attribute__((deprecated)). An object declared as __attribute__((deprecated)) suppresses warnings of uses of other deprecated items. */ +/* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ +/* Also add an __attribute__((unavailable)). An object declared as + __attribute__((unavailable)) suppresses any reports of being + declared with unavailable or deprecated items. */ +/* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ enum deprecated_states { DEPRECATED_NORMAL, DEPRECATED_SUPPRESS + /* APPLE LOCAL "unavailable" attribute (radar 2809697) */ + , DEPRECATED_UNAVAILABLE_SUPPRESS }; static enum deprecated_states deprecated_state = DEPRECATED_NORMAL; @@ -1709,6 +1716,12 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) if (TREE_DEPRECATED (newdecl)) TREE_DEPRECATED (olddecl) = 1; + /* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ + /* Merge unavailableness. */ + if (TREE_UNAVAILABLE (newdecl)) + TREE_UNAVAILABLE (olddecl) = 1; + /* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ + /* Keep source location of definition rather than declaration and of prototype rather than non-prototype unless that prototype is built-in. */ @@ -3222,8 +3235,36 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs, /* An object declared as __attribute__((deprecated)) suppresses warnings of uses of other deprecated items. */ + /* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ + /* An object declared as __attribute__((unavailable)) suppresses + any reports of being declared with unavailable or deprecated + items. An object declared as __attribute__((deprecated)) + suppresses warnings of uses of other deprecated items. */ +#ifdef A_LESS_INEFFICENT_WAY /* which I really don't want to do! */ if (lookup_attribute ("deprecated", attributes)) deprecated_state = DEPRECATED_SUPPRESS; + else if (lookup_attribute ("unavailable", attributes)) + deprecated_state = DEPRECATED_UNAVAILABLE_SUPPRESS; +#else /* a more efficient way doing what lookup_attribute would do */ + tree a; + + for (a = attributes; a; a = TREE_CHAIN (a)) + { + tree name = TREE_PURPOSE (a); + if (TREE_CODE (name) == IDENTIFIER_NODE) + if (is_attribute_p ("deprecated", name)) + { + deprecated_state = DEPRECATED_SUPPRESS; + break; + } + if (is_attribute_p ("unavailable", name)) + { + deprecated_state = DEPRECATED_UNAVAILABLE_SUPPRESS; + break; + } + } +#endif + /* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, NULL); @@ -4087,6 +4128,11 @@ grokdeclarator (const struct c_declarator *declarator, /* If this looks like a function definition, make it one, even if it occurs where parms are expected. Then store_parm_decls will reject it and not use it as a parm. */ + /* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ + if (declspecs->unavailable_p) + error_unavailable_use (declspecs->type); + else + /* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ if (decl_context == NORMAL && !funcdef_flag && current_scope->parm_flag) decl_context = PARM; @@ -7267,6 +7313,8 @@ build_null_declspecs (void) ret->tag_defined_p = false; ret->explicit_signed_p = false; ret->deprecated_p = false; + /* APPLE LOCAL "unavailable" attribute (radar 2809697) */ + ret->unavailable_p = false; ret->default_int_p = false; ret->long_p = false; ret->long_long_p = false; @@ -7330,6 +7378,11 @@ declspecs_add_type (struct c_declspecs *specs, struct c_typespec spec) if (TREE_DEPRECATED (type)) specs->deprecated_p = true; + /* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ + if (TREE_UNAVAILABLE (type)) + specs->unavailable_p = true; + /* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ + /* Handle type specifier keywords. */ if (TREE_CODE (type) == IDENTIFIER_NODE && C_IS_RESERVED_WORD (type)) { diff --git a/contrib/gcc/c-parser.c b/contrib/gcc/c-parser.c index c6be639..a8c8a1e 100644 --- a/contrib/gcc/c-parser.c +++ b/contrib/gcc/c-parser.c @@ -3940,16 +3940,25 @@ c_parser_switch_statement (c_parser *parser) /* Parse a while statement (C90 6.6.5, C99 6.8.5). while-statement: - while (expression) statement + APPLE LOCAL begin for-fsf-4_4 3274130 5295549 + while attributes (expression) statement + + The use of attributes is a GNU extension. + APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ static void c_parser_while_statement (c_parser *parser) { - tree block, cond, body, save_break, save_cont; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tree block, cond, body, save_break, save_cont, attrs; +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ location_t loc; gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE)); c_parser_consume_token (parser); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + attrs = c_parser_attributes (parser); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ block = c_begin_compound_stmt (flag_isoc99); loc = c_parser_peek_token (parser)->location; cond = c_parser_paren_condition (parser); @@ -3958,7 +3967,10 @@ c_parser_while_statement (c_parser *parser) save_cont = c_cont_label; c_cont_label = NULL_TREE; body = c_parser_c99_block_statement (parser); - c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, attrs, + true); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ add_stmt (c_end_compound_stmt (block, flag_isoc99)); c_break_label = save_break; c_cont_label = save_cont; @@ -3967,16 +3979,25 @@ c_parser_while_statement (c_parser *parser) /* Parse a do statement (C90 6.6.5, C99 6.8.5). do-statement: - do statement while ( expression ) ; + APPLE LOCAL begin for-fsf-4_4 3274130 5295549 + do attributes statement while ( expression ) ; + + The use of attributes is a GNU extension. + APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ static void c_parser_do_statement (c_parser *parser) { - tree block, cond, body, save_break, save_cont, new_break, new_cont; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tree block, cond, body, save_break, save_cont, new_break, new_cont, attrs; +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ location_t loc; gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO)); c_parser_consume_token (parser); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + attrs = c_parser_attributes (parser); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ block = c_begin_compound_stmt (flag_isoc99); loc = c_parser_peek_token (parser)->location; save_break = c_break_label; @@ -3992,18 +4013,26 @@ c_parser_do_statement (c_parser *parser) cond = c_parser_paren_condition (parser); if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) c_parser_skip_to_end_of_block_or_statement (parser); - c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + c_finish_loop (loc, cond, NULL, body, new_break, new_cont, attrs, false); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ add_stmt (c_end_compound_stmt (block, flag_isoc99)); } /* Parse a for statement (C90 6.6.5, C99 6.8.5). for-statement: - for ( expression[opt] ; expression[opt] ; expression[opt] ) statement - for ( nested-declaration expression[opt] ; expression[opt] ) statement + APPLE LOCAL begin for-fsf-4_4 3274130 5295549 + for attributes ( expression[opt] ; expression[opt] ; expression[opt] ) \ + statement + for attributes ( nested-declaration expression[opt] ; expression[opt] ) \ + statement The form with a declaration is new in C99. + The use of attributes is a GNU extension. + + APPLE LOCAL end for-fsf-4_4 3274130 5295549 ??? In accordance with the old parser, the declaration may be a nested function, which is then rejected in check_for_loop_decls, but does it make any sense for this to be included in the grammar? @@ -4015,11 +4044,16 @@ c_parser_do_statement (c_parser *parser) static void c_parser_for_statement (c_parser *parser) { - tree block, cond, incr, save_break, save_cont, body; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tree block, cond, incr, save_break, save_cont, body, attrs; +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ location_t loc; gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR)); loc = c_parser_peek_token (parser)->location; c_parser_consume_token (parser); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + attrs = c_parser_attributes (parser); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ block = c_begin_compound_stmt (flag_isoc99); if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) { @@ -4094,7 +4128,10 @@ c_parser_for_statement (c_parser *parser) save_cont = c_cont_label; c_cont_label = NULL_TREE; body = c_parser_c99_block_statement (parser); - c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, attrs, + true); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ add_stmt (c_end_compound_stmt (block, flag_isoc99)); c_break_label = save_break; c_cont_label = save_cont; diff --git a/contrib/gcc/c-tree.h b/contrib/gcc/c-tree.h index 7e2c81f..af2e798 100644 --- a/contrib/gcc/c-tree.h +++ b/contrib/gcc/c-tree.h @@ -257,6 +257,10 @@ struct c_declspecs { BOOL_BITFIELD explicit_signed_p : 1; /* Whether the specifiers include a deprecated typedef. */ BOOL_BITFIELD deprecated_p : 1; + /* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ + /* Whether the specifiers include a unavailable typedef. */ + BOOL_BITFIELD unavailable_p : 1; + /* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ /* Whether the type defaulted to "int" because there were no type specifiers. */ BOOL_BITFIELD default_int_p; @@ -573,7 +577,10 @@ extern int c_types_compatible_p (tree, tree); extern tree c_begin_compound_stmt (bool); extern tree c_end_compound_stmt (tree, bool); extern void c_finish_if_stmt (location_t, tree, tree, tree, bool); -extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, tree, + bool); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ extern tree c_begin_stmt_expr (void); extern tree c_finish_stmt_expr (tree); extern tree c_process_expr_stmt (tree); diff --git a/contrib/gcc/c-typeck.c b/contrib/gcc/c-typeck.c index cd30cd1..c60aa26 100644 --- a/contrib/gcc/c-typeck.c +++ b/contrib/gcc/c-typeck.c @@ -1849,6 +1849,11 @@ build_component_ref (tree datum, tree component) if (TREE_DEPRECATED (subdatum)) warn_deprecated_use (subdatum); + /* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ + if (TREE_UNAVAILABLE (subdatum)) + error_unavailable_use (subdatum); + /* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ + datum = ref; field = TREE_CHAIN (field); @@ -2090,6 +2095,11 @@ build_external_ref (tree id, int fun, location_t loc) if (TREE_DEPRECATED (ref)) warn_deprecated_use (ref); + /* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ + if (TREE_UNAVAILABLE (ref)) + error_unavailable_use (ref); + /* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ + if (!skip_evaluation) assemble_external (ref); TREE_USED (ref) = 1; @@ -7247,15 +7257,22 @@ c_finish_if_stmt (location_t if_locus, tree cond, tree then_block, add_stmt (stmt); } -/* Emit a general-purpose loop construct. START_LOCUS is the location of - the beginning of the loop. COND is the loop condition. COND_IS_FIRST - is false for DO loops. INCR is the FOR increment expression. BODY is - the statement controlled by the loop. BLAB is the break label. CLAB is - the continue label. Everything is allowed to be NULL. */ - +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +/* Emit a general-purpose loop construct. START_LOCUS is the location + of the beginning of the loop. COND is the loop condition. + COND_IS_FIRST is false for DO loops. INCR is the FOR increment + expression. BODY is the statement controlled by the loop. BLAB is + the break label. CLAB is the continue label. ATTRS is the + attributes associated with the loop, which at present are + associated with the topmost label. Everything is allowed to be + NULL. */ + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ void c_finish_loop (location_t start_locus, tree cond, tree incr, tree body, - tree blab, tree clab, bool cond_is_first) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tree blab, tree clab, tree attrs, bool cond_is_first) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ { tree entry = NULL, exit = NULL, t; diff --git a/contrib/gcc/cp/ChangeLog.apple b/contrib/gcc/cp/ChangeLog.apple new file mode 100644 index 0000000..a3eb812 --- /dev/null +++ b/contrib/gcc/cp/ChangeLog.apple @@ -0,0 +1,31 @@ +2006-02-15 Fariborz Jahanian <fjahanian@apple.com> + + Radar 4445586 + * semantics.c (begin_do_stmt): DO_STMT nodes take an + extra argument to build. + + # APPLE LOCAL begin for-fsf-4_4 3274130 5295549 +2007-08-03 Geoffrey Keating <geoffk@apple.com> + + Radar 5295549 + * parser.c (cp_parser_iteration_statement): Handle attributes. + * semantics.c (begin_for_stmt): Put attributes in built tree. + (begin_while_stmt): Put attributes in built tree. + (begin_do_stmt): Put attributes in built tree. + * pt.c (tsubst_expr): Handle attributes for FOR_STMT, WHILE_STMT, + DO_STMT. + * cp-gimplify.c (gimplify_cp_loop): Handle attributes. + (gimplify_for_stmt): Pass attributes to gimplify_cp_loop. + (gimplify_while_stmt): Pass attributes to gimplify_cp_loop. + (gimplify_do_stmt): Pass attributes to gimplify_cp_loop. + * dump.c (cp_dump_tree): Dump attributes for FOR_STMT, WHILE_STMT, + DO_STMT. + * cp-tree.h (begin_while_stmt): Update prototype. + (begin_do_stmt): Likewise. + (begin_for_stmt): Likewise. + * cp-tree.def (FOR_STMT): Add extra parameter. + (WHILE_STMT): Likewise. + (DO_STMT): Likewise. + * init.c (build_vec_init): Update for change to begin_for_stmt. + + # APPLE LOCAL end for-fsf-4_4 3274130 5295549 diff --git a/contrib/gcc/cp/cp-gimplify.c b/contrib/gcc/cp/cp-gimplify.c index 2be5857..08d4ca0 100644 --- a/contrib/gcc/cp/cp-gimplify.c +++ b/contrib/gcc/cp/cp-gimplify.c @@ -188,7 +188,10 @@ gimplify_if_stmt (tree *stmt_p) loop body as in do-while loops. */ static tree -gimplify_cp_loop (tree cond, tree body, tree incr, bool cond_is_first) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +gimplify_cp_loop (tree cond, tree body, tree incr, tree attrs, + bool cond_is_first, tree inner_foreach) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ { tree top, entry, exit, cont_block, break_block, stmt_list, t; location_t stmt_locus; @@ -223,6 +226,12 @@ gimplify_cp_loop (tree cond, tree body, tree incr, bool cond_is_first) out of the loop, or to the top of it. If there's no exit condition, then we just build a jump back to the top. */ exit = build_and_jump (&LABEL_EXPR_LABEL (top)); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + + /* Add the attributes to the 'top' label. */ + decl_attributes (&LABEL_EXPR_LABEL (top), attrs, 0); + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ if (cond && !integer_nonzerop (cond)) { t = build_bc_goto (bc_break); @@ -270,8 +279,11 @@ gimplify_for_stmt (tree *stmt_p, tree *pre_p) if (FOR_INIT_STMT (stmt)) gimplify_and_add (FOR_INIT_STMT (stmt), pre_p); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ *stmt_p = gimplify_cp_loop (FOR_COND (stmt), FOR_BODY (stmt), - FOR_EXPR (stmt), 1); + FOR_EXPR (stmt), FOR_ATTRIBUTES (stmt), 1, + NULL_TREE); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } /* Gimplify a WHILE_STMT node. */ @@ -280,8 +292,11 @@ static void gimplify_while_stmt (tree *stmt_p) { tree stmt = *stmt_p; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ *stmt_p = gimplify_cp_loop (WHILE_COND (stmt), WHILE_BODY (stmt), - NULL_TREE, 1); + NULL_TREE, WHILE_ATTRIBUTES (stmt), 1, + NULL_TREE); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } /* Gimplify a DO_STMT node. */ @@ -290,8 +305,11 @@ static void gimplify_do_stmt (tree *stmt_p) { tree stmt = *stmt_p; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ *stmt_p = gimplify_cp_loop (DO_COND (stmt), DO_BODY (stmt), - NULL_TREE, 0); + NULL_TREE, DO_ATTRIBUTES (stmt), 0, + DO_FOREACH (stmt)); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } /* Genericize a SWITCH_STMT by turning it into a SWITCH_EXPR. */ diff --git a/contrib/gcc/cp/cp-tree.def b/contrib/gcc/cp/cp-tree.def index 55ef21e..5915fb6 100644 --- a/contrib/gcc/cp/cp-tree.def +++ b/contrib/gcc/cp/cp-tree.def @@ -281,18 +281,23 @@ DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", tcc_statement, 3) and COND_EXPR for the benefit of templates. */ DEFTREECODE (IF_STMT, "if_stmt", tcc_statement, 3) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ /* Used to represent a `for' statement. The operands are - FOR_INIT_STMT, FOR_COND, FOR_EXPR, and FOR_BODY, respectively. */ -DEFTREECODE (FOR_STMT, "for_stmt", tcc_statement, 4) + FOR_INIT_STMT, FOR_COND, FOR_EXPR, FOR_BODY and FOR_ATTRIBUTES + respectively. */ +DEFTREECODE (FOR_STMT, "for_stmt", tcc_statement, 5) /* Used to represent a 'while' statement. The operands are WHILE_COND - and WHILE_BODY, respectively. */ -DEFTREECODE (WHILE_STMT, "while_stmt", tcc_statement, 2) + WHILE_BODY, and WHILE_ATTRIBUTES respectively. */ +DEFTREECODE (WHILE_STMT, "while_stmt", tcc_statement, 3) -/* Used to represent a 'do' statement. The operands are DO_BODY and - DO_COND, respectively. */ -DEFTREECODE (DO_STMT, "do_stmt", tcc_statement, 2) +/* APPLE LOCAL begin radar 4445586 */ +/* Used to represent a 'do' statement. The operands are DO_BODY, + DO_COND, DO_ATTRIBUTES, and DO_FOREACH respectively. */ +DEFTREECODE (DO_STMT, "do_stmt", tcc_statement, 4) +/* APPLE LOCAL end radar 4445586 */ +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* Used to represent a 'break' statement. */ DEFTREECODE (BREAK_STMT, "break_stmt", tcc_statement, 0) diff --git a/contrib/gcc/cp/cp-tree.h b/contrib/gcc/cp/cp-tree.h index 0b30f38..6593832 100644 --- a/contrib/gcc/cp/cp-tree.h +++ b/contrib/gcc/cp/cp-tree.h @@ -3080,12 +3080,24 @@ extern void decl_shadowed_for_var_insert (tree, tree); while statement and the body of the while statement, respectively. */ #define WHILE_COND(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0) #define WHILE_BODY(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +#define WHILE_ATTRIBUTES(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 2) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* DO_STMT accessors. These give access to the condition of the do statement and the body of the do statement, respectively. */ #define DO_COND(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 0) #define DO_BODY(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 1) - +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +#define DO_ATTRIBUTES(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 2) +/* APPLE LOCAL begin C* language */ +/* Used as a flag to indicate synthesized inner do-while loop of a + foreach statement. Used for generation of break/continue statement + of the loop. */ +#define DO_FOREACH(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 3) +/* APPLE LOCAL end C* language */ + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* FOR_STMT accessors. These give access to the init statement, condition, update expression, and body of the for statement, respectively. */ @@ -3093,7 +3105,10 @@ extern void decl_shadowed_for_var_insert (tree, tree); #define FOR_COND(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 1) #define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2) #define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +#define FOR_ATTRIBUTES(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 4) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ #define SWITCH_STMT_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0) #define SWITCH_STMT_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1) #define SWITCH_STMT_TYPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2) @@ -4258,14 +4273,20 @@ extern tree finish_then_clause (tree); extern void begin_else_clause (tree); extern void finish_else_clause (tree); extern void finish_if_stmt (tree); -extern tree begin_while_stmt (void); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +extern tree begin_while_stmt (tree); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ extern void finish_while_stmt_cond (tree, tree); extern void finish_while_stmt (tree); -extern tree begin_do_stmt (void); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +extern tree begin_do_stmt (tree); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ extern void finish_do_body (tree); extern void finish_do_stmt (tree, tree); extern tree finish_return_stmt (tree); -extern tree begin_for_stmt (void); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +extern tree begin_for_stmt (tree); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ extern void finish_for_init_stmt (tree); extern void finish_for_cond (tree, tree); extern void finish_for_expr (tree, tree); diff --git a/contrib/gcc/cp/decl.c b/contrib/gcc/cp/decl.c index dcceeba..40e6c92 100644 --- a/contrib/gcc/cp/decl.c +++ b/contrib/gcc/cp/decl.c @@ -232,10 +232,17 @@ int function_depth; with __attribute__((deprecated)). An object declared as __attribute__((deprecated)) suppresses warnings of uses of other deprecated items. */ +/* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ +/* An object declared as __attribute__((unavailable)) suppresses + any reports of being declared with unavailable or deprecated + items. */ +/* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ enum deprecated_states { DEPRECATED_NORMAL, DEPRECATED_SUPPRESS + /* APPLE LOCAL "unavailable" attribute (radar 2809697) */ + , DEPRECATED_UNAVAILABLE_SUPPRESS }; static enum deprecated_states deprecated_state = DEPRECATED_NORMAL; @@ -3836,14 +3843,40 @@ start_decl (const cp_declarator *declarator, tree decl; tree type, tem; tree context; + /* APPLE LOCAL "unavailable" attribute (radar 2809697) */ + tree a; bool was_public; *pushed_scope_p = NULL_TREE; - /* An object declared as __attribute__((deprecated)) suppresses - warnings of uses of other deprecated items. */ + /* APPLE LOCAL begin "unavailable" attribute (radar 2809697) */ + /* An object declared as __attribute__((unavailable)) suppresses + any reports of being declared with unavailable or deprecated + items. An object declared as __attribute__((deprecated)) + suppresses warnings of uses of other deprecated items. */ +#ifdef A_LESS_INEFFICENT_WAY /* which I really don't want to do! */ if (lookup_attribute ("deprecated", attributes)) deprecated_state = DEPRECATED_SUPPRESS; + else if (lookup_attribute ("unavailable", attributes)) + deprecated_state = DEPRECATED_UNAVAILABLE_SUPPRESS; +#else /* a more efficient way doing what lookup_attribute would do */ + for (a = attributes; a; a = TREE_CHAIN (a)) + { + tree name = TREE_PURPOSE (a); + if (TREE_CODE (name) == IDENTIFIER_NODE) + if (is_attribute_p ("deprecated", name)) + { + deprecated_state = DEPRECATED_SUPPRESS; + break; + } + if (is_attribute_p ("unavailable", name)) + { + deprecated_state = DEPRECATED_UNAVAILABLE_SUPPRESS; + break; + } + } +#endif + /* APPLE LOCAL end "unavailable" attribute (radar 2809697) */ attributes = chainon (attributes, prefix_attributes); @@ -7274,6 +7307,19 @@ grokdeclarator (const cp_declarator *declarator, type = NULL_TREE; type_was_error_mark_node = true; } + + /* APPLE LOCAL begin unavailable attribute (radar 2809697) --bowdidge */ + /* If the entire declaration is itself tagged as unavailable then + suppress reports of unavailable/deprecated items. If the + entire declaration is tagged as only deprecated we still + report unavailable uses. */ + if (type && TREE_DEPRECATED (type) && TREE_UNAVAILABLE (type)) + { + if (deprecated_state != DEPRECATED_UNAVAILABLE_SUPPRESS) + warn_deprecated_use (type); + } + else + /* APPLE LOCAL end unavailable attribute (radar 2809697) --bowdidge */ /* If the entire declaration is itself tagged as deprecated then suppress reports of deprecated items. */ if (type && TREE_DEPRECATED (type) diff --git a/contrib/gcc/cp/dump.c b/contrib/gcc/cp/dump.c index c63cfe2..b4253f3 100644 --- a/contrib/gcc/cp/dump.c +++ b/contrib/gcc/cp/dump.c @@ -433,6 +433,9 @@ cp_dump_tree (void* dump_info, tree t) dump_stmt (di, t); dump_child ("body", DO_BODY (t)); dump_child ("cond", DO_COND (t)); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + dump_child ("attrs", DO_ATTRIBUTES (t)); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ break; case FOR_STMT: @@ -441,6 +444,9 @@ cp_dump_tree (void* dump_info, tree t) dump_child ("cond", FOR_COND (t)); dump_child ("expr", FOR_EXPR (t)); dump_child ("body", FOR_BODY (t)); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + dump_child ("attrs", FOR_ATTRIBUTES (t)); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ break; case SWITCH_STMT: @@ -453,6 +459,9 @@ cp_dump_tree (void* dump_info, tree t) dump_stmt (di, t); dump_child ("cond", WHILE_COND (t)); dump_child ("body", WHILE_BODY (t)); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + dump_child ("attrs", WHILE_ATTRIBUTES (t)); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ break; case STMT_EXPR: diff --git a/contrib/gcc/cp/init.c b/contrib/gcc/cp/init.c index 70bc764..fbdd609 100644 --- a/contrib/gcc/cp/init.c +++ b/contrib/gcc/cp/init.c @@ -2563,7 +2563,9 @@ build_vec_init (tree base, tree maxindex, tree init, tree elt_init; tree to; - for_stmt = begin_for_stmt (); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + for_stmt = begin_for_stmt (NULL_TREE); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ finish_for_init_stmt (for_stmt); finish_for_cond (build2 (NE_EXPR, boolean_type_node, iterator, build_int_cst (TREE_TYPE (iterator), -1)), diff --git a/contrib/gcc/cp/parser.c b/contrib/gcc/cp/parser.c index a021d5b..94f9078 100644 --- a/contrib/gcc/cp/parser.c +++ b/contrib/gcc/cp/parser.c @@ -6787,6 +6787,16 @@ cp_parser_condition (cp_parser* parser) for ( for-init-statement condition [opt] ; expression [opt] ) statement + APPLE LOCAL begin for-fsf-4_4 3274130 5295549 + GNU extension: + + while attributes [opt] ( condition ) statement + do attributes [opt] statement while ( expression ) ; + for attributes [opt] + ( for-init-statement condition [opt] ; expression [opt] ) + statement + + APPLE LOCAL end for-fsf-4_4 3274130 5295549 Returns the new WHILE_STMT, DO_STMT, or FOR_STMT. */ static tree @@ -6794,10 +6804,14 @@ cp_parser_iteration_statement (cp_parser* parser) { cp_token *token; enum rid keyword; - tree statement; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tree statement, attributes; +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ unsigned char in_statement; - /* Peek at the next token. */ +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + /* Get the keyword at the start of the loop. */ +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ token = cp_parser_require (parser, CPP_KEYWORD, "iteration-statement"); if (!token) return error_mark_node; @@ -6806,6 +6820,11 @@ cp_parser_iteration_statement (cp_parser* parser) statement. */ in_statement = parser->in_statement; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + /* Parse the attributes, if any. */ + attributes = cp_parser_attributes_opt (parser); + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* See what kind of keyword it is. */ keyword = token->keyword; switch (keyword) @@ -6815,7 +6834,9 @@ cp_parser_iteration_statement (cp_parser* parser) tree condition; /* Begin the while-statement. */ - statement = begin_while_stmt (); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + statement = begin_while_stmt (attributes); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* Look for the `('. */ cp_parser_require (parser, CPP_OPEN_PAREN, "`('"); /* Parse the condition. */ @@ -6837,7 +6858,9 @@ cp_parser_iteration_statement (cp_parser* parser) tree expression; /* Begin the do-statement. */ - statement = begin_do_stmt (); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + statement = begin_do_stmt (attributes); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* Parse the body of the do-statement. */ parser->in_statement = IN_ITERATION_STMT; cp_parser_implicitly_scoped_statement (parser, NULL); @@ -6864,7 +6887,9 @@ cp_parser_iteration_statement (cp_parser* parser) tree expression = NULL_TREE; /* Begin the for-statement. */ - statement = begin_for_stmt (); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + statement = begin_for_stmt (attributes); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* Look for the `('. */ cp_parser_require (parser, CPP_OPEN_PAREN, "`('"); /* Parse the initialization. */ diff --git a/contrib/gcc/cp/pt.c b/contrib/gcc/cp/pt.c index 1a5c20f..008f8f9 100644 --- a/contrib/gcc/cp/pt.c +++ b/contrib/gcc/cp/pt.c @@ -8593,8 +8593,11 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, } case FOR_STMT: - stmt = begin_for_stmt (); - RECUR (FOR_INIT_STMT (t)); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tmp = RECUR (FOR_ATTRIBUTES (t)); + stmt = begin_for_stmt (tmp); + RECUR (FOR_INIT_STMT (t)); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ finish_for_init_stmt (stmt); tmp = RECUR (FOR_COND (t)); finish_for_cond (tmp, stmt); @@ -8605,7 +8608,10 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, break; case WHILE_STMT: - stmt = begin_while_stmt (); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tmp = RECUR (WHILE_ATTRIBUTES (t)); + stmt = begin_while_stmt (tmp); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ tmp = RECUR (WHILE_COND (t)); finish_while_stmt_cond (tmp, stmt); RECUR (WHILE_BODY (t)); @@ -8613,7 +8619,10 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, break; case DO_STMT: - stmt = begin_do_stmt (); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tmp = RECUR (DO_ATTRIBUTES (t)); + stmt = begin_do_stmt (tmp); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ RECUR (DO_BODY (t)); finish_do_body (stmt); tmp = RECUR (DO_COND (t)); diff --git a/contrib/gcc/cp/semantics.c b/contrib/gcc/cp/semantics.c index 547859b..c234e25 100644 --- a/contrib/gcc/cp/semantics.c +++ b/contrib/gcc/cp/semantics.c @@ -704,10 +704,14 @@ finish_if_stmt (tree if_stmt) appropriate. */ tree -begin_while_stmt (void) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +begin_while_stmt (tree attribs) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ { tree r; - r = build_stmt (WHILE_STMT, NULL_TREE, NULL_TREE); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + r = build_stmt (WHILE_STMT, NULL_TREE, NULL_TREE, attribs); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ add_stmt (r); WHILE_BODY (r) = do_pushlevel (sk_block); begin_cond (&WHILE_COND (r)); @@ -737,9 +741,14 @@ finish_while_stmt (tree while_stmt) appropriate. */ tree -begin_do_stmt (void) -{ - tree r = build_stmt (DO_STMT, NULL_TREE, NULL_TREE); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +begin_do_stmt (tree attribs) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ +{ + /* APPLE LOCAL radar 4445586 */ +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + tree r = build_stmt (DO_STMT, NULL_TREE, NULL_TREE, attribs, NULL_TREE); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ add_stmt (r); DO_BODY (r) = push_stmt_list (); return r; @@ -803,12 +812,17 @@ finish_return_stmt (tree expr) /* Begin a for-statement. Returns a new FOR_STMT if appropriate. */ tree -begin_for_stmt (void) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +begin_for_stmt (tree attribs) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ { tree r; r = build_stmt (FOR_STMT, NULL_TREE, NULL_TREE, - NULL_TREE, NULL_TREE); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + NULL_TREE, NULL_TREE, attribs); + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ if (flag_new_for_scope > 0) TREE_CHAIN (r) = do_pushlevel (sk_for); diff --git a/contrib/gcc/doc/extend.texi b/contrib/gcc/doc/extend.texi index c6bd57d..db6f1bd 100644 --- a/contrib/gcc/doc/extend.texi +++ b/contrib/gcc/doc/extend.texi @@ -58,6 +58,9 @@ extensions, accepted by GCC in C89 mode and in C++. * Character Escapes:: @samp{\e} stands for the character @key{ESC}. * Variable Attributes:: Specifying attributes of variables. * Type Attributes:: Specifying attributes of types. +@c APPLE LOCAL begin for-fsf-4_4 3274130 5295549 +* Label Attributes:: Specifying attributes of labels and statements. +@c APPLE LOCAL end for-fsf-4_4 3274130 5295549 * Alignment:: Inquiring about the alignment of a type or variable. * Inline:: Defining inline functions (as fast as macros). * Extended Asm:: Assembler instructions with C expressions as operands. @@ -1587,8 +1590,11 @@ attributes are currently defined for functions on all targets: @code{gnu_inline} and @code{externally_visible}. Several other attributes are defined for functions on particular target systems. Other attributes, including @code{section} are supported for variables declarations -(@pxref{Variable Attributes}) and for types (@pxref{Type Attributes}). +@c APPLE LOCAL begin for-fsf-4_4 3274130 5295549 +(@pxref{Variable Attributes}), for types (@pxref{Type Attributes}), +and labels (@pxref{Label Attributes}). +@c APPLE LOCAL end for-fsf-4_4 3274130 5295549 You may also specify attributes with @samp{__} preceding and following each keyword. This allows you to use them in header files without being concerned about a possible macro of the same name. For example, @@ -2640,10 +2646,14 @@ declarations only, but not on nested declarators. @xref{Function Attributes}, for details of the semantics of attributes applying to functions. @xref{Variable Attributes}, for details of the -semantics of attributes applying to variables. @xref{Type Attributes}, -for details of the semantics of attributes applying to structure, union -and enumerated types. - +@c APPLE LOCAL begin for-fsf-4_4 3274130 5295549 +semantics of attributes applying to variables. @xref{Type +Attributes}, for details of the semantics of attributes applying to +structure, union and enumerated types. @xref{Label Attributes}, for +details of the semantics of attributes applying to labels and +statements. + +@c APPLE LOCAL end for-fsf-4_4 3274130 5295549 An @dfn{attribute specifier} is of the form @code{__attribute__ ((@var{attribute-list}))}. An @dfn{attribute list} is a possibly empty comma-separated sequence of @dfn{attributes}, where @@ -2680,19 +2690,18 @@ with the list being a single string constant. An @dfn{attribute specifier list} is a sequence of one or more attribute specifiers, not separated by any other tokens. -In GNU C, an attribute specifier list may appear after the colon following a -label, other than a @code{case} or @code{default} label. The only -attribute it makes sense to use after a label is @code{unused}. This -feature is intended for code generated by programs which contains labels -that may be unused but which is compiled with @option{-Wall}. It would -not normally be appropriate to use in it human-written code, though it -could be useful in cases where the code that jumps to the label is -contained within an @code{#ifdef} conditional. GNU C++ does not permit -such placement of attribute lists, as it is permissible for a -declaration, which could begin with an attribute list, to be labelled in -C++. Declarations cannot be labelled in C90 or C99, so the ambiguity -does not arise there. +@c APPLE LOCAL begin for-fsf-4_4 3274130 5295549 +In GNU C, an attribute specifier list may appear after the colon +following a label, other than a @code{case} or @code{default} label. +GNU C++ does not permit such placement of attribute lists, as it is +permissible for a declaration, which could begin with an attribute +list, to be labelled in C++. Declarations cannot be labelled in C90 +or C99, so the ambiguity does not arise there. + +In GNU C an attribute specifier list may also appear after the keyword +@code{while} in a while loop, after @code{do} and after @code{for}. +@c APPLE LOCAL end for-fsf-4_4 3274130 5295549 An attribute specifier list may appear as part of a @code{struct}, @code{union} or @code{enum} specifier. It may go either immediately after the @code{struct}, @code{union} or @code{enum} keyword, or after @@ -2996,10 +3005,12 @@ by an attribute specification inside double parentheses. Some attributes are currently defined generically for variables. Other attributes are defined for variables on particular target systems. Other attributes are available for functions -(@pxref{Function Attributes}) and for types (@pxref{Type Attributes}). -Other front ends might define more attributes -(@pxref{C++ Extensions,,Extensions to the C++ Language}). +@c APPLE LOCAL begin for-fsf-4_4 3274130 5295549 +(@pxref{Function Attributes}), types (@pxref{Type Attributes}) and +labels (@pxref{Label Attributes}). Other front ends might define +more attributes (@pxref{C++ Extensions,,Extensions to the C++ Language}). +@c APPLE LOCAL end for-fsf-4_4 3274130 5295549 You may also specify attributes with @samp{__} preceding and following each keyword. This allows you to use them in header files without being concerned about a possible macro of the same name. For example, @@ -3496,9 +3507,11 @@ inside double parentheses. Seven attributes are currently defined for types: @code{aligned}, @code{packed}, @code{transparent_union}, @code{unused}, @code{deprecated}, @code{visibility}, and @code{may_alias}. Other attributes are defined for functions -(@pxref{Function Attributes}) and for variables (@pxref{Variable -Attributes}). +@c APPLE LOCAL begin for-fsf-4_4 3274130 5295549 +(@pxref{Function Attributes}), variables (@pxref{Variable +Attributes}), and labels (@pxref{Label Attributes}). +@c APPLE LOCAL end for-fsf-4_4 3274130 5295549 You may also specify any one of these attributes with @samp{__} preceding and following its keyword. This allows you to use these attributes in header files without being concerned about a possible @@ -3846,6 +3859,67 @@ __attribute__((altivec(bool__))) unsigned These attributes mainly are intended to support the @code{__vector}, @code{__pixel}, and @code{__bool} AltiVec keywords. +@c APPLE LOCAL begin for-fsf-4_4 3274130 5295549 +@node Label Attributes +@section Specifying Attributes of Labels and Statements +@cindex attribute of labels +@cindex label attributes +@cindex attribute of statements +@cindex statement attributes + +The keyword @code{__attribute__} allows you to specify special +attributes of labels and statements. + +Some attributes are currently defined generically for variables. +Other attributes are defined for variables on particular target +systems. Other attributes are available for functions +(@pxref{Function Attributes}), types (@pxref{Type Attributes}) and +variables (@pxref{Variable Attributes}). + +You may also specify attributes with @samp{__} preceding and following +each keyword. This allows you to use them in header files without +being concerned about a possible macro of the same name. For example, +you may use @code{__aligned__} instead of @code{aligned}. + +@xref{Attribute Syntax}, for details of the exact syntax for using +attributes. + +@table @code +@cindex @code{aligned} attribute +@item aligned (@var{alignment}) +This attribute specifies a minimum alignment for the label, +measured in bytes. For example, the declaration: + +@smallexample + some_label: __attribute__((aligned(16))) +@end smallexample + +@noindent +requests the compiler to align the label, inserting @code{nop}s as necessary, +to a 16-byte boundary. + +The alignment is only a request. The compiler will usually be able to +honour it but sometimes the label will be eliminated by the compiler, +in which case its alignment will be eliminated too. + +When applied to loops, the @code{aligned} attribute causes the loop to +be aligned. + +@item unused +When attached to a label this attribute means that the label might not +be used. GCC will not produce a warning for the label, even if the +label doesn't seem to be referenced. This feature is intended for +code generated by programs which contains labels that may be unused +but which is compiled with @option{-Wall}. It would not normally be +appropriate to use in it human-written code, though it could be useful +in cases where the code that jumps to the label is contained within an +@code{#ifdef} conditional. + +This attribute can only be applied to labels, not statements, because +there is no warning if a statement is removed. +@end table + +@c APPLE LOCAL end for-fsf-4_4 3274130 5295549 @node Inline @section An Inline Function is As Fast As a Macro @cindex inline functions diff --git a/contrib/gcc/dwarf2out.c b/contrib/gcc/dwarf2out.c index ad61de4..81fd022 100644 --- a/contrib/gcc/dwarf2out.c +++ b/contrib/gcc/dwarf2out.c @@ -2193,6 +2193,9 @@ output_call_frame_info (int for_eh) specialization doesn't. */ if (TARGET_USES_WEAK_UNWIND_INFO && ! flag_asynchronous_unwind_tables +/* APPLE LOCAL begin for-fsf-4_4 5480287 */ \ + && flag_exceptions +/* APPLE LOCAL end for-fsf-4_4 5480287 */ \ && for_eh) for (i = 0; i < fde_table_in_use; i++) if ((fde_table[i].nothrow || fde_table[i].all_throwers_are_sibcalls) diff --git a/contrib/gcc/emit-rtl.c b/contrib/gcc/emit-rtl.c index 73ce0b4..fea0c11 100644 --- a/contrib/gcc/emit-rtl.c +++ b/contrib/gcc/emit-rtl.c @@ -2062,7 +2062,9 @@ rtx gen_label_rtx (void) { return gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX, NULL_RTX, - NULL, label_num++, NULL); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + NULL, label_num++, NULL, 0); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } /* For procedure integration. */ diff --git a/contrib/gcc/final.c b/contrib/gcc/final.c index ef50ed9..90cad92 100644 --- a/contrib/gcc/final.c +++ b/contrib/gcc/final.c @@ -343,15 +343,13 @@ int insn_current_align; for each insn we'll call the alignment chain of this insn in the following comments. */ -struct label_alignment -{ - short alignment; - short max_skip; -}; - +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ static rtx *uid_align; static int *uid_shuid; -static struct label_alignment *label_align; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* Indicate that branch shortening hasn't yet been done. */ @@ -555,20 +553,16 @@ final_addr_vec_align (rtx addr_vec) #define INSN_SHUID(INSN) (uid_shuid[INSN_UID (INSN)]) -static int min_labelno, max_labelno; - -#define LABEL_TO_ALIGNMENT(LABEL) \ - (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].alignment) - -#define LABEL_TO_MAX_SKIP(LABEL) \ - (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].max_skip) - +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* For the benefit of port specific code do this also as a function. */ int label_to_alignment (rtx label) { - return LABEL_TO_ALIGNMENT (label); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + return LABEL_ALIGN_LOG (label); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } #ifdef HAVE_ATTR_length @@ -617,7 +611,9 @@ align_fuzz (rtx start, rtx end, int known_align_log, unsigned int growth) align_addr = INSN_ADDRESSES (uid) - insn_lengths[uid]; if (uid_shuid[uid] > end_shuid) break; - known_align_log = LABEL_TO_ALIGNMENT (align_label); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + known_align_log = LABEL_ALIGN_LOG (align_label); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ new_align = 1 << known_align_log; if (new_align < known_align) continue; @@ -682,18 +678,12 @@ insn_current_reference_address (rtx branch) static unsigned int compute_alignments (void) { - int log, max_skip, max_log; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ basic_block bb; - if (label_align) - { - free (label_align); - label_align = 0; - } - - max_labelno = max_label_num (); - min_labelno = get_first_label_num (); - label_align = XCNEWVEC (struct label_alignment, max_labelno - min_labelno + 1); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* If not optimizing or optimizing for size, don't assign any alignments. */ if (! optimize || optimize_size) @@ -705,10 +695,19 @@ compute_alignments (void) int fallthru_frequency = 0, branch_frequency = 0, has_fallthru = 0; edge e; edge_iterator ei; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + int log, max_skip, max_log; +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ if (!LABEL_P (label) || probably_never_executed_bb_p (bb)) continue; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + /* If user has specified an alignment, honour it. */ + if (LABEL_ALIGN_LOG (label) > 0) + continue; + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ max_log = LABEL_ALIGN (label); max_skip = LABEL_ALIGN_MAX_SKIP; @@ -757,8 +756,9 @@ compute_alignments (void) max_skip = LOOP_ALIGN_MAX_SKIP; } } - LABEL_TO_ALIGNMENT (label) = max_log; - LABEL_TO_MAX_SKIP (label) = max_skip; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + SET_LABEL_ALIGN (label, max_log, max_skip); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } return 0; } @@ -811,7 +811,9 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) #endif - /* Compute maximum UID and allocate label_align / uid_shuid. */ +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + /* Compute maximum UID and allocate uid_shuid. */ +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ max_uid = get_max_uid (); /* Free uid_shuid before reallocating it. */ @@ -819,29 +821,8 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) uid_shuid = XNEWVEC (int, max_uid); - if (max_labelno != max_label_num ()) - { - int old = max_labelno; - int n_labels; - int n_old_labels; - - max_labelno = max_label_num (); - - n_labels = max_labelno - min_labelno + 1; - n_old_labels = old - min_labelno + 1; - - label_align = xrealloc (label_align, - n_labels * sizeof (struct label_alignment)); - - /* Range of labels grows monotonically in the function. Failing here - means that the initialization of array got lost. */ - gcc_assert (n_old_labels <= n_labels); - - memset (label_align + n_old_labels, 0, - (n_labels - n_old_labels) * sizeof (struct label_alignment)); - } - - /* Initialize label_align and set up uid_shuid to be strictly + /* APPLE LOCAL for-fsf-4_4 3274130 5295549 */ \ + /* Initialize set up uid_shuid to be strictly monotonically rising with insn order. */ /* We use max_log here to keep track of the maximum alignment we want to impose on the next CODE_LABEL (or the current one if we are processing @@ -863,11 +844,15 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) rtx next; /* Merge in alignments computed by compute_alignments. */ - log = LABEL_TO_ALIGNMENT (insn); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + log = LABEL_ALIGN_LOG (insn); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ if (max_log < log) { max_log = log; - max_skip = LABEL_TO_MAX_SKIP (insn); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + max_skip = LABEL_MAX_SKIP (insn); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } log = LABEL_ALIGN (insn); @@ -895,8 +880,9 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) } } } - LABEL_TO_ALIGNMENT (insn) = max_log; - LABEL_TO_MAX_SKIP (insn) = max_skip; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + SET_LABEL_ALIGN (insn, max_log, max_skip); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ max_log = 0; max_skip = 0; } @@ -943,7 +929,9 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) { int uid = INSN_UID (seq); int log; - log = (LABEL_P (seq) ? LABEL_TO_ALIGNMENT (seq) : 0); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + log = (LABEL_P (seq) ? LABEL_ALIGN_LOG (seq) : 0); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ uid_align[uid] = align_tab[0]; if (log) { @@ -991,8 +979,10 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) max = shuid; max_lab = lab; } - if (min_align > LABEL_TO_ALIGNMENT (lab)) - min_align = LABEL_TO_ALIGNMENT (lab); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + if (min_align > (int) LABEL_ALIGN_LOG (lab)) + min_align = LABEL_ALIGN_LOG (lab); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } XEXP (pat, 2) = gen_rtx_LABEL_REF (Pmode, min_lab); XEXP (pat, 3) = gen_rtx_LABEL_REF (Pmode, max_lab); @@ -1021,7 +1011,9 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) if (LABEL_P (insn)) { - int log = LABEL_TO_ALIGNMENT (insn); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + int log = LABEL_ALIGN_LOG (insn); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ if (log) { int align = 1 << log; @@ -1127,7 +1119,9 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) if (LABEL_P (insn)) { - int log = LABEL_TO_ALIGNMENT (insn); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + int log = LABEL_ALIGN_LOG (insn); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ if (log > insn_current_align) { int align = 1 << log; @@ -1176,7 +1170,9 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) prev = PREV_INSN (prev)) if (varying_length[INSN_UID (prev)] & 2) { - rel_align = LABEL_TO_ALIGNMENT (prev); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + rel_align = LABEL_ALIGN_LOG (prev); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ break; } @@ -1848,26 +1844,27 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED, case CODE_LABEL: /* The target port might emit labels in the output function for some insn, e.g. sh.c output_branchy_insn. */ - if (CODE_LABEL_NUMBER (insn) <= max_labelno) - { - int align = LABEL_TO_ALIGNMENT (insn); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + { + int align = LABEL_ALIGN_LOG (insn); #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN - int max_skip = LABEL_TO_MAX_SKIP (insn); + int max_skip = LABEL_MAX_SKIP (insn); #endif - - if (align && NEXT_INSN (insn)) - { + + if (align && NEXT_INSN (insn)) + { #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN - ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip); + ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip); #else #ifdef ASM_OUTPUT_ALIGN_WITH_NOP - ASM_OUTPUT_ALIGN_WITH_NOP (file, align); + ASM_OUTPUT_ALIGN_WITH_NOP (file, align); #else - ASM_OUTPUT_ALIGN (file, align); + ASM_OUTPUT_ALIGN (file, align); #endif #endif - } - } + } + } +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ #ifdef HAVE_cc0 CC_STATUS_INIT; /* If this label is reached from only one place, set the condition diff --git a/contrib/gcc/print-rtl.c b/contrib/gcc/print-rtl.c index a9c1a93..12f7425 100644 --- a/contrib/gcc/print-rtl.c +++ b/contrib/gcc/print-rtl.c @@ -606,6 +606,11 @@ print_rtx (rtx in_rtx) case LABEL_WEAK_ENTRY: fputs (" [weak entry]", outfile); break; default: gcc_unreachable (); } +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + if (LABEL_ALIGN_LOG (in_rtx) > 0) + fprintf (outfile, " [log_align %u skip %u]", LABEL_ALIGN_LOG (in_rtx), + LABEL_MAX_SKIP (in_rtx)); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ break; default: diff --git a/contrib/gcc/print-tree.c b/contrib/gcc/print-tree.c index ef87ab6..1c480f9 100644 --- a/contrib/gcc/print-tree.c +++ b/contrib/gcc/print-tree.c @@ -302,6 +302,10 @@ print_node (FILE *file, const char *prefix, tree node, int indent) fputs (" static", file); if (TREE_DEPRECATED (node)) fputs (" deprecated", file); + /* APPLE LOCAL begin "unavailable" attribute (Radar 2809697) */ + if (TREE_UNAVAILABLE (node)) + fputs (" unavailable", file); + /* APPLE LOCAL end "unavailable" attribute (Radar 2809697) */ if (TREE_VISITED (node)) fputs (" visited", file); if (TREE_LANG_FLAG_0 (node)) diff --git a/contrib/gcc/rtl.def b/contrib/gcc/rtl.def index cb37f1a..f606443 100644 --- a/contrib/gcc/rtl.def +++ b/contrib/gcc/rtl.def @@ -139,9 +139,13 @@ DEF_RTL_EXPR(BARRIER, "barrier", "iuu000000", RTX_EXTRA) 4: is used in jump.c for the use-count of the label. 5: is used in flow.c to point to the chain of label_ref's to this label. 6: is a number that is unique in the entire compilation. - 7: is the user-given name of the label, if any. */ -DEF_RTL_EXPR(CODE_LABEL, "code_label", "iuuB00is", RTX_EXTRA) + APPLE LOCAL begin for-fsf-4_4 3274130 5295549 + 7: is the user-given name of the label, if any. + 8: is the alignment of the label, made up of two parts, + LABEL_ALIGNMENT and LABEL_MAX_SKIP. */ +DEF_RTL_EXPR(CODE_LABEL, "code_label", "iuuB00isi", RTX_EXTRA) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ #ifdef USE_MAPPED_LOCATION /* Say where in the code a source line starts, for symbol table's sake. Operand: diff --git a/contrib/gcc/rtl.h b/contrib/gcc/rtl.h index 57de516..b92d53c 100644 --- a/contrib/gcc/rtl.h +++ b/contrib/gcc/rtl.h @@ -908,6 +908,15 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS]; of LABEL_REFs that point at it, so unused labels can be deleted. */ #define LABEL_NUSES(RTX) XCINT (RTX, 4, CODE_LABEL) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ +/* The alignment of the label, as the log-base-2 of the alignment in bytes. */ +#define LABEL_ALIGN_LOG(RTX) (XCUINT (RTX, 8, CODE_LABEL) & 0xFF) +/* The maximum number of bytes to skip to achieve that alignment. */ +#define LABEL_MAX_SKIP(RTX) (XCUINT (RTX, 8, CODE_LABEL) >> 8) +#define SET_LABEL_ALIGN(RTX, ALIGN, MAX_SKIP) \ + (XCUINT (RTX, 8, CODE_LABEL) = (ALIGN) | ((MAX_SKIP) << 8)) + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ /* Labels carry a two-bit field composed of the ->jump and ->call bits. This field indicates whether the label is an alternate entry point, and if so, what kind. */ diff --git a/contrib/gcc/stmt.c b/contrib/gcc/stmt.c index 671e98a..279691b 100644 --- a/contrib/gcc/stmt.c +++ b/contrib/gcc/stmt.c @@ -136,9 +136,19 @@ label_rtx (tree label) if (!DECL_RTL_SET_P (label)) { rtx r = gen_label_rtx (); +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + unsigned align = DECL_ALIGN_UNIT (label); + int align_log2 = exact_log2 (align); + +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ SET_DECL_RTL (label, r); if (FORCED_LABEL (label) || DECL_NONLOCAL (label)) LABEL_PRESERVE_P (r) = 1; +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + + if (align_log2 >= 0 && align_log2 <= 0xFF) + SET_LABEL_ALIGN (r, align_log2, align - 1); +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ } return DECL_RTL (label); @@ -194,11 +204,12 @@ expand_computed_goto (tree exp) /* Specify the location in the RTL code of a label LABEL, which is a LABEL_DECL tree node. - This is used for the kind of label that the user can jump to with a - goto statement, and for alternatives of a switch or case statement. - RTL labels generated for loops and conditionals don't go through here; - they are generated directly at the RTL level, by other functions below. + APPLE LOCAL begin for-fsf-4_4 3274130 5295549 + This is used for those labels created by the front-end that survive + through CFG generation, including all user labels. (Some labels + are removed by cleanup_dead_labels in tree-cfg.c.) + APPLE LOCAL end for-fsf-4_4 3274130 5295549 Note that this has nothing to do with defining label *names*. Languages vary in how they do that and what that even means. */ diff --git a/contrib/gcc/toplev.c b/contrib/gcc/toplev.c index ab6a7ff..786ec12 100644 --- a/contrib/gcc/toplev.c +++ b/contrib/gcc/toplev.c @@ -946,6 +946,46 @@ warn_deprecated_use (tree node) } } +/* APPLE LOCAL begin "unavailable" attribute (radar 2809697) --ilr */ +/* Warn about a use of an identifier which was marked deprecated. */ +void +error_unavailable_use (tree node) +{ + if (node == 0) + return; + + if (DECL_P (node)) + error ("%qs is unavailable (declared at %s:%d)", + IDENTIFIER_POINTER (DECL_NAME (node)), + DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node)); + else if (TYPE_P (node)) + { + const char *what = NULL; + tree decl = TYPE_STUB_DECL (node); + + if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) + what = IDENTIFIER_POINTER (TYPE_NAME (node)); + else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL + && DECL_NAME (TYPE_NAME (node))) + what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))); + + if (what) + { + if (decl) + error ("%qs is unavailable (declared at %s:%d)", what, + DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl)); + else + error ("%qs is unavailable", what); + } + else if (decl) + error ("type is unavailable (declared at %s:%d)", + DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl)); + else + error ("type is unavailable"); + } +} +/* APPLE LOCAL end "unavailable" attribute (radar 2809697) --ilr */ + /* Save the current INPUT_LOCATION on the top entry in the INPUT_FILE_STACK. Push a new entry for FILE and LINE, and set the INPUT_LOCATION accordingly. */ diff --git a/contrib/gcc/toplev.h b/contrib/gcc/toplev.h index c935f7e..3b07441 100644 --- a/contrib/gcc/toplev.h +++ b/contrib/gcc/toplev.h @@ -79,6 +79,8 @@ extern void announce_function (tree); extern void error_for_asm (rtx, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3); extern void warning_for_asm (rtx, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3); extern void warn_deprecated_use (tree); +/* APPLE LOCAL "unavailable" attribute (radar 2809697) */ +extern void error_unavailable_use (tree); #ifdef BUFSIZ extern void output_quoted_string (FILE *, const char *); diff --git a/contrib/gcc/tree-cfg.c b/contrib/gcc/tree-cfg.c index 7573439..60c474b 100644 --- a/contrib/gcc/tree-cfg.c +++ b/contrib/gcc/tree-cfg.c @@ -1051,9 +1051,12 @@ cleanup_dead_labels (void) for_each_eh_region (update_eh_label); - /* Finally, purge dead labels. All user-defined labels and labels that - can be the target of non-local gotos and labels which have their - address taken are preserved. */ +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + /* Finally, purge dead labels. All user-defined labels, labels that + can be the target of non-local gotos, labels which have their + address taken and labels which have attributes or alignment are + preserved. */ +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ FOR_EACH_BB (bb) { block_stmt_iterator i; @@ -1073,6 +1076,10 @@ cleanup_dead_labels (void) if (label == label_for_this_bb || ! DECL_ARTIFICIAL (label) +/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ + || DECL_ATTRIBUTES (label) + || DECL_USER_ALIGN (label) +/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ || DECL_NONLOCAL (label) || FORCED_LABEL (label)) bsi_next (&i); diff --git a/contrib/gcc/tree.h b/contrib/gcc/tree.h index 6cfc3d3..e8870f0 100644 --- a/contrib/gcc/tree.h +++ b/contrib/gcc/tree.h @@ -386,6 +386,8 @@ struct tree_common GTY(()) unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; unsigned visited : 1; + /* APPLE LOCAL "unavailable" attribute (Radar 2809697) --ilr */ + unsigned unavailable_flag : 1; }; /* The following table lists the uses of each of the above flags and @@ -533,6 +535,13 @@ struct tree_common GTY(()) IDENTIFIER_TRANSPARENT_ALIAS in IDENTIFIER_NODE + APPLE LOCAL begin "unavailable" attribute (Radar 2809697) + unavailable_flag: + + TREE_UNAVAILABLE in + ..._DECL + APPLE LOCAL end "unavailable" attribute (Radar 2809697) + visited: Used in tree traversals to mark visited nodes. @@ -1226,6 +1235,12 @@ extern void omp_clause_range_check_failed (const tree, const char *, int, #define TREE_DEPRECATED(NODE) \ ((NODE)->common.deprecated_flag) +/* APPLE LOCAL begin "unavailable" attribute (Radar 2809697) */ +/* Nonzero in a IDENTIFIER_NODE if the use of the name is defined as a + unavailable feature by __attribute__((unavailable)). */ +#define TREE_UNAVAILABLE(NODE) ((NODE)->common.unavailable_flag) +/* APPLE LOCAL end "unavailable" attribute (Radar 2809697) */ + /* Nonzero in an IDENTIFIER_NODE if the name is a local alias, whose uses are to be substituted for uses of the TREE_CHAINed identifier. */ #define IDENTIFIER_TRANSPARENT_ALIAS(NODE) \ |