If a function starts with line number 0, don't try to check if a breakpoint crossed...
authorJim Ingham <jingham@apple.com>
Tue, 7 Aug 2018 21:09:55 +0000 (21:09 +0000)
committerJim Ingham <jingham@apple.com>
Tue, 7 Aug 2018 21:09:55 +0000 (21:09 +0000)
clang doesn't use line number 0 (to mean artifically generated code) very often, but swift does it
quite often.  We were rejecting all by line breakpoints in functions that started at line 0.  But that's
a special marker so we can just not do this test in that case.

llvm-svn: 339182

lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/move_nearest/TestMoveNearest.py
lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/move_nearest/main.cpp
lldb/source/Breakpoint/BreakpointResolverFileLine.cpp

index 16d5bc75473cab31010974155ea972b5afe10a69..b8281e9c85bdf8750db103a41e3f8fcbc3cf5dd8 100644 (file)
@@ -18,6 +18,8 @@ class TestMoveNearest(TestBase):
         # Find the line number to break inside main().
         self.line1 = line_number('foo.h', '// !BR1')
         self.line2 = line_number('foo.h', '// !BR2')
+        self.line_between = line_number('main.cpp', "// BR_Between")
+        print("BR_Between found at", self.line_between)
         self.line_main = line_number('main.cpp', '// !BR_main')
 
     def test(self):
@@ -61,3 +63,7 @@ class TestMoveNearest(TestBase):
         # "return .."
         lldbutil.run_break_set_by_file_and_line(self, 'main.cpp',
                 self.line_main+2, extra_options="-m 1")
+
+        # Make sure we don't put move the breakpoint if it is set between two functions:
+        lldbutil.run_break_set_by_file_and_line(self, 'main.cpp',
+                self.line_between, extra_options="-m 1", num_expected_locations=0)
index c9295a5c7d3cceeb5ce18c696f7efdfb3771ab79..76a22a5420fed75df4d97fb6e7e98a10f948fca4 100644 (file)
@@ -1,7 +1,7 @@
 #include "foo.h"
 
 int call_foo2() { return foo2(); }
-
+// BR_Between
 int
 main() // !BR_main
 {
index ecef88eb99894ee1dd583d88ce6f22a8a6223358..a846f5bf9122fda7454177cdf216f04f26b29e72 100644 (file)
@@ -181,8 +181,12 @@ void BreakpointResolverFileLine::FilterContexts(SymbolContextList &sc_list,
     // inline int foo2() { ... }
     //
     // but that's the best we can do for now.
+    // One complication, if the line number returned from GetStartLineSourceInfo
+    // is 0, then we can't do this calculation.  That can happen if
+    // GetStartLineSourceInfo gets an error, or if the first line number in
+    // the function really is 0 - which happens for some languages.
     const int decl_line_is_too_late_fudge = 1;
-    if (m_line_number < line - decl_line_is_too_late_fudge) {
+    if (line && m_line_number < line - decl_line_is_too_late_fudge) {
       LLDB_LOG(log, "removing symbol context at {0}:{1}", file, line);
       sc_list.RemoveContextAtIndex(i);
       --i;