blob: 36f37f4a14d5c2da56b4e722a74b6bf4c95ef13d [file] [log] [blame]
Greg Clayton176761e2011-04-19 04:19:37 +00001//===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Core/FileLineResolver.h"
11
12// Project includes
Zachary Turner2f3df612017-04-06 21:28:29 +000013#include "lldb/Core/FileSpecList.h" // for FileSpecList
Greg Clayton1f746072012-08-29 21:13:06 +000014#include "lldb/Symbol/CompileUnit.h"
Greg Clayton176761e2011-04-19 04:19:37 +000015#include "lldb/Symbol/LineTable.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000016#include "lldb/Utility/ConstString.h" // for ConstString
17#include "lldb/Utility/Stream.h" // for Stream
18
19#include <string> // for string
20
21namespace lldb_private {
22class Address;
23}
Greg Clayton176761e2011-04-19 04:19:37 +000024
25using namespace lldb;
26using namespace lldb_private;
27
28//----------------------------------------------------------------------
29// FileLineResolver:
30//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +000031FileLineResolver::FileLineResolver(const FileSpec &file_spec, uint32_t line_no,
32 bool check_inlines)
33 : Searcher(), m_file_spec(file_spec), m_line_number(line_no),
34 m_inlines(check_inlines) {}
Greg Clayton176761e2011-04-19 04:19:37 +000035
Kate Stoneb9c1b512016-09-06 20:57:50 +000036FileLineResolver::~FileLineResolver() {}
Greg Clayton176761e2011-04-19 04:19:37 +000037
38Searcher::CallbackReturn
Kate Stoneb9c1b512016-09-06 20:57:50 +000039FileLineResolver::SearchCallback(SearchFilter &filter, SymbolContext &context,
40 Address *addr, bool containing) {
41 CompileUnit *cu = context.comp_unit;
Greg Clayton176761e2011-04-19 04:19:37 +000042
Kate Stoneb9c1b512016-09-06 20:57:50 +000043 if (m_inlines ||
44 m_file_spec.Compare(*cu, m_file_spec, (bool)m_file_spec.GetDirectory())) {
45 uint32_t start_file_idx = 0;
46 uint32_t file_idx =
47 cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false);
48 if (file_idx != UINT32_MAX) {
49 LineTable *line_table = cu->GetLineTable();
50 if (line_table) {
51 if (m_line_number == 0) {
52 // Match all lines in a file...
53 const bool append = true;
54 while (file_idx != UINT32_MAX) {
55 line_table->FineLineEntriesForFileIndex(file_idx, append,
56 m_sc_list);
57 // Get the next file index in case we have multiple file
58 // entries for the same file
59 file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1,
60 m_file_spec, false);
61 }
62 } else {
63 // Match a specific line in a file...
Greg Clayton176761e2011-04-19 04:19:37 +000064 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000065 }
Greg Clayton176761e2011-04-19 04:19:37 +000066 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000067 }
68 return Searcher::eCallbackReturnContinue;
Greg Clayton176761e2011-04-19 04:19:37 +000069}
70
Kate Stoneb9c1b512016-09-06 20:57:50 +000071Searcher::Depth FileLineResolver::GetDepth() {
72 return Searcher::eDepthCompUnit;
Greg Clayton176761e2011-04-19 04:19:37 +000073}
74
Kate Stoneb9c1b512016-09-06 20:57:50 +000075void FileLineResolver::GetDescription(Stream *s) {
76 s->Printf("File and line resolver for file: \"%s\" line: %u",
77 m_file_spec.GetPath().c_str(), m_line_number);
Greg Clayton176761e2011-04-19 04:19:37 +000078}
79
Kate Stoneb9c1b512016-09-06 20:57:50 +000080void FileLineResolver::Clear() {
81 m_file_spec.Clear();
82 m_line_number = UINT32_MAX;
83 m_sc_list.Clear();
84 m_inlines = true;
Greg Clayton176761e2011-04-19 04:19:37 +000085}
86
Kate Stoneb9c1b512016-09-06 20:57:50 +000087void FileLineResolver::Reset(const FileSpec &file_spec, uint32_t line,
88 bool check_inlines) {
89 m_file_spec = file_spec;
90 m_line_number = line;
91 m_sc_list.Clear();
92 m_inlines = check_inlines;
Greg Clayton176761e2011-04-19 04:19:37 +000093}