The semantic of a __noreturn function is that ... it doesn't return. So, insert an instruction OP_UNREACH after calls to such functions. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- linearize.c | 10 ++++++++++ validation/linear/noreturn-unreachable0.c | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/linearize.c b/linearize.c index f1e538e23ae1..19c284c4a456 100644 --- a/linearize.c +++ b/linearize.c @@ -657,6 +657,13 @@ static void add_one_insn(struct entrypoint *ep, struct instruction *insn) } } +static void add_unreachable(struct entrypoint *ep) +{ + struct instruction *insn = alloc_instruction(OP_UNREACH, 0); + add_one_insn(ep, insn); + ep->active = NULL; +} + static void set_activeblock(struct entrypoint *ep, struct basic_block *bb) { if (!bb_terminated(ep->active)) @@ -1551,6 +1558,9 @@ static pseudo_t linearize_call_expression(struct entrypoint *ep, struct expressi add_one_insn(ep, insn); } } END_FOR_EACH_PTR(context); + + if (ctype->modifiers & MOD_NORETURN) + add_unreachable(ep); } return retval; diff --git a/validation/linear/noreturn-unreachable0.c b/validation/linear/noreturn-unreachable0.c index b76319458e96..13fddc8cfd40 100644 --- a/validation/linear/noreturn-unreachable0.c +++ b/validation/linear/noreturn-unreachable0.c @@ -9,7 +9,6 @@ int foo(void) /* * check-name: noreturn-unreachable0 * check-command: test-linearize -Wno-decl $file - * check-known-to-fail * * check-output-start foo: -- 2.25.1