-
Notifications
You must be signed in to change notification settings - Fork 13.3k
[Support] [lldb] Fix thread jump #45326 #135778
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
base: main
Are you sure you want to change the base?
Conversation
@llvm/pr-subscribers-llvm-binary-utilities @llvm/pr-subscribers-lldb Author: Ebuka Ezike (da-viper) ChangesFixes #45326 When you thread jump by calling Full diff: https://github.com/llvm/llvm-project/pull/135778.diff 3 Files Affected:
diff --git a/lldb/test/API/functionalities/thread/jump/TestThreadJump.py b/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
index 3c13a969bc3fd..d603580ac6f36 100644
--- a/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
+++ b/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
@@ -10,9 +10,12 @@
class ThreadJumpTestCase(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ self.build()
+
def test(self):
"""Test thread jump handling."""
- self.build()
exe = self.getBuildArtifact("a.out")
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
@@ -62,6 +65,71 @@ def test(self):
substrs=["error"],
)
+ def test_jump_offset(self):
+ """Test Thread Jump by negative or positive offset"""
+ exe = self.getBuildArtifact("a.out")
+ file_name = "main.cpp"
+ self.runCmd(f"target create {exe}", CURRENT_EXECUTABLE_SET)
+
+ pos_jump = line_number(file_name, "// jump_offset 1")
+ neg_jump = line_number(file_name, "// jump_offset 2")
+ pos_breakpoint = line_number(file_name, "// breakpoint 1")
+ neg_breakpoint = line_number(file_name, "// breakpoint 2")
+ pos_jump_offset = pos_jump - pos_breakpoint
+ neg_jump_offset = neg_jump - neg_breakpoint
+
+ var_1, var_1_value = ("var_1", "10")
+ var_2, var_2_value = ("var_2", "40")
+ var_3, var_3_value = ("var_3", "10")
+
+ # create pos_breakpoint and neg_breakpoint
+ lldbutil.run_break_set_by_file_and_line(
+ self, file_name, pos_breakpoint, num_expected_locations=1
+ )
+ lldbutil.run_break_set_by_file_and_line(
+ self, file_name, neg_breakpoint, num_expected_locations=1
+ )
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # test positive jump
+ # The stop reason of the thread should be breakpoint 1.
+ self.expect(
+ "thread list",
+ STOPPED_DUE_TO_BREAKPOINT + " 1",
+ substrs=[
+ "stopped",
+ f"{file_name}:{pos_breakpoint}",
+ "stop reason = breakpoint 1",
+ ],
+ )
+
+ self.runCmd(f"thread jump --by +{pos_jump_offset}")
+ self.expect("process status", substrs=[f"at {file_name}:{pos_jump}"])
+ self.expect(f"print {var_1}", substrs=[var_1_value])
+
+ self.runCmd("thread step-over")
+ self.expect(f"print {var_2}", substrs=[var_2_value])
+
+ self.runCmd("continue")
+
+ # test negative jump
+ # The stop reason of the thread should be breakpoint 1.
+ self.expect(
+ "thread list",
+ STOPPED_DUE_TO_BREAKPOINT + " 2",
+ substrs=[
+ "stopped",
+ f"{file_name}:{neg_breakpoint}",
+ "stop reason = breakpoint 2",
+ ],
+ )
+
+ self.runCmd(f"thread jump --by {neg_jump_offset}")
+ self.expect("process status", substrs=[f"at {file_name}:{neg_jump}"])
+ self.runCmd("thread step-over")
+ self.expect(f"print {var_3}", substrs=[var_3_value])
+
def do_min_test(self, start, jump, var, value):
# jump to the start marker
self.runCmd("j %i" % start)
diff --git a/llvm/lib/Support/StringRef.cpp b/llvm/lib/Support/StringRef.cpp
index 4f5fcb4857e80..bdf7a9aa5c7e0 100644
--- a/llvm/lib/Support/StringRef.cpp
+++ b/llvm/lib/Support/StringRef.cpp
@@ -409,6 +409,9 @@ static unsigned GetAutoSenseRadix(StringRef &Str) {
bool llvm::consumeUnsignedInteger(StringRef &Str, unsigned Radix,
unsigned long long &Result) {
+ // Consume the + value
+ Str.consume_front("+");
+
// Autosense radix if not specified.
if (Radix == 0)
Radix = GetAutoSenseRadix(Str);
diff --git a/llvm/unittests/ADT/StringRefTest.cpp b/llvm/unittests/ADT/StringRefTest.cpp
index ec9cdc197597d..55d222a915ab5 100644
--- a/llvm/unittests/ADT/StringRefTest.cpp
+++ b/llvm/unittests/ADT/StringRefTest.cpp
@@ -622,19 +622,21 @@ TEST(StringRefTest, Hashing) {
struct UnsignedPair {
const char *Str;
uint64_t Expected;
-} Unsigned[] =
- { {"0", 0}
- , {"255", 255}
- , {"256", 256}
- , {"65535", 65535}
- , {"65536", 65536}
- , {"4294967295", 4294967295ULL}
- , {"4294967296", 4294967296ULL}
- , {"18446744073709551615", 18446744073709551615ULL}
- , {"042", 34}
- , {"0x42", 66}
- , {"0b101010", 42}
- };
+} Unsigned[] = {{"0", 0},
+ {"255", 255},
+ {"256", 256},
+ {"65535", 65535},
+ {"65536", 65536},
+ {"4294967295", 4294967295ULL},
+ {"4294967296", 4294967296ULL},
+ {"18446744073709551615", 18446744073709551615ULL},
+ {"042", 34},
+ {"0x42", 66},
+ {"0b101010", 42},
+ {"+42", 42},
+ {"+042", 34},
+ {"+0x42", 66},
+ {"+0b101010", 42}};
struct SignedPair {
const char *Str;
|
@llvm/pr-subscribers-llvm-support Author: Ebuka Ezike (da-viper) ChangesFixes #45326 When you thread jump by calling Full diff: https://github.com/llvm/llvm-project/pull/135778.diff 3 Files Affected:
diff --git a/lldb/test/API/functionalities/thread/jump/TestThreadJump.py b/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
index 3c13a969bc3fd..d603580ac6f36 100644
--- a/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
+++ b/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
@@ -10,9 +10,12 @@
class ThreadJumpTestCase(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ self.build()
+
def test(self):
"""Test thread jump handling."""
- self.build()
exe = self.getBuildArtifact("a.out")
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
@@ -62,6 +65,71 @@ def test(self):
substrs=["error"],
)
+ def test_jump_offset(self):
+ """Test Thread Jump by negative or positive offset"""
+ exe = self.getBuildArtifact("a.out")
+ file_name = "main.cpp"
+ self.runCmd(f"target create {exe}", CURRENT_EXECUTABLE_SET)
+
+ pos_jump = line_number(file_name, "// jump_offset 1")
+ neg_jump = line_number(file_name, "// jump_offset 2")
+ pos_breakpoint = line_number(file_name, "// breakpoint 1")
+ neg_breakpoint = line_number(file_name, "// breakpoint 2")
+ pos_jump_offset = pos_jump - pos_breakpoint
+ neg_jump_offset = neg_jump - neg_breakpoint
+
+ var_1, var_1_value = ("var_1", "10")
+ var_2, var_2_value = ("var_2", "40")
+ var_3, var_3_value = ("var_3", "10")
+
+ # create pos_breakpoint and neg_breakpoint
+ lldbutil.run_break_set_by_file_and_line(
+ self, file_name, pos_breakpoint, num_expected_locations=1
+ )
+ lldbutil.run_break_set_by_file_and_line(
+ self, file_name, neg_breakpoint, num_expected_locations=1
+ )
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # test positive jump
+ # The stop reason of the thread should be breakpoint 1.
+ self.expect(
+ "thread list",
+ STOPPED_DUE_TO_BREAKPOINT + " 1",
+ substrs=[
+ "stopped",
+ f"{file_name}:{pos_breakpoint}",
+ "stop reason = breakpoint 1",
+ ],
+ )
+
+ self.runCmd(f"thread jump --by +{pos_jump_offset}")
+ self.expect("process status", substrs=[f"at {file_name}:{pos_jump}"])
+ self.expect(f"print {var_1}", substrs=[var_1_value])
+
+ self.runCmd("thread step-over")
+ self.expect(f"print {var_2}", substrs=[var_2_value])
+
+ self.runCmd("continue")
+
+ # test negative jump
+ # The stop reason of the thread should be breakpoint 1.
+ self.expect(
+ "thread list",
+ STOPPED_DUE_TO_BREAKPOINT + " 2",
+ substrs=[
+ "stopped",
+ f"{file_name}:{neg_breakpoint}",
+ "stop reason = breakpoint 2",
+ ],
+ )
+
+ self.runCmd(f"thread jump --by {neg_jump_offset}")
+ self.expect("process status", substrs=[f"at {file_name}:{neg_jump}"])
+ self.runCmd("thread step-over")
+ self.expect(f"print {var_3}", substrs=[var_3_value])
+
def do_min_test(self, start, jump, var, value):
# jump to the start marker
self.runCmd("j %i" % start)
diff --git a/llvm/lib/Support/StringRef.cpp b/llvm/lib/Support/StringRef.cpp
index 4f5fcb4857e80..bdf7a9aa5c7e0 100644
--- a/llvm/lib/Support/StringRef.cpp
+++ b/llvm/lib/Support/StringRef.cpp
@@ -409,6 +409,9 @@ static unsigned GetAutoSenseRadix(StringRef &Str) {
bool llvm::consumeUnsignedInteger(StringRef &Str, unsigned Radix,
unsigned long long &Result) {
+ // Consume the + value
+ Str.consume_front("+");
+
// Autosense radix if not specified.
if (Radix == 0)
Radix = GetAutoSenseRadix(Str);
diff --git a/llvm/unittests/ADT/StringRefTest.cpp b/llvm/unittests/ADT/StringRefTest.cpp
index ec9cdc197597d..55d222a915ab5 100644
--- a/llvm/unittests/ADT/StringRefTest.cpp
+++ b/llvm/unittests/ADT/StringRefTest.cpp
@@ -622,19 +622,21 @@ TEST(StringRefTest, Hashing) {
struct UnsignedPair {
const char *Str;
uint64_t Expected;
-} Unsigned[] =
- { {"0", 0}
- , {"255", 255}
- , {"256", 256}
- , {"65535", 65535}
- , {"65536", 65536}
- , {"4294967295", 4294967295ULL}
- , {"4294967296", 4294967296ULL}
- , {"18446744073709551615", 18446744073709551615ULL}
- , {"042", 34}
- , {"0x42", 66}
- , {"0b101010", 42}
- };
+} Unsigned[] = {{"0", 0},
+ {"255", 255},
+ {"256", 256},
+ {"65535", 65535},
+ {"65536", 65536},
+ {"4294967295", 4294967295ULL},
+ {"4294967296", 4294967296ULL},
+ {"18446744073709551615", 18446744073709551615ULL},
+ {"042", 34},
+ {"0x42", 66},
+ {"0b101010", 42},
+ {"+42", 42},
+ {"+042", 34},
+ {"+0x42", 66},
+ {"+0b101010", 42}};
struct SignedPair {
const char *Str;
|
@llvm/pr-subscribers-llvm-adt Author: Ebuka Ezike (da-viper) ChangesFixes #45326 When you thread jump by calling Full diff: https://github.com/llvm/llvm-project/pull/135778.diff 3 Files Affected:
diff --git a/lldb/test/API/functionalities/thread/jump/TestThreadJump.py b/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
index 3c13a969bc3fd..d603580ac6f36 100644
--- a/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
+++ b/lldb/test/API/functionalities/thread/jump/TestThreadJump.py
@@ -10,9 +10,12 @@
class ThreadJumpTestCase(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ self.build()
+
def test(self):
"""Test thread jump handling."""
- self.build()
exe = self.getBuildArtifact("a.out")
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
@@ -62,6 +65,71 @@ def test(self):
substrs=["error"],
)
+ def test_jump_offset(self):
+ """Test Thread Jump by negative or positive offset"""
+ exe = self.getBuildArtifact("a.out")
+ file_name = "main.cpp"
+ self.runCmd(f"target create {exe}", CURRENT_EXECUTABLE_SET)
+
+ pos_jump = line_number(file_name, "// jump_offset 1")
+ neg_jump = line_number(file_name, "// jump_offset 2")
+ pos_breakpoint = line_number(file_name, "// breakpoint 1")
+ neg_breakpoint = line_number(file_name, "// breakpoint 2")
+ pos_jump_offset = pos_jump - pos_breakpoint
+ neg_jump_offset = neg_jump - neg_breakpoint
+
+ var_1, var_1_value = ("var_1", "10")
+ var_2, var_2_value = ("var_2", "40")
+ var_3, var_3_value = ("var_3", "10")
+
+ # create pos_breakpoint and neg_breakpoint
+ lldbutil.run_break_set_by_file_and_line(
+ self, file_name, pos_breakpoint, num_expected_locations=1
+ )
+ lldbutil.run_break_set_by_file_and_line(
+ self, file_name, neg_breakpoint, num_expected_locations=1
+ )
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # test positive jump
+ # The stop reason of the thread should be breakpoint 1.
+ self.expect(
+ "thread list",
+ STOPPED_DUE_TO_BREAKPOINT + " 1",
+ substrs=[
+ "stopped",
+ f"{file_name}:{pos_breakpoint}",
+ "stop reason = breakpoint 1",
+ ],
+ )
+
+ self.runCmd(f"thread jump --by +{pos_jump_offset}")
+ self.expect("process status", substrs=[f"at {file_name}:{pos_jump}"])
+ self.expect(f"print {var_1}", substrs=[var_1_value])
+
+ self.runCmd("thread step-over")
+ self.expect(f"print {var_2}", substrs=[var_2_value])
+
+ self.runCmd("continue")
+
+ # test negative jump
+ # The stop reason of the thread should be breakpoint 1.
+ self.expect(
+ "thread list",
+ STOPPED_DUE_TO_BREAKPOINT + " 2",
+ substrs=[
+ "stopped",
+ f"{file_name}:{neg_breakpoint}",
+ "stop reason = breakpoint 2",
+ ],
+ )
+
+ self.runCmd(f"thread jump --by {neg_jump_offset}")
+ self.expect("process status", substrs=[f"at {file_name}:{neg_jump}"])
+ self.runCmd("thread step-over")
+ self.expect(f"print {var_3}", substrs=[var_3_value])
+
def do_min_test(self, start, jump, var, value):
# jump to the start marker
self.runCmd("j %i" % start)
diff --git a/llvm/lib/Support/StringRef.cpp b/llvm/lib/Support/StringRef.cpp
index 4f5fcb4857e80..bdf7a9aa5c7e0 100644
--- a/llvm/lib/Support/StringRef.cpp
+++ b/llvm/lib/Support/StringRef.cpp
@@ -409,6 +409,9 @@ static unsigned GetAutoSenseRadix(StringRef &Str) {
bool llvm::consumeUnsignedInteger(StringRef &Str, unsigned Radix,
unsigned long long &Result) {
+ // Consume the + value
+ Str.consume_front("+");
+
// Autosense radix if not specified.
if (Radix == 0)
Radix = GetAutoSenseRadix(Str);
diff --git a/llvm/unittests/ADT/StringRefTest.cpp b/llvm/unittests/ADT/StringRefTest.cpp
index ec9cdc197597d..55d222a915ab5 100644
--- a/llvm/unittests/ADT/StringRefTest.cpp
+++ b/llvm/unittests/ADT/StringRefTest.cpp
@@ -622,19 +622,21 @@ TEST(StringRefTest, Hashing) {
struct UnsignedPair {
const char *Str;
uint64_t Expected;
-} Unsigned[] =
- { {"0", 0}
- , {"255", 255}
- , {"256", 256}
- , {"65535", 65535}
- , {"65536", 65536}
- , {"4294967295", 4294967295ULL}
- , {"4294967296", 4294967296ULL}
- , {"18446744073709551615", 18446744073709551615ULL}
- , {"042", 34}
- , {"0x42", 66}
- , {"0b101010", 42}
- };
+} Unsigned[] = {{"0", 0},
+ {"255", 255},
+ {"256", 256},
+ {"65535", 65535},
+ {"65536", 65536},
+ {"4294967295", 4294967295ULL},
+ {"4294967296", 4294967296ULL},
+ {"18446744073709551615", 18446744073709551615ULL},
+ {"042", 34},
+ {"0x42", 66},
+ {"0b101010", 42},
+ {"+42", 42},
+ {"+042", 34},
+ {"+0x42", 66},
+ {"+0b101010", 42}};
struct SignedPair {
const char *Str;
|
becf2af
to
90ec3ff
Compare
having a $ projects/test_lldb → addr2line --exe=/home/test/Inputs/symbols.so 0x1138
/tmp/dbginfo/symbols.part1.cpp:12
$ projects/test_lldb → addr2line --exe=/home/test/Inputs/symbols.so +0x1138
/tmp/dbginfo/symbols.part1.cpp:12
$ projects/test_lldb → addr2line --exe=/home/test/Inputs/symbols.so -a +0x1138
0x0000000000001138
/tmp/dbginfo/symbols.part1.cpp:12 |
Looks like this could/should be 2-3 comits. The ADT change is one, the llvm-symbolizer could be another (with or without the lldb test coverage), then possibly the lldb test coverage as a separate third step. (the contents of the patch I don't have much opinion on, I haven't even thought about whether the ADT change is good/bad, etc) |
I wasn't sure if I should split it as they are quite small on their own. Will create a two new PR for the |
Signed-off-by: Ebuka Ezike <yerimyah1@gmail.com>
Signed-off-by: Ebuka Ezike <yerimyah1@gmail.com>
f5c3ac9
to
6704733
Compare
Fixes #45326
Depends on #135856
When you thread jump by calling
j +2
orthread jump --by +2
the offset is not recognised. This commit fixes that.