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:
Родитель
61e9b75a0c
Коммит
8e25c9f8b4
|
@ -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)) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче