On Sat, Sep 19, 2020 at 8:41 AM Ilie Halip <ilie.ha...@gmail.com> wrote: > > With CONFIG_UBSAN_TRAP enabled, the compiler may insert a trap instruction > after a call to a noreturn function. In this case, objtool warns that the > ud2 instruction is unreachable. > > This is a behavior seen with clang, from the oldest version capable of > building the mainline x64_64 kernel (9.0), to the latest experimental > version (12.0). > > objtool silences similar warnings (trap after dead end instructions), so > so expand that check to include dead end functions. > > Cc: Nick Desaulniers <ndesaulni...@google.com> > Cc: Rong Chen <rong.a.c...@intel.com> > Cc: Marco Elver <el...@google.com> > Cc: Philip Li <philip...@intel.com> > Cc: Borislav Petkov <b...@alien8.de> > Cc: kasan-...@googlegroups.com > Cc: x...@kernel.org > Cc: clang-built-li...@googlegroups.com > BugLink: https://github.com/ClangBuiltLinux/linux/issues/1148 > Link: > https://lore.kernel.org/lkml/CAKwvOdmptEpi8fiOyWUo=aizjix+z+vhjom2bulprwsmtwl...@mail.gmail.com > Suggested-by: Nick Desaulniers <ndesaulni...@google.com> > Reviewed-by: Nick Desaulniers <ndesaulni...@google.com> > Tested-by: Nick Desaulniers <ndesaulni...@google.com> > Reported-by: kbuild test robot <l...@intel.com> > Signed-off-by: Ilie Halip <ilie.ha...@gmail.com> > ---
Tested-by: Sedat Dilek <sedat.di...@gmail.com> - Sedat - > > Changed in v2: > - added a mention that this is a clang issue across all versions > - added Nick's Reviewed-by, Tested-by > - added Reported-by > > tools/objtool/check.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/tools/objtool/check.c b/tools/objtool/check.c > index e034a8f24f46..eddf8bf16b05 100644 > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -2612,9 +2612,10 @@ static bool is_ubsan_insn(struct instruction *insn) > "__ubsan_handle_builtin_unreachable")); > } > > -static bool ignore_unreachable_insn(struct instruction *insn) > +static bool ignore_unreachable_insn(struct objtool_file *file, struct > instruction *insn) > { > int i; > + struct instruction *prev_insn; > > if (insn->ignore || insn->type == INSN_NOP) > return true; > @@ -2639,8 +2640,11 @@ static bool ignore_unreachable_insn(struct instruction > *insn) > * __builtin_unreachable(). The BUG() macro has an unreachable() > after > * the UD2, which causes GCC's undefined trap logic to emit another > UD2 > * (or occasionally a JMP to UD2). > + * CONFIG_UBSAN_TRAP may also insert a UD2 after calling a __noreturn > + * function. > */ > - if (list_prev_entry(insn, list)->dead_end && > + prev_insn = list_prev_entry(insn, list); > + if ((prev_insn->dead_end || dead_end_function(file, > prev_insn->call_dest)) && > (insn->type == INSN_BUG || > (insn->type == INSN_JUMP_UNCONDITIONAL && > insn->jump_dest && insn->jump_dest->type == INSN_BUG))) > @@ -2767,7 +2771,7 @@ static int validate_reachable_instructions(struct > objtool_file *file) > return 0; > > for_each_insn(file, insn) { > - if (insn->visited || ignore_unreachable_insn(insn)) > + if (insn->visited || ignore_unreachable_insn(file, insn)) > continue; > > WARN_FUNC("unreachable instruction", insn->sec, insn->offset); > -- > 2.25.1 > > -- > You received this message because you are subscribed to the Google Groups > "Clang Built Linux" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clang-built-linux+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/clang-built-linux/20200919064118.1899325-1-ilie.halip%40gmail.com.