From: Jakob Johnson Date: Tue, 2 Aug 2022 18:26:24 +0000 (-0700) Subject: [LLDB] Add SBInstruction::GetControlFlowKind() X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6cbc6e9a6d5f0ef9c406f718dd0c3e6dd6dffeef;p=platform%2Fupstream%2Fllvm.git [LLDB] Add SBInstruction::GetControlFlowKind() D128477 adds the control flow kind for `Instruction` and displays this in the `thread trace dump instruction -k` command. This diff exposes the control flow kind via the new `SBInstruction::GetControlFlowKind` method. I've expanded `TestDisassembleRawData` to test this method, but please let me know if there are any other unittests that should also be updated. Test Plan: `./bin/lldb-dotest -p TestDisassembleRawData` Differential Revision: https://reviews.llvm.org/D131005 --- diff --git a/lldb/bindings/interface/SBInstruction.i b/lldb/bindings/interface/SBInstruction.i index e9e018b..a467a6f 100644 --- a/lldb/bindings/interface/SBInstruction.i +++ b/lldb/bindings/interface/SBInstruction.i @@ -44,6 +44,9 @@ public: const char * GetComment (lldb::SBTarget target); + lldb::InstructionControlFlowKind + GetControlFlowKind(lldb::SBTarget target); + lldb::SBData GetData (lldb::SBTarget target); diff --git a/lldb/include/lldb/API/SBInstruction.h b/lldb/include/lldb/API/SBInstruction.h index b9d7815..def9482 100644 --- a/lldb/include/lldb/API/SBInstruction.h +++ b/lldb/include/lldb/API/SBInstruction.h @@ -43,6 +43,8 @@ public: const char *GetComment(lldb::SBTarget target); + lldb::InstructionControlFlowKind GetControlFlowKind(lldb::SBTarget target); + lldb::SBData GetData(lldb::SBTarget target); size_t GetByteSize(); diff --git a/lldb/source/API/SBInstruction.cpp b/lldb/source/API/SBInstruction.cpp index ced2262..b03d8f7 100644 --- a/lldb/source/API/SBInstruction.cpp +++ b/lldb/source/API/SBInstruction.cpp @@ -164,6 +164,25 @@ const char *SBInstruction::GetComment(SBTarget target) { return nullptr; } +lldb::InstructionControlFlowKind SBInstruction::GetControlFlowKind(lldb::SBTarget target) { + LLDB_INSTRUMENT_VA(this, target); + + lldb::InstructionSP inst_sp(GetOpaque()); + if (inst_sp) { + ExecutionContext exe_ctx; + TargetSP target_sp(target.GetSP()); + std::unique_lock lock; + if (target_sp) { + lock = std::unique_lock(target_sp->GetAPIMutex()); + + target_sp->CalculateExecutionContext(exe_ctx); + exe_ctx.SetProcessSP(target_sp->GetProcessSP()); + } + return inst_sp->GetControlFlowKind(&exe_ctx); + } + return lldb::eInstructionControlFlowKindUnknown; +} + size_t SBInstruction::GetByteSize() { LLDB_INSTRUMENT_VA(this); diff --git a/lldb/test/API/python_api/disassemble-raw-data/TestDisassembleRawData.py b/lldb/test/API/python_api/disassemble-raw-data/TestDisassembleRawData.py index 677559c..4186e6b 100644 --- a/lldb/test/API/python_api/disassemble-raw-data/TestDisassembleRawData.py +++ b/lldb/test/API/python_api/disassemble-raw-data/TestDisassembleRawData.py @@ -52,16 +52,26 @@ class DisassembleRawDataTestCase(TestBase): self.assertEqual(inst.GetMnemonic(target), "move") self.assertEqual(inst.GetOperands(target), '$' + "fp, " + '$' + "sp") + self.assertEqual(inst.GetControlFlowKind(target), + lldb.eInstructionControlFlowKindUnknown) elif re.match("powerpc64le", arch): self.assertEqual(inst.GetMnemonic(target), "li") self.assertEqual(inst.GetOperands(target), "4, 0") + self.assertEqual(inst.GetControlFlowKind(target), + lldb.eInstructionControlFlowKindUnknown) elif arch in ("aarch64", "arm64"): self.assertEqual(inst.GetMnemonic(target), "mov") self.assertEqual(inst.GetOperands(target), "w0, #0x63") + self.assertEqual(inst.GetControlFlowKind(target), + lldb.eInstructionControlFlowKindUnknown) elif arch == "arm": self.assertEqual(inst.GetMnemonic(target), "mov") self.assertEqual(inst.GetOperands(target), "r3, #99") + self.assertEqual(inst.GetControlFlowKind(target), + lldb.eInstructionControlFlowKindUnknown) else: self.assertEqual(inst.GetMnemonic(target), "movq") self.assertEqual(inst.GetOperands(target), '%' + "rsp, " + '%' + "rbp") + self.assertEqual(inst.GetControlFlowKind(target), + lldb.eInstructionControlFlowKindOther)