Commit 8e25c9f8 authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Thomas Gleixner
Browse files

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: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Tested-by: default avatarNick Desaulniers <ndesaulniers@google.com>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/9e6679610768fb6e6c51dca23f7d4d0c03b0c910.1563413318.git.jpoimboe@redhat.com
parent 61e9b75a
Loading
Loading
Loading
Loading
+14 −22
Original line number Diff line number Diff line
@@ -105,13 +105,8 @@ static struct instruction *next_insn_same_func(struct objtool_file *file,
 *
 * For local functions, we have to detect them manually by simply looking for
 * 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 i;
@@ -139,29 +134,29 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,
	};

	if (func->bind == STB_WEAK)
		return 0;
		return false;

	if (func->bind == STB_GLOBAL)
		for (i = 0; i < ARRAY_SIZE(global_noreturns); i++)
			if (!strcmp(func->name, global_noreturns[i]))
				return 1;
				return true;

	if (!func->len)
		return 0;
		return false;

	insn = find_insn(file, func->sec, func->offset);
	if (!insn->func)
		return 0;
		return false;

	func_for_each_insn_all(file, func, insn) {
		empty = false;

		if (insn->type == INSN_RETURN)
			return 0;
			return false;
	}

	if (empty)
		return 0;
		return false;

	/*
	 * 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)
				/* sibling call to another file */
				return 0;
				return false;

			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
					 * they aren't dead ends.
					 */
					return 0;
					return false;
				}

				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))
			/* 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);
}
@@ -2080,11 +2075,8 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
				if (is_fentry_call(insn))
					break;

				ret = dead_end_function(file, insn->call_dest);
				if (ret == 1)
				if (dead_end_function(file, insn->call_dest))
					return 0;
				if (ret == -1)
					return 1;
			}

			if (!no_fp && func && !has_valid_stack_frame(&state)) {