Commit a8a330dd authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

objtool: Collapse annotate sequences



Reduce read_annotate() runs by collapsing subsequent runs into a
single call.

Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Link: https://lore.kernel.org/r/20241128094311.688871544@infradead.org
parent 112765ca
Loading
Loading
Loading
Loading
+32 −55
Original line number Diff line number Diff line
@@ -2381,21 +2381,24 @@ static int read_annotate(struct objtool_file *file,
	return 0;
}

static int __annotate_ignore_alts(struct objtool_file *file, int type, struct instruction *insn)
static int __annotate_early(struct objtool_file *file, int type, struct instruction *insn)
{
	if (type != ANNOTYPE_IGNORE_ALTS)
		return 0;

	switch (type) {
	case ANNOTYPE_IGNORE_ALTS:
		insn->ignore_alts = true;
	return 0;
}

static int __annotate_noendbr(struct objtool_file *file, int type, struct instruction *insn)
{
	if (type != ANNOTYPE_NOENDBR)
		return 0;
		break;

	/*
	 * Must be before read_unwind_hints() since that needs insn->noendbr.
	 */
	case ANNOTYPE_NOENDBR:
		insn->noendbr = 1;
		break;

	default:
		break;
	}

	return 0;
}

@@ -2429,11 +2432,10 @@ static int __annotate_ifc(struct objtool_file *file, int type, struct instructio
	return 0;
}

static int __annotate_retpoline_safe(struct objtool_file *file, int type, struct instruction *insn)
static int __annotate_late(struct objtool_file *file, int type, struct instruction *insn)
{
	if (type != ANNOTYPE_RETPOLINE_SAFE)
		return 0;

	switch (type) {
	case ANNOTYPE_RETPOLINE_SAFE:
		if (insn->type != INSN_JUMP_DYNAMIC &&
		    insn->type != INSN_CALL_DYNAMIC &&
		    insn->type != INSN_RETURN &&
@@ -2443,12 +2445,8 @@ static int __annotate_retpoline_safe(struct objtool_file *file, int type, struct
		}

		insn->retpoline_safe = true;
	return 0;
}
		break;

static int __annotate_instr(struct objtool_file *file, int type, struct instruction *insn)
{
	switch (type) {
	case ANNOTYPE_INSTR_BEGIN:
		insn->instr++;
		break;
@@ -2457,21 +2455,15 @@ static int __annotate_instr(struct objtool_file *file, int type, struct instruct
		insn->instr--;
		break;

	default:
	case ANNOTYPE_UNRET_BEGIN:
		insn->unret = 1;
		break;
	}

	return 0;
	default:
		break;
	}

static int __annotate_unret(struct objtool_file *file, int type, struct instruction *insn)
{
	if (type != ANNOTYPE_UNRET_BEGIN)
		return 0;

	insn->unret = 1;
	return 0;

}

/*
@@ -2583,14 +2575,7 @@ static int decode_sections(struct objtool_file *file)
	add_ignores(file);
	add_uaccess_safe(file);

	ret = read_annotate(file, __annotate_ignore_alts);
	if (ret)
		return ret;

	/*
	 * Must be before read_unwind_hints() since that needs insn->noendbr.
	 */
	ret = read_annotate(file, __annotate_noendbr);
	ret = read_annotate(file, __annotate_early);
	if (ret)
		return ret;

@@ -2636,15 +2621,7 @@ static int decode_sections(struct objtool_file *file)
	if (ret)
		return ret;

	ret = read_annotate(file, __annotate_retpoline_safe);
	if (ret)
		return ret;

	ret = read_annotate(file, __annotate_instr);
	if (ret)
		return ret;

	ret = read_annotate(file, __annotate_unret);
	ret = read_annotate(file, __annotate_late);
	if (ret)
		return ret;