-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[lldb] Fix SBTarget::ReadInstruction with flavor #134626
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
The disassemblyBytes parameters are not ordered correctly and crashes when the read instruction is called
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 <[email protected]>
@llvm/pr-subscribers-lldb Author: Ebuka Ezike (da-viper) ChangesWhen you call the Full diff: https://github.com/llvm/llvm-project/pull/134626.diff 4 Files Affected:
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));
}
}
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
|
✅ With the latest revision this PR passed the Python code formatter. |
Signed-off-by: Ebuka Ezike <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks for fixing this!
I was also wondering if this should be backported as it also affects llvm 20.x branch |
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets. Depends on llvm#134626
Given its low risk I'm okay back porting this, if you think it's important. That said, I haven't seen any other reports so I'm guessing this crash isn't particularly widespread. |
I think it should be. This only affects the 20 and 21 branches. |
Failed to cherry-pick: 6c8b0a3 https://github.com/llvm/llvm-project/actions/runs/14400492146 Please manually backport the fix and push it to your github fork. Once this is done, please create a pull request |
lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py
Show resolved
Hide resolved
Original in #134626 was written as if it was "this or this" but it's "this and this". So the test ran on AArch64 Linux, because Linux is not Windows. Split out the Windows check to fix that.
separate it like this then it does not and it.
|
@DavidSpickett is there a way to run the merge build bot before merging to check if the test passes on other platforms ? |
Original in llvm/llvm-project#134626 was written as if it was "this or this" but it's "this and this". So the test ran on AArch64 Linux, because Linux is not Windows. Split out the Windows check to fix that.
At this time no, it's a feature I'd like to have one day. My advice would have been to land it and see what happens :) Unless we had pre-commit Windows lldb, but I think right now it's only Linux and it gets disabled some times due to instability. It's fixed for AArch64 Linux at least - https://lab.llvm.org/buildbot/#/builders/59/builds/15858. |
I think we're seeing this persist on x86_64 mac bots https://ci.chromium.org/ui/p/fuchsia/builders/toolchain.ci/lldb-mac-x64/b8717871333718166241/infra I'm not sure what the right spelling is to opt out.. I think @DavidSpickett's original suggestion may work better if we need to opt out more than just windows. |
Macos x86_64 also follows the systemV amd64 abi calling convention. So it should not fail or be skipped. In the linked build bot, I could not see the test (lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py) failing could you link it just to confirm. |
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets. Depends on llvm#134626
When you call the `SBTarget::ReadInstructions` with flavor from lldb crashes. This is because the wrong order of the `DisassemblyBytes` constructor this fixes that --------- Signed-off-by: Ebuka Ezike <[email protected]>
Original in llvm#134626 was written as if it was "this or this" but it's "this and this". So the test ran on AArch64 Linux, because Linux is not Windows. Split out the Windows check to fix that.
When you call the `SBTarget::ReadInstructions` with flavor from lldb crashes. This is because the wrong order of the `DisassemblyBytes` constructor this fixes that --------- Signed-off-by: Ebuka Ezike <[email protected]>
Original in llvm#134626 was written as if it was "this or this" but it's "this and this". So the test ran on AArch64 Linux, because Linux is not Windows. Split out the Windows check to fix that.
When you call the `SBTarget::ReadInstructions` with flavor from lldb crashes. This is because the wrong order of the `DisassemblyBytes` constructor this fixes that --------- Signed-off-by: Ebuka Ezike <[email protected]>
Original in llvm#134626 was written as if it was "this or this" but it's "this and this". So the test ran on AArch64 Linux, because Linux is not Windows. Split out the Windows check to fix that.
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets. Depends on #134626 --------- Signed-off-by: Ebuka Ezike <[email protected]> Co-authored-by: Jonas Devlieghere <[email protected]>
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets. Depends on llvm#134626 --------- Signed-off-by: Ebuka Ezike <[email protected]> Co-authored-by: Jonas Devlieghere <[email protected]>
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets. Depends on llvm#134626 --------- Signed-off-by: Ebuka Ezike <[email protected]> Co-authored-by: Jonas Devlieghere <[email protected]>
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets. Depends on llvm#134626 --------- Signed-off-by: Ebuka Ezike <[email protected]> Co-authored-by: Jonas Devlieghere <[email protected]>
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets. Depends on llvm#134626 --------- Signed-off-by: Ebuka Ezike <[email protected]> Co-authored-by: Jonas Devlieghere <[email protected]>
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets. Depends on llvm#134626 --------- Signed-off-by: Ebuka Ezike <[email protected]> Co-authored-by: Jonas Devlieghere <[email protected]>
Original in llvm/llvm-project#134626 was written as if it was "this or this" but it's "this and this". So the test ran on AArch64 Linux, because Linux is not Windows. Split out the Windows check to fix that.
When you call the
SBTarget::ReadInstructions
with flavor from lldb crashes. This is because the wrong order of theDisassemblyBytes
constructor this fixes that