On Tue, Apr 28, 2015 at 3:48 AM, Heiko Carstens <heiko.carstens@xxxxxxxxxx> wrote: > gcc knows about a new "hotpatch" attribute which sparse can safely ignore, > since it modifies only which code will be generated just like the > "no_instrument_function" attribute. I'm wondering if sparse should just ignore all attributes it doesn't recognize, so that we could just remove this ever-expanding list of things that don't actually matter for sparse.. The "unrecognized attribute" thing made more sense way back when - when I wanted to get he basic attributes handled. Now it's just noise... Something like the attached (mostly untested) patch.. Linus
parse.c | 112 ---------------------------------------------------------------- 1 file changed, 112 deletions(-) diff --git a/parse.c b/parse.c index b43d6835528b..bab0a8e2e931 100644 --- a/parse.c +++ b/parse.c @@ -501,109 +501,6 @@ static struct init_keyword { { "__word__", NS_KEYWORD, MOD_LONG, .op = &mode_word_op }, }; -const char *ignored_attributes[] = { - "alias", - "__alias__", - "alloc_size", - "__alloc_size__", - "always_inline", - "__always_inline__", - "artificial", - "__artificial__", - "bounded", - "__bounded__", - "cdecl", - "__cdecl__", - "cold", - "__cold__", - "constructor", - "__constructor__", - "deprecated", - "__deprecated__", - "destructor", - "__destructor__", - "dllexport", - "__dllexport__", - "dllimport", - "__dllimport__", - "error", - "__error__", - "externally_visible", - "__externally_visible__", - "fastcall", - "__fastcall__", - "format", - "__format__", - "format_arg", - "__format_arg__", - "gnu_inline", - "__gnu_inline__", - "hot", - "__hot__", - "leaf", - "__leaf__", - "l1_text", - "__l1_text__", - "l1_data", - "__l1_data__", - "l2", - "__l2__", - "malloc", - "__malloc__", - "may_alias", - "__may_alias__", - "model", - "__model__", - "ms_abi", - "__ms_abi__", - "ms_hook_prologue", - "__ms_hook_prologue__", - "naked", - "__naked__", - "no_instrument_function", - "__no_instrument_function__", - "noclone", - "__noclone", - "__noclone__", - "noinline", - "__noinline__", - "nonnull", - "__nonnull", - "__nonnull__", - "nothrow", - "__nothrow", - "__nothrow__", - "regparm", - "__regparm__", - "section", - "__section__", - "sentinel", - "__sentinel__", - "signal", - "__signal__", - "stdcall", - "__stdcall__", - "syscall_linkage", - "__syscall_linkage__", - "sysv_abi", - "__sysv_abi__", - "unused", - "__unused__", - "used", - "__used__", - "vector_size", - "__vector_size__", - "visibility", - "__visibility__", - "warn_unused_result", - "__warn_unused_result__", - "warning", - "__warning__", - "weak", - "__weak__", -}; - - void init_parser(int stream) { int i; @@ -617,14 +514,6 @@ void init_parser(int stream) sym->ctype.base_type = ptr->type; sym->op = ptr->op; } - - for (i = 0; i < ARRAY_SIZE(ignored_attributes); i++) { - const char * name = ignored_attributes[i]; - struct symbol *sym = create_symbol(stream, name, SYM_KEYWORD, - NS_KEYWORD); - sym->ident->keyword = 1; - sym->op = &ignore_attr_op; - } } @@ -1222,7 +1111,6 @@ static struct token *recover_unknown_attribute(struct token *token) { struct expression *expr = NULL; - sparse_error(token->pos, "attribute '%s': unknown attribute", show_ident(token->ident)); token = token->next; if (match_op(token, '(')) token = parens_expression(token, &expr, "in attribute");