Since we can now have multiple stack-ops per instruction, we don't
need to special case LEAVE and can simply emit the composite
operations.

Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
---
 tools/objtool/arch/x86/decode.c      |   14 +++++++++++---
 tools/objtool/check.c                |   24 ++----------------------
 tools/objtool/include/objtool/arch.h |    1 -
 3 files changed, 13 insertions(+), 26 deletions(-)

--- a/tools/objtool/arch/x86/decode.c
+++ b/tools/objtool/arch/x86/decode.c
@@ -441,9 +441,17 @@ int arch_decode_instruction(const struct
                 * mov bp, sp
                 * pop bp
                 */
-               ADD_OP(op)
-                       op->dest.type = OP_DEST_LEAVE;
-
+               ADD_OP(op) {
+                       op->src.type = OP_SRC_REG;
+                       op->src.reg = CFI_BP;
+                       op->dest.type = OP_DEST_REG;
+                       op->dest.reg = CFI_SP;
+               }
+               ADD_OP(op) {
+                       op->src.type = OP_SRC_POP;
+                       op->dest.type = OP_DEST_REG;
+                       op->dest.reg = CFI_BP;
+               }
                break;
 
        case 0xe3:
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1931,7 +1931,7 @@ static int update_cfi_state(struct instr
                        }
 
                        else if (op->src.reg == CFI_BP && op->dest.reg == 
CFI_SP &&
-                                cfa->base == CFI_BP) {
+                                (cfa->base == CFI_BP || cfa->base == 
cfi->drap_reg)) {
 
                                /*
                                 * mov %rbp, %rsp
@@ -2114,7 +2114,7 @@ static int update_cfi_state(struct instr
                                cfa->offset = 0;
                                cfi->drap_offset = -1;
 
-                       } else if (regs[op->dest.reg].offset == 
-cfi->stack_size) {
+                       } else if (cfi->stack_size == 
-regs[op->dest.reg].offset) {
 
                                /* pop %reg */
                                restore_reg(cfi, op->dest.reg);
@@ -2254,26 +2254,6 @@ static int update_cfi_state(struct instr
                }
 
                break;
-
-       case OP_DEST_LEAVE:
-               if ((!cfi->drap && cfa->base != CFI_BP) ||
-                   (cfi->drap && cfa->base != cfi->drap_reg)) {
-                       WARN_FUNC("leave instruction with modified stack frame",
-                                 insn->sec, insn->offset);
-                       return -1;
-               }
-
-               /* leave (mov %rbp, %rsp; pop %rbp) */
-
-               cfi->stack_size = -cfi->regs[CFI_BP].offset - 8;
-               restore_reg(cfi, CFI_BP);
-
-               if (!cfi->drap) {
-                       cfa->base = CFI_SP;
-                       cfa->offset -= 8;
-               }
-
-               break;
 
        case OP_DEST_MEM:
                if (op->src.type != OP_SRC_POP && op->src.type != OP_SRC_POPF) {
--- a/tools/objtool/include/objtool/arch.h
+++ b/tools/objtool/include/objtool/arch.h
@@ -35,7 +35,6 @@ enum op_dest_type {
        OP_DEST_MEM,
        OP_DEST_PUSH,
        OP_DEST_PUSHF,
-       OP_DEST_LEAVE,
 };
 
 struct op_dest {


Reply via email to