================ @@ -737,11 +799,44 @@ class Executor { bool operator()(SH inst) { return Store<SH, uint16_t>(m_emu, inst); } bool operator()(SW inst) { return Store<SW, uint32_t>(m_emu, inst); } bool operator()(ADDI inst) { - return transformOptional(inst.rs1.ReadI64(m_emu), - [&](int64_t rs1) { - return inst.rd.Write( - m_emu, rs1 + int64_t(SignExt(inst.imm))); - }) + return transformOptional( + inst.rs1.ReadI64(m_emu), + [&](int64_t rs1) { + int64_t result = rs1 + int64_t(SignExt(inst.imm)); + // Check if this is a stack pointer adjustment + if (inst.rd.rd == RISCV_GPR_SP && + inst.rs1.rs == RISCV_GPR_SP) { // rd=sp, rs1=sp + EmulateInstruction::Context context; + context.type = + EmulateInstruction::eContextAdjustStackPointer; + context.SetImmediateSigned(SignExt(inst.imm)); + uint32_t sp_lldb_reg = GPREncodingToLLDB(RISCV_GPR_SP); + RegisterValue registerValue; + registerValue.SetUInt64(result); + return m_emu.WriteRegister(context, eRegisterKindLLDB, + sp_lldb_reg, registerValue); + } + // Check if this is setting up the frame pointer + // addi fp, sp, imm -> fp = sp + imm (frame pointer setup) + if (inst.rd.rd == RISCV_GPR_FP && + inst.rs1.rs == RISCV_GPR_SP) { // rd=fp, rs1=sp ---------------- clayborg wrote:
We probably don't need this comment now that we are using `RISCV_GPR_SP` and `RISCV_GPR_FP`? https://github.com/llvm/llvm-project/pull/158161 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits