aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/builtin.c
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-08 03:38:29 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-08 18:55:02 +0200
commita6e80f36afca7b7f6eeaf557cdbd1effca5cc810 (patch)
treee272207624986109e767bd2790c921adcf240f16 /builtin.c
parent35b50cdb51b6c32262103672277135cb0b5311e6 (diff)
downloadsparse-dev-a6e80f36afca7b7f6eeaf557cdbd1effca5cc810.tar.gz
builtin: add support for __has_builtin()
Sparse has support for a subset of GCC's large collection of builtin functions. As for GCC, it's not easy to know which builtins are supported in which versions. clang has a good solution to this problem: it adds the checking macro __has_builtin(<name>) which evaluates to 1 if <name> is a builtin function supported by the compiler and 0 otherwise. It can be used like: #if __has_builtin(__builtin_clz) #define clz(x) __builtin_clz(x) #else ... #endif It's possible or probable that GCC will have this soon too: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66970 Add support for this __has_builtin() macro by extending the evaluation of preprocessor expressions very much like it is done to support defined(). Note: Some function-like builtin features, like __builtin_offset(), are considered as a kind of keyword/operator and processed as such. These are *not* considered as builtins by __has_builtin(). Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/builtin.c b/builtin.c
index 0114c4ca..b3460847 100644
--- a/builtin.c
+++ b/builtin.c
@@ -360,6 +360,7 @@ void init_builtins(int stream)
sym->ctype.base_type = ptr->base_type;
sym->ctype.modifiers = ptr->modifiers;
sym->op = ptr->op;
+ sym->builtin = 1;
}
}
@@ -373,6 +374,7 @@ static void declare_builtin(const char *name, struct symbol *rtype, int variadic
sym->ctype.base_type = fun;
sym->ctype.modifiers = MOD_TOPLEVEL;
+ sym->builtin = 1;
fun->ctype.base_type = rtype;
fun->variadic = variadic;