Messages in this thread Patch in this message | | | Date | Wed, 29 Apr 2020 12:21:01 +0200 | From | Peter Zijlstra <> | Subject | [PATCH v2.1 01-B/14] objtool: Uniquely identify alternative instruction groups |
| |
Subject: objtool: Uniquely identify alternative instruction groups From: Alexandre Chartre <alexandre.chartre@oracle.com> Date: Tue, 14 Apr 2020 12:36:11 +0200
From: Alexandre Chartre <alexandre.chartre@oracle.com>
Assign a unique identifier to every alternative instruction group in order to be able to tell which instructions belong to what alternative.
[peterz: extracted from a larger patch] Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- tools/objtool/check.c | 26 ++++++++++++++++++++------ tools/objtool/check.h | 3 ++- 2 files changed, 22 insertions(+), 7 deletions(-)
--- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -770,7 +770,9 @@ static int handle_group_alt(struct objto struct instruction *orig_insn, struct instruction **new_insn) { + static unsigned int alt_group_next_index = 1; struct instruction *last_orig_insn, *last_new_insn, *insn, *fake_jump = NULL; + unsigned int alt_group = alt_group_next_index++; unsigned long dest_off; last_orig_insn = NULL; @@ -779,7 +781,7 @@ static int handle_group_alt(struct objto if (insn->offset >= special_alt->orig_off + special_alt->orig_len) break; - insn->alt_group = true; + insn->alt_group = alt_group; last_orig_insn = insn; } @@ -813,6 +815,7 @@ static int handle_group_alt(struct objto } last_new_insn = NULL; + alt_group = alt_group_next_index++; insn = *new_insn; sec_for_each_insn_from(file, insn) { if (insn->offset >= special_alt->new_off + special_alt->new_len) @@ -822,6 +825,7 @@ static int handle_group_alt(struct objto insn->ignore = orig_insn->ignore_alts; insn->func = orig_insn->func; + insn->alt_group = alt_group; /* * Since alternative replacement code is copy/pasted by the --- a/tools/objtool/check.h +++ b/tools/objtool/check.h @@ -30,12 +30,13 @@ struct instruction { unsigned int len; enum insn_type type; unsigned long immediate; - bool alt_group, dead_end, ignore, ignore_alts; + bool dead_end, ignore, ignore_alts; bool hint; bool retpoline_safe; s8 instr; u8 visited; u8 ret_offset; + int alt_group; struct symbol *call_dest; struct instruction *jump_dest; struct instruction *first_jump_src;
| |