summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/FileLineResolver.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-04-19 04:19:37 +0000
committerGreg Clayton <gclayton@apple.com>2011-04-19 04:19:37 +0000
commit176761e530a96289fb5fed331272bc08ad4acf5b (patch)
treeeabe10abbbacbef5722f61d5687b6d7cd2652286 /lldb/source/Core/FileLineResolver.cpp
parent7d6cd4902e9a26b61b65eada1fe8685fbb9e6bac (diff)
downloadbcm5719-llvm-176761e530a96289fb5fed331272bc08ad4acf5b.tar.gz
bcm5719-llvm-176761e530a96289fb5fed331272bc08ad4acf5b.zip
Added a new option to the "source list" command that allows us to see where
line tables specify breakpoints can be set in the source. When dumping the source, the number of breakpoints that can be set on a source line are shown as a prefix: (lldb) source list -f test.c -l1 -c222 -b 1 #include <stdio.h> 2 #include <sys/fcntl.h> 3 #include <unistd.h> 4 int 5 sleep_loop (const int num_secs) [2] 6 { 7 int i; [1] 8 for (i=0; i<num_secs; ++i) 9 { [1] 10 printf("%d of %i - sleep(1);\n", i, num_secs); [1] 11 sleep(1); 12 } 13 return 0; [1] 14 } 15 16 int 17 main (int argc, char const* argv[]) [1] 18 { [1] 19 printf("Process: %i\n\n", getpid()); [1] 20 puts("Press any key to continue..."); getchar(); [1] 21 sleep_loop (20); 22 return 12; [1] 23 } Above we can see there are two breakpoints for line 6 and one breakpoint for lines 8, 10, 11, 14, 18, 19, 20, 21 and 23. All other lines have no line table entries for them. This helps visualize the data provided in the debug information without having to manually dump all line tables. It also includes all inline breakpoint that may result for a given file which can also be very handy to see. llvm-svn: 129747
Diffstat (limited to 'lldb/source/Core/FileLineResolver.cpp')
-rw-r--r--lldb/source/Core/FileLineResolver.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/lldb/source/Core/FileLineResolver.cpp b/lldb/source/Core/FileLineResolver.cpp
new file mode 100644
index 00000000000..9f5f3150a3d
--- /dev/null
+++ b/lldb/source/Core/FileLineResolver.cpp
@@ -0,0 +1,118 @@
+//===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Core/FileLineResolver.h"
+
+// Project includes
+#include "lldb/lldb-private-log.h"
+#include "lldb/Core/Log.h"
+#include "lldb/Core/StreamString.h"
+#include "lldb/Symbol/LineTable.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//----------------------------------------------------------------------
+// FileLineResolver:
+//----------------------------------------------------------------------
+FileLineResolver::FileLineResolver
+(
+ const FileSpec &file_spec,
+ uint32_t line_no,
+ bool check_inlines
+) :
+ Searcher (),
+ m_file_spec (file_spec),
+ m_line_number (line_no),
+ m_inlines (check_inlines)
+{
+}
+
+FileLineResolver::~FileLineResolver ()
+{
+}
+
+Searcher::CallbackReturn
+FileLineResolver::SearchCallback
+(
+ SearchFilter &filter,
+ SymbolContext &context,
+ Address *addr,
+ bool containing
+)
+{
+ CompileUnit *cu = context.comp_unit;
+
+ if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, m_file_spec.GetDirectory()))
+ {
+ uint32_t start_file_idx = 0;
+ uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec);
+ if (file_idx != UINT32_MAX)
+ {
+ LineTable *line_table = cu->GetLineTable();
+ if (line_table)
+ {
+ if (m_line_number == 0)
+ {
+ // Match all lines in a file...
+ const bool append = true;
+ while (file_idx != UINT32_MAX)
+ {
+ line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list);
+ // Get the next file index in case we have multiple file
+ // entries for the same file
+ file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec);
+ }
+ }
+ else
+ {
+ // Match a specific line in a file...
+ }
+ }
+ }
+ }
+ return Searcher::eCallbackReturnContinue;
+}
+
+Searcher::Depth
+FileLineResolver::GetDepth()
+{
+ return Searcher::eDepthCompUnit;
+}
+
+void
+FileLineResolver::GetDescription (Stream *s)
+{
+ s->Printf ("File and line resolver for file: \"%s%s%s\" line: %u",
+ m_file_spec.GetDirectory().GetCString(),
+ m_file_spec.GetDirectory() ? "/" : "",
+ m_file_spec.GetFilename().GetCString(),
+ m_line_number);
+}
+
+void
+FileLineResolver::Clear()
+{
+ m_file_spec.Clear();
+ m_line_number = UINT32_MAX;
+ m_sc_list.Clear();
+ m_inlines = true;
+}
+
+void
+FileLineResolver::Reset (const FileSpec &file_spec,
+ uint32_t line,
+ bool check_inlines)
+{
+ m_file_spec = file_spec;
+ m_line_number = line;
+ m_sc_list.Clear();
+ m_inlines = check_inlines;
+}
+
OpenPOWER on IntegriCloud