From 3c083484a3594f3c4e72fc06c001418a67dfe71a Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Mon, 2 Jan 2006 22:20:21 +0300 Subject: [PATCH] implement #strong_define Example #strong_define FOO 1 #undef FOO // silently ignored #define FOO 2 // silently ignored This allows (for example) to override CONFIG_XXX values without editing include/linux/autoconf.h I think this is useful. If you think differently, I will appreciate your comments on this patch correctness. Signed-off-by: Oleg Nesterov --- pre-process.c | 28 +++++++++++++++++----------- symbol.h | 7 ++++--- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/pre-process.c b/pre-process.c index 604b101a..0fb7831d 100644 --- a/pre-process.c +++ b/pre-process.c @@ -1092,7 +1092,7 @@ static int do_handle_define(struct stream *stream, struct token **line, struct t if (sym) { int clean; - if (attr > sym->attr) + if (attr < sym->attr) goto out; clean = (attr == sym->attr); @@ -1138,6 +1138,11 @@ static int handle_weak_define(struct stream *stream, struct token **line, struct return do_handle_define(stream, line, token, SYM_ATTR_WEAK); } +static int handle_strong_define(struct stream *stream, struct token **line, struct token *token) +{ + return do_handle_define(stream, line, token, SYM_ATTR_STRONG); +} + static int handle_undef(struct stream *stream, struct token **line, struct token *token) { struct token *left = token->next; @@ -1149,7 +1154,7 @@ static int handle_undef(struct stream *stream, struct token **line, struct token } sym = lookup_macro(left->ident); - if (!sym) + if (!sym || sym->attr > SYM_ATTR_NORMAL) return 1; if (sym->scope != file_scope) { @@ -1569,15 +1574,16 @@ static void init_preprocessor(void) const char *name; int (*handler)(struct stream *, struct token **, struct token *); } normal[] = { - { "define", handle_define }, - { "weak_define",handle_weak_define }, - { "undef", handle_undef }, - { "warning", handle_warning }, - { "error", handle_error }, - { "include", handle_include }, - { "include_next",handle_include_next }, - { "pragma", handle_pragma }, - { "line", handle_line }, + { "define", handle_define }, + { "weak_define", handle_weak_define }, + { "strong_define", handle_strong_define }, + { "undef", handle_undef }, + { "warning", handle_warning }, + { "error", handle_error }, + { "include", handle_include }, + { "include_next", handle_include_next }, + { "pragma", handle_pragma }, + { "line", handle_line }, // our internal preprocessor tokens { "nostdinc", handle_nostdinc }, diff --git a/symbol.h b/symbol.h index 0803710d..91cc06ac 100644 --- a/symbol.h +++ b/symbol.h @@ -82,13 +82,14 @@ struct symbol_op { extern int expand_safe_p(struct expression *expr, int cost); extern int expand_constant_p(struct expression *expr, int cost); -#define SYM_ATTR_WEAK 1 -#define SYM_ATTR_NORMAL 0 +#define SYM_ATTR_WEAK 0 +#define SYM_ATTR_NORMAL 1 +#define SYM_ATTR_STRONG 2 struct symbol { enum namespace namespace:8; enum type type:8; - unsigned char used:1, attr:1; + unsigned char used:1, attr:2; struct position pos; /* Where this symbol was declared */ struct ident *ident; /* What identifier this symbol is associated with */ struct symbol *next_id; /* Next semantic symbol that shares this identifier */ -- 2.11.4.GIT