aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Li <sparse@chrisli.org>2009-09-29 16:17:23 -0700
committerChristopher <sparse@chrisli.org>2010-03-28 17:51:36 -0700
commit9aeae9479b0f7b2d96c722a50ba76b43870d6c1c (patch)
tree48ba0fad05123779e9ae026dbdbbf1924ceba752
parentMove noreturn attribute out of ignore attr area (diff)
downloadsparse-9aeae9479b0f7b2d96c722a50ba76b43870d6c1c.tar.gz
sparse-9aeae9479b0f7b2d96c722a50ba76b43870d6c1c.tar.bz2
sparse-9aeae9479b0f7b2d96c722a50ba76b43870d6c1c.zip
Declare ignored attributres into a list of string.
Adding ignored attributes is much easier now. Signed-off-by: Christopher Li <sparse@chrisli.org>
-rw-r--r--lib.h4
-rw-r--r--parse.c153
2 files changed, 86 insertions, 71 deletions
diff --git a/lib.h b/lib.h
index 25abb80..e19973f 100644
--- a/lib.h
+++ b/lib.h
@@ -20,6 +20,10 @@
#define DO_STRINGIFY(x) #x
#define STRINGIFY(x) DO_STRINGIFY(x)
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
+#endif
+
extern int verbose, optimize, optimize_size, preprocessing;
extern int die_if_error;
extern int repeat_phase, merge_phi_sources;
diff --git a/parse.c b/parse.c
index b3bf15d..34fa562 100644
--- a/parse.c
+++ b/parse.c
@@ -470,83 +470,85 @@ static struct init_keyword {
{ "__TI__", NS_KEYWORD, MOD_LONGLONGLONG, .op = &mode_TI_op },
{ "word", NS_KEYWORD, MOD_LONG, .op = &mode_word_op },
{ "__word__", NS_KEYWORD, MOD_LONG, .op = &mode_word_op },
+};
- /* Ignored attributes */
- { "nothrow", NS_KEYWORD, .op = &ignore_attr_op },
- { "__nothrow", NS_KEYWORD, .op = &ignore_attr_op },
- { "__nothrow__", NS_KEYWORD, .op = &ignore_attr_op },
- { "malloc", NS_KEYWORD, .op = &ignore_attr_op },
- { "__malloc__", NS_KEYWORD, .op = &ignore_attr_op },
- { "nonnull", NS_KEYWORD, .op = &ignore_attr_op },
- { "__nonnull", NS_KEYWORD, .op = &ignore_attr_op },
- { "__nonnull__", NS_KEYWORD, .op = &ignore_attr_op },
- { "format", NS_KEYWORD, .op = &ignore_attr_op },
- { "__format__", NS_KEYWORD, .op = &ignore_attr_op },
- { "format_arg", NS_KEYWORD, .op = &ignore_attr_op },
- { "__format_arg__", NS_KEYWORD, .op = &ignore_attr_op },
- { "section", NS_KEYWORD, .op = &ignore_attr_op },
- { "__section__",NS_KEYWORD, .op = &ignore_attr_op },
- { "unused", NS_KEYWORD, .op = &ignore_attr_op },
- { "__unused__", NS_KEYWORD, .op = &ignore_attr_op },
- { "const", NS_KEYWORD, .op = &ignore_attr_op },
- { "__const", NS_KEYWORD, .op = &ignore_attr_op },
- { "__const__", NS_KEYWORD, .op = &ignore_attr_op },
- { "no_instrument_function", NS_KEYWORD, .op = &ignore_attr_op },
- { "__no_instrument_function__", NS_KEYWORD, .op = &ignore_attr_op },
- { "sentinel", NS_KEYWORD, .op = &ignore_attr_op },
- { "__sentinel__", NS_KEYWORD, .op = &ignore_attr_op },
- { "regparm", NS_KEYWORD, .op = &ignore_attr_op },
- { "__regparm__", NS_KEYWORD, .op = &ignore_attr_op },
- { "weak", NS_KEYWORD, .op = &ignore_attr_op },
- { "__weak__", NS_KEYWORD, .op = &ignore_attr_op },
- { "alias", NS_KEYWORD, .op = &ignore_attr_op },
- { "__alias__", NS_KEYWORD, .op = &ignore_attr_op },
- { "pure", NS_KEYWORD, .op = &ignore_attr_op },
- { "__pure__", NS_KEYWORD, .op = &ignore_attr_op },
- { "always_inline", NS_KEYWORD, .op = &ignore_attr_op },
- { "__always_inline__", NS_KEYWORD, .op = &ignore_attr_op },
- { "syscall_linkage", NS_KEYWORD, .op = &ignore_attr_op },
- { "__syscall_linkage__", NS_KEYWORD, .op = &ignore_attr_op },
- { "visibility", NS_KEYWORD, .op = &ignore_attr_op },
- { "__visibility__", NS_KEYWORD, .op = &ignore_attr_op },
- { "deprecated", NS_KEYWORD, .op = &ignore_attr_op },
- { "__deprecated__", NS_KEYWORD, .op = &ignore_attr_op },
- { "noinline", NS_KEYWORD, .op = &ignore_attr_op },
- { "__noinline__", NS_KEYWORD, .op = &ignore_attr_op },
- { "used", NS_KEYWORD, .op = &ignore_attr_op },
- { "__used__", NS_KEYWORD, .op = &ignore_attr_op },
- { "warn_unused_result", NS_KEYWORD, .op = &ignore_attr_op },
- { "__warn_unused_result__", NS_KEYWORD, .op = &ignore_attr_op },
- { "model", NS_KEYWORD, .op = &ignore_attr_op },
- { "__model__", NS_KEYWORD, .op = &ignore_attr_op },
- { "cdecl", NS_KEYWORD, .op = &ignore_attr_op },
- { "__cdecl__", NS_KEYWORD, .op = &ignore_attr_op },
- { "stdcall", NS_KEYWORD, .op = &ignore_attr_op },
- { "__stdcall__", NS_KEYWORD, .op = &ignore_attr_op },
- { "fastcall", NS_KEYWORD, .op = &ignore_attr_op },
- { "__fastcall__", NS_KEYWORD, .op = &ignore_attr_op },
- { "dllimport", NS_KEYWORD, .op = &ignore_attr_op },
- { "__dllimport__", NS_KEYWORD, .op = &ignore_attr_op },
- { "dllexport", NS_KEYWORD, .op = &ignore_attr_op },
- { "__dllexport__", NS_KEYWORD, .op = &ignore_attr_op },
- { "constructor", NS_KEYWORD, .op = &ignore_attr_op },
- { "__constructor__", NS_KEYWORD, .op = &ignore_attr_op },
- { "destructor", NS_KEYWORD, .op = &ignore_attr_op },
- { "__destructor__", NS_KEYWORD, .op = &ignore_attr_op },
- { "cold", NS_KEYWORD, .op = &ignore_attr_op },
- { "__cold__", NS_KEYWORD, .op = &ignore_attr_op },
- { "hot", NS_KEYWORD, .op = &ignore_attr_op },
- { "__hot__", NS_KEYWORD, .op = &ignore_attr_op },
- { "warning", NS_KEYWORD, .op = &ignore_attr_op },
- { "__warning__", NS_KEYWORD, .op = &ignore_attr_op },
- { "bounded", NS_KEYWORD, .op = &ignore_attr_op },
- { "__bounded__", NS_KEYWORD, .op = &ignore_attr_op },
+const char *ignored_attributes[] = {
+ "alias",
+ "__alias__",
+ "always_inline",
+ "__always_inline__",
+ "bounded",
+ "__bounded__",
+ "cdecl",
+ "__cdecl__",
+ "cold",
+ "__cold__",
+ "const",
+ "__const",
+ "__const__",
+ "constructor",
+ "__constructor__",
+ "deprecated",
+ "__deprecated__",
+ "destructor",
+ "__destructor__",
+ "dllexport",
+ "__dllexport__",
+ "dllimport",
+ "__dllimport__",
+ "fastcall",
+ "__fastcall__",
+ "format",
+ "__format__",
+ "format_arg",
+ "__format_arg__",
+ "hot",
+ "__hot__",
+ "malloc",
+ "__malloc__",
+ "model",
+ "__model__",
+ "no_instrument_function",
+ "__no_instrument_function__",
+ "noinline",
+ "__noinline__",
+ "nonnull",
+ "__nonnull",
+ "__nonnull__",
+ "nothrow",
+ "__nothrow",
+ "__nothrow__",
+ "pure",
+ "__pure__",
+ "regparm",
+ "__regparm__",
+ "section",
+ "__section__",
+ "sentinel",
+ "__sentinel__",
+ "stdcall",
+ "__stdcall__",
+ "syscall_linkage",
+ "__syscall_linkage__",
+ "unused",
+ "__unused__",
+ "used",
+ "__used__",
+ "visibility",
+ "__visibility__",
+ "warn_unused_result",
+ "__warn_unused_result__",
+ "warning",
+ "__warning__",
+ "weak",
+ "__weak__",
};
+
void init_parser(int stream)
{
int i;
- for (i = 0; i < sizeof keyword_table/sizeof keyword_table[0]; i++) {
+ for (i = 0; i < ARRAY_SIZE(keyword_table); i++) {
struct init_keyword *ptr = keyword_table + i;
struct symbol *sym = create_symbol(stream, ptr->name, SYM_KEYWORD, ptr->ns);
sym->ident->keyword = 1;
@@ -556,8 +558,17 @@ 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;
+ }
}
+
// Add a symbol to the list of function-local symbols
static void fn_local_symbol(struct symbol *sym)
{