Author: Felipe de Azevedo Piovezan Date: 2025-12-03T09:08:05Z New Revision: 2b725ab8bf08b0bde29910ec4fa1c610eaaffa63
URL: https://github.com/llvm/llvm-project/commit/2b725ab8bf08b0bde29910ec4fa1c610eaaffa63 DIFF: https://github.com/llvm/llvm-project/commit/2b725ab8bf08b0bde29910ec4fa1c610eaaffa63.diff LOG: [lldb] Add DisassemblerLLVMC::IsBarrier API (#169632) This will allow the instruction emulation unwinder to reason about instructions that prevent the subsequent instruction from executing. Part of a sequence of PRs: [lldb][NFCI] Rewrite UnwindAssemblyInstEmulation in terms of a CFG visit #169630 [lldb][NFC] Rename forward_branch_offset to branch_offset in UnwindAssemblyInstEmulation #169631 [lldb] Add DisassemblerLLVMC::IsBarrier API #169632 [lldb] Handle backwards branches in UnwindAssemblyInstEmulation #169633 commit-id:bb5df4aa Added: Modified: lldb/include/lldb/Core/Disassembler.h lldb/source/Core/Disassembler.cpp lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Core/Disassembler.h b/lldb/include/lldb/Core/Disassembler.h index 5de314109b0cc..ab0f4ac804a7c 100644 --- a/lldb/include/lldb/Core/Disassembler.h +++ b/lldb/include/lldb/Core/Disassembler.h @@ -167,6 +167,8 @@ class Instruction { virtual bool IsLoad() = 0; + virtual bool IsBarrier() = 0; + virtual bool IsAuthenticated() = 0; bool CanSetBreakpoint(); @@ -367,6 +369,8 @@ class PseudoInstruction : public Instruction { bool IsLoad() override; + bool IsBarrier() override; + bool IsAuthenticated() override; void CalculateMnemonicOperandsAndComment( diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp index f2eb887986bfb..ed32caf361e0a 100644 --- a/lldb/source/Core/Disassembler.cpp +++ b/lldb/source/Core/Disassembler.cpp @@ -1341,6 +1341,11 @@ bool PseudoInstruction::DoesBranch() { return false; } +bool PseudoInstruction::IsBarrier() { + // This is NOT a valid question for a pseudo instruction. + return false; +} + bool PseudoInstruction::HasDelaySlot() { // This is NOT a valid question for a pseudo instruction. return false; diff --git a/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp b/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp index 66d0a50985be7..e8bb706f7aab6 100644 --- a/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp +++ b/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp @@ -70,6 +70,7 @@ class DisassemblerLLVMC::MCDisasmInstance { bool HasDelaySlot(llvm::MCInst &mc_inst) const; bool IsCall(llvm::MCInst &mc_inst) const; bool IsLoad(llvm::MCInst &mc_inst) const; + bool IsBarrier(llvm::MCInst &mc_inst) const; bool IsAuthenticated(llvm::MCInst &mc_inst) const; private: @@ -436,6 +437,11 @@ class InstructionLLVMC : public lldb_private::Instruction { return m_is_load; } + bool IsBarrier() override { + VisitInstruction(); + return m_is_barrier; + } + bool IsAuthenticated() override { VisitInstruction(); return m_is_authenticated; @@ -1195,6 +1201,7 @@ class InstructionLLVMC : public lldb_private::Instruction { bool m_is_call = false; bool m_is_load = false; bool m_is_authenticated = false; + bool m_is_barrier = false; void VisitInstruction() { if (m_has_visited_instruction) @@ -1227,6 +1234,7 @@ class InstructionLLVMC : public lldb_private::Instruction { m_is_call = mc_disasm_ptr->IsCall(inst); m_is_load = mc_disasm_ptr->IsLoad(inst); m_is_authenticated = mc_disasm_ptr->IsAuthenticated(inst); + m_is_barrier = mc_disasm_ptr->IsBarrier(inst); } private: @@ -1432,6 +1440,11 @@ bool DisassemblerLLVMC::MCDisasmInstance::IsLoad(llvm::MCInst &mc_inst) const { return m_instr_info_up->get(mc_inst.getOpcode()).mayLoad(); } +bool DisassemblerLLVMC::MCDisasmInstance::IsBarrier( + llvm::MCInst &mc_inst) const { + return m_instr_info_up->get(mc_inst.getOpcode()).isBarrier(); +} + bool DisassemblerLLVMC::MCDisasmInstance::IsAuthenticated( llvm::MCInst &mc_inst) const { const auto &InstrDesc = m_instr_info_up->get(mc_inst.getOpcode()); _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
