Commit d44becb9 authored by Julien Thierry's avatar Julien Thierry Committed by Josh Poimboeuf
Browse files

objtool: Move ORC logic out of check()



Now that the objtool_file can be obtained outside of the check function,
orc generation builtin no longer requires check to explicitly call its
orc related functions.

Signed-off-by: default avatarJulien Thierry <jthierry@redhat.com>
Reviewed-by: default avatarMiroslav Benes <mbenes@suse.cz>
Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
parent 6545eb03
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ int cmd_check(int argc, const char **argv)
{
	const char *objname, *s;
	struct objtool_file *file;
	int ret;

	argc = parse_options(argc, argv, check_options, check_usage, 0);

@@ -58,5 +59,12 @@ int cmd_check(int argc, const char **argv)
	if (!file)
		return 1;

	return check(file, false);
	ret = check(file);
	if (ret)
		return ret;

	if (file->elf->changed)
		return elf_write(file->elf);

	return 0;
}
+20 −1
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ int cmd_orc(int argc, const char **argv)

	if (!strncmp(argv[0], "gen", 3)) {
		struct objtool_file *file;
		int ret;

		argc = parse_options(argc, argv, check_options, orc_usage, 0);
		if (argc != 1)
@@ -43,7 +44,25 @@ int cmd_orc(int argc, const char **argv)
		if (!file)
			return 1;

		return check(file, true);
		ret = check(file);
		if (ret)
			return ret;

		if (list_empty(&file->insn_list))
			return 0;

		ret = create_orc(file);
		if (ret)
			return ret;

		ret = create_orc_sections(file);
		if (ret)
			return ret;

		if (!file->elf->changed)
			return 0;

		return elf_write(file->elf);
	}

	if (!strcmp(argv[0], "dump")) {
+1 −17
Original line number Diff line number Diff line
@@ -2908,7 +2908,7 @@ static int validate_reachable_instructions(struct objtool_file *file)
	return 0;
}

int check(struct objtool_file *file, bool orc)
int check(struct objtool_file *file)
{
	int ret, warnings = 0;

@@ -2960,22 +2960,6 @@ int check(struct objtool_file *file, bool orc)
		goto out;
	warnings += ret;

	if (orc) {
		ret = create_orc(file);
		if (ret < 0)
			goto out;

		ret = create_orc_sections(file);
		if (ret < 0)
			goto out;
	}

	if (file->elf->changed) {
		ret = elf_write(file->elf);
		if (ret < 0)
			goto out;
	}

out:
	if (ret < 0) {
		/*
+1 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ struct objtool_file {

struct objtool_file *objtool_open_read(const char *_objname);

int check(struct objtool_file *file, bool orc);
int check(struct objtool_file *file);
int orc_dump(const char *objname);
int create_orc(struct objtool_file *file);
int create_orc_sections(struct objtool_file *file);
+1 −1
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
	return ENOSYS;							\
})

int __weak check(struct objtool_file *file, bool orc)
int __weak check(struct objtool_file *file)
{
	UNSUPPORTED("check subcommand");
}