diff mbox series

[v2,07/11] objtool: Include weak functions in global_noreturns check

Message ID ede3460d63f4a65d282c86f1175bd2662c2286ba.1681342859.git.jpoimboe@kernel.org
State New
Headers show
Series Sprinkle more __noreturn | expand

Commit Message

Josh Poimboeuf April 12, 2023, 11:49 p.m. UTC
If a global function doesn't return, and its prototype has the
__noreturn attribute, its weak counterpart must also not return so that
it matches the prototype and meets call site expectations.

To properly follow the compiled control flow at the call sites, change
the global_noreturns check to include both global and weak functions.

On the other hand, if a weak function isn't in global_noreturns, assume
the prototype doesn't have __noreturn.  Even if the weak function
doesn't return, call sites treat it like a returnable function.

Fixes the following warning:

  kernel/sched/build_policy.o: warning: objtool: do_idle() falls through to next function play_idle_precise()

Reported-by: kernel test robot <lkp@intel.com>
Link: https://lore.kernel.org/oe-kbuild-all/202304090346.erhqxnlt-lkp@intel.com/
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
 tools/objtool/check.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Miroslav Benes April 14, 2023, 2:32 p.m. UTC | #1
On Wed, 12 Apr 2023, Josh Poimboeuf wrote:

> If a global function doesn't return, and its prototype has the
> __noreturn attribute, its weak counterpart must also not return so that
> it matches the prototype and meets call site expectations.
> 
> To properly follow the compiled control flow at the call sites, change
> the global_noreturns check to include both global and weak functions.
> 
> On the other hand, if a weak function isn't in global_noreturns, assume
> the prototype doesn't have __noreturn.  Even if the weak function
> doesn't return, call sites treat it like a returnable function.
> 
> Fixes the following warning:
> 
>   kernel/sched/build_policy.o: warning: objtool: do_idle() falls through to next function play_idle_precise()
> 
> Reported-by: kernel test robot <lkp@intel.com>
> Link: https://lore.kernel.org/oe-kbuild-all/202304090346.erhqxnlt-lkp@intel.com/
> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>

Reviewed-by: Miroslav Benes <mbenes@suse.cz>

The rest of the patch set looks good to me too.

M
diff mbox series

Patch

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index ed42717463f9..94c16436d990 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -236,14 +236,14 @@  static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
 	if (!func)
 		return false;
 
-	if (func->bind == STB_WEAK)
-		return false;
-
-	if (func->bind == STB_GLOBAL)
+	if (func->bind == STB_GLOBAL || func->bind == STB_WEAK)
 		for (i = 0; i < ARRAY_SIZE(global_noreturns); i++)
 			if (!strcmp(func->name, global_noreturns[i]))
 				return true;
 
+	if (func->bind == STB_WEAK)
+		return false;
+
 	if (!func->len)
 		return false;