Skip to content

[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

Merged
merged 4 commits into from
Apr 11, 2025

Conversation

da-viper
Copy link
Contributor

@da-viper da-viper commented Apr 7, 2025

When you call the SBTarget::ReadInstructions with flavor from lldb crashes. This is because the wrong order of the DisassemblyBytes constructor this fixes that

da-viper added 2 commits April 7, 2025 10:24
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]>
@da-viper da-viper requested a review from JDevlieghere as a code owner April 7, 2025 13:28
@llvmbot llvmbot added the lldb label Apr 7, 2025
@llvmbot
Copy link
Member

llvmbot commented Apr 7, 2025

@llvm/pr-subscribers-lldb

Author: Ebuka Ezike (da-viper)

Changes

When you call the SBTarget::ReadInstructions with flavor from lldb crashes. This is because the wrong order of the DisassemblyBytes constructor this fixes that


Full diff: https://github.com/llvm/llvm-project/pull/134626.diff

4 Files Affected:

  • (modified) lldb/source/API/SBTarget.cpp (+3-3)
  • (added) lldb/test/API/python_api/target/read-instructions-flavor/Makefile (+3)
  • (added) lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py (+40)
  • (added) lldb/test/API/python_api/target/read-instructions-flavor/main.c (+21)
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

Copy link

github-actions bot commented Apr 7, 2025

✅ With the latest revision this PR passed the Python code formatter.

Signed-off-by: Ebuka Ezike <[email protected]>
Copy link
Collaborator

@jimingham jimingham left a 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!

@da-viper
Copy link
Contributor Author

da-viper commented Apr 7, 2025

I was also wondering if this should be backported as it also affects llvm 20.x branch

da-viper added a commit to da-viper/llvm-project that referenced this pull request Apr 7, 2025
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets.

Depends on llvm#134626
@JDevlieghere
Copy link
Member

I was also wondering if this should be backported as it also affects llvm 20.x branch

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.

@da-viper
Copy link
Contributor Author

da-viper commented Apr 9, 2025

I think it should be.
Most distributions are still on llvm 19 as llvm 20.1 was released last month. Maybe that's why there haven't been any reports.

This only affects the 20 and 21 branches.

@da-viper
Copy link
Contributor Author

/cherry-pick 6c8b0a3 4be5e33 7417e79

@llvmbot
Copy link
Member

llvmbot commented Apr 11, 2025

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

@da-viper da-viper merged commit dda53be into llvm:main Apr 11, 2025
10 checks passed
@github-project-automation github-project-automation bot moved this from Needs Triage to Done in LLVM Release Status Apr 11, 2025
DavidSpickett added a commit that referenced this pull request Apr 11, 2025
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.
@da-viper
Copy link
Contributor Author

separate it like this then it does not and it.

    @skipIf(archs=no_match(["x86_64", "x86", "i386"]))
    @skipIfWindows

@da-viper
Copy link
Contributor Author

@DavidSpickett is there a way to run the merge build bot before merging to check if the test passes on other platforms ?

llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this pull request Apr 11, 2025
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.
@DavidSpickett
Copy link
Collaborator

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.

@ilovepi
Copy link
Contributor

ilovepi commented Apr 11, 2025

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.

@da-viper
Copy link
Contributor Author

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.

@ilovepi
Copy link
Contributor

ilovepi commented Apr 11, 2025

@da-viper Ah, shoot. Sorry for the noise, I think it may have been 2fd860c, which was just reverted. thanks for taking a look. :)

@da-viper
Copy link
Contributor Author

/cherrypick dda53be 5b384c3

da-viper added a commit to da-viper/llvm-project that referenced this pull request Apr 16, 2025
Ensure the disassembly respects the "target.x86-disassembly-flavor" setting for x86 and x86_64 targets.

Depends on llvm#134626
da-viper added a commit to da-viper/llvm-project that referenced this pull request Apr 16, 2025
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]>
da-viper pushed a commit to da-viper/llvm-project that referenced this pull request Apr 16, 2025
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.
var-const pushed a commit to ldionne/llvm-project that referenced this pull request Apr 17, 2025
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]>
var-const pushed a commit to ldionne/llvm-project that referenced this pull request Apr 17, 2025
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.
swift-ci pushed a commit to swiftlang/llvm-project that referenced this pull request Apr 25, 2025
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]>
swift-ci pushed a commit to swiftlang/llvm-project that referenced this pull request Apr 25, 2025
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.
da-viper added a commit that referenced this pull request Apr 27, 2025
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]>
jyli0116 pushed a commit to jyli0116/llvm-project that referenced this pull request Apr 28, 2025
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]>
IanWood1 pushed a commit to IanWood1/llvm-project that referenced this pull request May 6, 2025
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]>
IanWood1 pushed a commit to IanWood1/llvm-project that referenced this pull request May 6, 2025
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]>
IanWood1 pushed a commit to IanWood1/llvm-project that referenced this pull request May 6, 2025
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]>
Ankur-0429 pushed a commit to Ankur-0429/llvm-project that referenced this pull request May 9, 2025
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]>
llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this pull request May 15, 2025
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Development

Successfully merging this pull request may close these issues.

6 participants