aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-03-18 00:15:11 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-03-20 00:52:39 +0100
commitd2be323e25c3378c60963c1f4250e2e286f0be3c (patch)
treef0b840143faa85ac0d371e3661c571945a9682dd
parentc88f0098ff20f8f64cd4f57c4b63363da88b8ee0 (diff)
downloadsparse-d2be323e25c3378c60963c1f4250e2e286f0be3c.tar.gz
teach sparse to linearize __builtin_unreachable()
__builtin_unreachable() is one of the builtin that shouldn't be ignored at IR level since it directly impact the CFG. So, add the infrastructure put in place in the previous patch to generate the OP_UNREACH instruction instead of generating a call to a non-existing function "__builtin_unreachable()". Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--linearize.c7
-rw-r--r--validation/context-unreachable.c1
-rw-r--r--validation/linear/builtin_unreachable0.c1
-rw-r--r--validation/linear/builtin_unreachable1.c1
4 files changed, 7 insertions, 3 deletions
diff --git a/linearize.c b/linearize.c
index bda831ce..b040d345 100644
--- a/linearize.c
+++ b/linearize.c
@@ -2536,12 +2536,19 @@ struct entrypoint *linearize_symbol(struct symbol *sym)
* Builtin functions
*/
+static pseudo_t linearize_unreachable(struct entrypoint *ep, struct expression *exp)
+{
+ add_unreachable(ep);
+ return VOID;
+}
+
static struct sym_init {
const char *name;
pseudo_t (*linearize)(struct entrypoint *, struct expression*);
struct symbol_op op;
} builtins_table[] = {
// must be declared in builtin.c:declare_builtins[]
+ { "__builtin_unreachable", linearize_unreachable },
{ }
};
diff --git a/validation/context-unreachable.c b/validation/context-unreachable.c
index 3e330403..8664962e 100644
--- a/validation/context-unreachable.c
+++ b/validation/context-unreachable.c
@@ -12,5 +12,4 @@ static void foo(void)
/*
* check-name: context-unreachable
- * check-known-to-fail
*/
diff --git a/validation/linear/builtin_unreachable0.c b/validation/linear/builtin_unreachable0.c
index f9703079..911ed7f9 100644
--- a/validation/linear/builtin_unreachable0.c
+++ b/validation/linear/builtin_unreachable0.c
@@ -8,7 +8,6 @@ int foo(int p)
/*
* check-name: builtin_unreachable0
* check-command: test-linearize -Wno-decl $file
- * check-known-to-fail
*
* check-output-start
foo:
diff --git a/validation/linear/builtin_unreachable1.c b/validation/linear/builtin_unreachable1.c
index 4dedfaba..70f6674c 100644
--- a/validation/linear/builtin_unreachable1.c
+++ b/validation/linear/builtin_unreachable1.c
@@ -12,7 +12,6 @@ int foo(int c)
* check-name: builtin_unreachable1
* check-command: test-linearize -Wno-decl $file
*
- * check-known-to-fail
* check-output-start
foo:
.L0: