objtool: Make SP memory operation match PUSH/POP semantics
Architectures without PUSH/POP instructions will always access the stack though memory operations (SRC/DEST_INDIRECT). Make those operations have the same effect on the CFA as PUSH/POP, with no stack pointer modification. Signed-off-by: Julien Thierry <jthierry@redhat.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
This commit is contained in:
parent
468af56a7b
commit
201ef5a974
|
@ -2065,6 +2065,14 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi,
|
|||
break;
|
||||
|
||||
case OP_SRC_REG_INDIRECT:
|
||||
if (!cfi->drap && op->dest.reg == cfa->base &&
|
||||
op->dest.reg == CFI_BP) {
|
||||
|
||||
/* mov disp(%rsp), %rbp */
|
||||
cfa->base = CFI_SP;
|
||||
cfa->offset = cfi->stack_size;
|
||||
}
|
||||
|
||||
if (cfi->drap && op->src.reg == CFI_BP &&
|
||||
op->src.offset == cfi->drap_offset) {
|
||||
|
||||
|
@ -2086,6 +2094,12 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi,
|
|||
/* mov disp(%rbp), %reg */
|
||||
/* mov disp(%rsp), %reg */
|
||||
restore_reg(cfi, op->dest.reg);
|
||||
|
||||
} else if (op->src.reg == CFI_SP &&
|
||||
op->src.offset == regs[op->dest.reg].offset + cfi->stack_size) {
|
||||
|
||||
/* mov disp(%rsp), %reg */
|
||||
restore_reg(cfi, op->dest.reg);
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -2163,6 +2177,12 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi,
|
|||
/* mov reg, disp(%rsp) */
|
||||
save_reg(cfi, op->src.reg, CFI_CFA,
|
||||
op->dest.offset - cfi->cfa.offset);
|
||||
|
||||
} else if (op->dest.reg == CFI_SP) {
|
||||
|
||||
/* mov reg, disp(%rsp) */
|
||||
save_reg(cfi, op->src.reg, CFI_CFA,
|
||||
op->dest.offset - cfi->stack_size);
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue