diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-03-18 00:15:11 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-03-20 00:52:39 +0100 |
commit | d2be323e25c3378c60963c1f4250e2e286f0be3c (patch) | |
tree | f0b840143faa85ac0d371e3661c571945a9682dd | |
parent | c88f0098ff20f8f64cd4f57c4b63363da88b8ee0 (diff) | |
download | sparse-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.c | 7 | ||||
-rw-r--r-- | validation/context-unreachable.c | 1 | ||||
-rw-r--r-- | validation/linear/builtin_unreachable0.c | 1 | ||||
-rw-r--r-- | validation/linear/builtin_unreachable1.c | 1 |
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: |