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
This commit is contained in:
Pedro F. Giffuni 2013-12-28 20:30:31 +00:00
parent 5156701b30
commit 2d278bb89e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=260014
29 changed files with 749 additions and 157 deletions

View file

@ -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.

View file

@ -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. */

View file

@ -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))
{

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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. */

View file

@ -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)

View file

@ -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);

View file

@ -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)

View file

@ -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:

View file

@ -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)),

View file

@ -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. */

View file

@ -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));

View file

@ -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)
/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \
begin_do_stmt (tree attribs)
/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \
{
tree r = build_stmt (DO_STMT, NULL_TREE, NULL_TREE);
/* 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);

View file

@ -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

View file

@ -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)

View file

@ -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. */

View file

@ -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

View file

@ -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:

View file

@ -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))

View file

@ -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:

View file

@ -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. */

View file

@ -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. */

View file

@ -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. */

View file

@ -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 *);

View file

@ -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);

View file

@ -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) \