https://github.com/da-viper updated https://github.com/llvm/llvm-project/pull/134626
>From 6c8b0a3dcb33eeb2fe57325a792ff5a70225d18e Mon Sep 17 00:00:00 2001 From: Ebuka Ezike <yerimy...@gmail.com> Date: Mon, 7 Apr 2025 10:24:02 +0100 Subject: [PATCH 1/3] [lldb] Fix SBTarget::ReadInstruction The disassemblyBytes parameters are not ordered correctly and crashes when the read instruction is called --- lldb/source/API/SBTarget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp index 0fed1bbfed6a7..b42ada42b0931 100644 --- a/lldb/source/API/SBTarget.cpp +++ b/lldb/source/API/SBTarget.cpp @@ -2021,9 +2021,9 @@ lldb::SBInstructionList SBTarget::ReadInstructions(lldb::SBAddress base_addr, error, force_live_memory, &load_addr); const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; sb_instructions.SetDisassembler(Disassembler::DisassembleBytes( - target_sp->GetArchitecture(), nullptr, target_sp->GetDisassemblyCPU(), - target_sp->GetDisassemblyFeatures(), flavor_string, *addr_ptr, - data.GetBytes(), bytes_read, count, data_from_file)); + target_sp->GetArchitecture(), nullptr, flavor_string, + target_sp->GetDisassemblyCPU(), target_sp->GetDisassemblyFeatures(), + *addr_ptr, data.GetBytes(), bytes_read, count, data_from_file)); } } >From 4be5e33bf7b986e35808b83758e4a8d85b646a81 Mon Sep 17 00:00:00 2001 From: Ebuka Ezike <yerimy...@gmail.com> Date: Mon, 7 Apr 2025 14:23:51 +0100 Subject: [PATCH 2/3] [lldb] Add test for SBTarget reading instructions with flavor This commit introduces a new test for verifying the `SBTarget` API's ability to read and validate disassembled instructions with a specified flavor ("intel"). Signed-off-by: Ebuka Ezike <yerimy...@gmail.com> --- .../target/read-instructions-flavor/Makefile | 3 ++ .../TestTargetReadInstructionsFlavor.py | 40 +++++++++++++++++++ .../target/read-instructions-flavor/main.c | 21 ++++++++++ 3 files changed, 64 insertions(+) create mode 100644 lldb/test/API/python_api/target/read-instructions-flavor/Makefile create mode 100644 lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py create mode 100644 lldb/test/API/python_api/target/read-instructions-flavor/main.c diff --git a/lldb/test/API/python_api/target/read-instructions-flavor/Makefile b/lldb/test/API/python_api/target/read-instructions-flavor/Makefile new file mode 100644 index 0000000000000..10495940055b6 --- /dev/null +++ b/lldb/test/API/python_api/target/read-instructions-flavor/Makefile @@ -0,0 +1,3 @@ +C_SOURCES := main.c + +include Makefile.rules diff --git a/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py b/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py new file mode 100644 index 0000000000000..e93c8476d8e00 --- /dev/null +++ b/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py @@ -0,0 +1,40 @@ +""" +Test SBTarget Read Instruction. +""" + +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * + + +class TargetReadInstructionsFlavor(TestBase): + + @skipIf(archs=no_match(["x86_64", "x86", "i386"]), oslist=["windows"]) + def test_read_instructions_with_flavor(self): + self.build() + executable = self.getBuildArtifact("a.out") + + # create a target + target = self.dbg.CreateTarget(executable) + self.assertTrue(target.IsValid(), "target is not valid") + + functions = target.FindFunctions("test_add") + self.assertEqual(len(functions), 1) + test_add = functions[0] + + test_add_symbols = test_add.GetSymbol() + self.assertTrue( + test_add_symbols.IsValid(), "test_add function symbols is not valid" + ) + + expected_instructions = (("mov", "eax, edi"), ("add", "eax, esi"), ("ret", "")) + test_add_insts = test_add_symbols.GetInstructions(target, "intel") + # clang adds an extra nop instruction but gcc does not. It makes more sense + # to check if it is at least 3 + self.assertLessEqual(len(expected_instructions), len(test_add_insts)) + + # compares only the expected instructions + for expected_instr, instr in zip(expected_instructions, test_add_insts): + self.assertTrue(instr.IsValid(), "instruction is not valid") + expected_mnemonic, expected_op_str = expected_instr + self.assertEqual(instr.GetMnemonic(target), expected_mnemonic) + self.assertEqual(instr.GetOperands(target), expected_op_str) diff --git a/lldb/test/API/python_api/target/read-instructions-flavor/main.c b/lldb/test/API/python_api/target/read-instructions-flavor/main.c new file mode 100644 index 0000000000000..6022d63fb6ed7 --- /dev/null +++ b/lldb/test/API/python_api/target/read-instructions-flavor/main.c @@ -0,0 +1,21 @@ + +// This simple program is to test the lldb Python API SBTarget ReadInstruction +// function. +// +// When the target is create we get all the instructions using the intel +// flavor and see if it is correct. + +int test_add(int a, int b); + +__asm__("test_add:\n" + " movl %edi, %eax\n" + " addl %esi, %eax\n" + " ret \n"); + +int main(int argc, char **argv) { + int a = 10; + int b = 20; + int result = test_add(a, b); + + return 0; +} \ No newline at end of file >From 7417e79323c67ab478a0d41757ebb1679f4cb28c Mon Sep 17 00:00:00 2001 From: Ebuka Ezike <yerimy...@gmail.com> Date: Mon, 7 Apr 2025 14:39:22 +0100 Subject: [PATCH 3/3] [lldb] fix formatting Signed-off-by: Ebuka Ezike <yerimy...@gmail.com> --- .../read-instructions-flavor/TestTargetReadInstructionsFlavor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py b/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py index e93c8476d8e00..40edc57df21ce 100644 --- a/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py +++ b/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py @@ -7,7 +7,6 @@ class TargetReadInstructionsFlavor(TestBase): - @skipIf(archs=no_match(["x86_64", "x86", "i386"]), oslist=["windows"]) def test_read_instructions_with_flavor(self): self.build() _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits