https://github.com/da-viper created https://github.com/llvm/llvm-project/pull/135778
Fixes #45326 When you thread jump by calling `j +2` or `thread jump --by +2` the offset is not recognised. This commit fixes that. >From de43c70a26f5c6fb72f836804f2b3ed6851a0cc7 Mon Sep 17 00:00:00 2001 From: Ebuka Ezike <yerimy...@gmail.com> Date: Tue, 15 Apr 2025 12:21:59 +0100 Subject: [PATCH 1/2] [Support] Recognise the '+' char for positive integers Fixes https://github.com/llvm/llvm-project/issues/45326 Signed-off-by: Ebuka Ezike <yerimy...@gmail.com> --- llvm/lib/Support/StringRef.cpp | 3 +++ llvm/unittests/ADT/StringRefTest.cpp | 28 +++++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) 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; >From c89501a8299e77c92554fa608968ba2cc670838e Mon Sep 17 00:00:00 2001 From: Ebuka Ezike <yerimy...@gmail.com> Date: Tue, 15 Apr 2025 12:25:41 +0100 Subject: [PATCH 2/2] [lldb] Add test for jumping by offset Signed-off-by: Ebuka Ezike <yerimy...@gmail.com> --- .../thread/jump/TestThreadJump.py | 70 ++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) 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) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits