objtool: Change dead_end_function() to return boolean

dead_end_function() can no longer return an error.  Simplify its
interface by making it return boolean.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/9e6679610768fb6e6c51dca23f7d4d0c03b0c910.1563413318.git.jpoimboe@redhat.com
This commit is contained in:
Josh Poimboeuf 2019-07-17 20:36:50 -05:00 коммит произвёл Thomas Gleixner
Родитель 61e9b75a0c
Коммит 8e25c9f8b4
1 изменённых файлов: 14 добавлений и 22 удалений

Просмотреть файл

@ -105,14 +105,9 @@ static struct instruction *next_insn_same_func(struct objtool_file *file,
* *
* For local functions, we have to detect them manually by simply looking for * For local functions, we have to detect them manually by simply looking for
* the lack of a return instruction. * the lack of a return instruction.
*
* Returns:
* -1: error
* 0: no dead end
* 1: dead end
*/ */
static int __dead_end_function(struct objtool_file *file, struct symbol *func, static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
int recursion) int recursion)
{ {
int i; int i;
struct instruction *insn; struct instruction *insn;
@ -139,29 +134,29 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,
}; };
if (func->bind == STB_WEAK) if (func->bind == STB_WEAK)
return 0; return false;
if (func->bind == STB_GLOBAL) if (func->bind == STB_GLOBAL)
for (i = 0; i < ARRAY_SIZE(global_noreturns); i++) for (i = 0; i < ARRAY_SIZE(global_noreturns); i++)
if (!strcmp(func->name, global_noreturns[i])) if (!strcmp(func->name, global_noreturns[i]))
return 1; return true;
if (!func->len) if (!func->len)
return 0; return false;
insn = find_insn(file, func->sec, func->offset); insn = find_insn(file, func->sec, func->offset);
if (!insn->func) if (!insn->func)
return 0; return false;
func_for_each_insn_all(file, func, insn) { func_for_each_insn_all(file, func, insn) {
empty = false; empty = false;
if (insn->type == INSN_RETURN) if (insn->type == INSN_RETURN)
return 0; return false;
} }
if (empty) if (empty)
return 0; return false;
/* /*
* A function can have a sibling call instead of a return. In that * A function can have a sibling call instead of a return. In that
@ -174,7 +169,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,
if (!dest) if (!dest)
/* sibling call to another file */ /* sibling call to another file */
return 0; return false;
if (dest->func && dest->func->pfunc != insn->func->pfunc) { if (dest->func && dest->func->pfunc != insn->func->pfunc) {
@ -186,7 +181,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,
* This is a very rare case. It means * This is a very rare case. It means
* they aren't dead ends. * they aren't dead ends.
*/ */
return 0; return false;
} }
return __dead_end_function(file, dest->func, return __dead_end_function(file, dest->func,
@ -196,13 +191,13 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,
if (insn->type == INSN_JUMP_DYNAMIC && list_empty(&insn->alts)) if (insn->type == INSN_JUMP_DYNAMIC && list_empty(&insn->alts))
/* sibling call */ /* sibling call */
return 0; return false;
} }
return 1; return true;
} }
static int dead_end_function(struct objtool_file *file, struct symbol *func) static bool dead_end_function(struct objtool_file *file, struct symbol *func)
{ {
return __dead_end_function(file, func, 0); return __dead_end_function(file, func, 0);
} }
@ -2080,11 +2075,8 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
if (is_fentry_call(insn)) if (is_fentry_call(insn))
break; break;
ret = dead_end_function(file, insn->call_dest); if (dead_end_function(file, insn->call_dest))
if (ret == 1)
return 0; return 0;
if (ret == -1)
return 1;
} }
if (!no_fp && func && !has_valid_stack_frame(&state)) { if (!no_fp && func && !has_valid_stack_frame(&state)) {