|
|
|
[PATCH 3/5] sparse: Fix __builtin_safe_p for pure and const functions | |
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] | |
This patch fixes __builtin_safe_p() to work properly for calls to pure
functions.
Cc: Christopher Li <sparse@xxxxxxxxxxx>
Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Pekka Enberg <penberg@xxxxxxxxxx>
---
expand.c | 3 +++
parse.c | 10 +++++-----
show-parse.c | 1 +
symbol.h | 1 +
validation/builtin_safe1.c | 1 -
5 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/expand.c b/expand.c
index b965dc3..91e14f3 100644
--- a/expand.c
+++ b/expand.c
@@ -785,6 +785,9 @@ static int expand_symbol_call(struct expression *expr, int cost)
struct expression *fn = expr->fn;
struct symbol *ctype = fn->ctype;
+ if (ctype->ctype.modifiers & MOD_PURE)
+ return 0;
+
if (fn->type != EXPR_PREOP)
return SIDE_EFFECTS;
diff --git a/parse.c b/parse.c
index 082c2c4..6d8678e 100644
--- a/parse.c
+++ b/parse.c
@@ -463,6 +463,11 @@ static struct init_keyword {
{ "__transparent_union__", NS_KEYWORD, .op = &transparent_union_op },
{ "noreturn", NS_KEYWORD, MOD_NORETURN, .op = &attr_mod_op },
{ "__noreturn__", NS_KEYWORD, MOD_NORETURN, .op = &attr_mod_op },
+ { "pure", NS_KEYWORD, MOD_PURE, .op = &attr_mod_op },
+ {"__pure__", NS_KEYWORD, MOD_PURE, .op = &attr_mod_op },
+ {"const", NS_KEYWORD, MOD_PURE, .op = &attr_mod_op },
+ {"__const", NS_KEYWORD, MOD_PURE, .op = &attr_mod_op },
+ {"__const__", NS_KEYWORD, MOD_PURE, .op = &attr_mod_op },
{ "__mode__", NS_KEYWORD, .op = &mode_op },
{ "QI", NS_KEYWORD, MOD_CHAR, .op = &mode_QI_op },
@@ -494,9 +499,6 @@ const char *ignored_attributes[] = {
"__cdecl__",
"cold",
"__cold__",
- "const",
- "__const",
- "__const__",
"constructor",
"__constructor__",
"deprecated",
@@ -545,8 +547,6 @@ const char *ignored_attributes[] = {
"nothrow",
"__nothrow",
"__nothrow__",
- "pure",
- "__pure__",
"regparm",
"__regparm__",
"section",
diff --git a/show-parse.c b/show-parse.c
index a5beafe..1333e30 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -131,6 +131,7 @@ const char *modifier_string(unsigned long mod)
{MOD_NORETURN, "[noreturn]"},
{MOD_EXPLICITLY_SIGNED, "[explicitly-signed]"},
{MOD_BITWISE, "[bitwise]"},
+ {MOD_PURE, "[pure]"},
};
for (i = 0; i < ARRAY_SIZE(mod_names); i++) {
diff --git a/symbol.h b/symbol.h
index 2b8f20e..1e74579 100644
--- a/symbol.h
+++ b/symbol.h
@@ -198,6 +198,7 @@ struct symbol {
#define MOD_LONG 0x0400
#define MOD_LONGLONG 0x0800
#define MOD_LONGLONGLONG 0x1000
+#define MOD_PURE 0x2000
#define MOD_TYPEDEF 0x10000
diff --git a/validation/builtin_safe1.c b/validation/builtin_safe1.c
index 2f6c9d2..eeddcc8 100644
--- a/validation/builtin_safe1.c
+++ b/validation/builtin_safe1.c
@@ -26,7 +26,6 @@ static int foo(int x, int y)
/*
* check-name: __builtin_safe
- * check-known-to-fail
* check-error-start
builtin_safe1.c:13:3: warning: Macro argument with side effects: x++
builtin_safe1.c:14:3: warning: Macro argument with side effects: x+=1
--
1.7.4.1
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Newbies FAQ] [Kernel List] [Site Home] [IETF Annouce] [DCCP] [Netdev] [Networking] [Security] [Bugtraq] [Photo] [Yosemite] [MIPS Linux] [ARM Linux] [Linux Security] [Linux RAID] [Linux SCSI] [DDR & Rambus] [Trinity Fuzzer Tool]