1254721Semaste//===-- LineEntry.cpp -------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Symbol/LineEntry.h"
11254721Semaste#include "lldb/Symbol/CompileUnit.h"
12254721Semaste#include "lldb/Target/Process.h"
13254721Semaste#include "lldb/Target/Target.h"
14254721Semaste
15254721Semasteusing namespace lldb_private;
16254721Semaste
17254721SemasteLineEntry::LineEntry() :
18254721Semaste    range(),
19254721Semaste    file(),
20263363Semaste    line(LLDB_INVALID_LINE_NUMBER),
21254721Semaste    column(0),
22254721Semaste    is_start_of_statement(0),
23254721Semaste    is_start_of_basic_block(0),
24254721Semaste    is_prologue_end(0),
25254721Semaste    is_epilogue_begin(0),
26254721Semaste    is_terminal_entry(0)
27254721Semaste{
28254721Semaste}
29254721Semaste
30254721SemasteLineEntry::LineEntry
31254721Semaste(
32254721Semaste    const lldb::SectionSP &section_sp,
33254721Semaste    lldb::addr_t section_offset,
34254721Semaste    lldb::addr_t byte_size,
35254721Semaste    const FileSpec &_file,
36254721Semaste    uint32_t _line,
37254721Semaste    uint16_t _column,
38254721Semaste    bool _is_start_of_statement,
39254721Semaste    bool _is_start_of_basic_block,
40254721Semaste    bool _is_prologue_end,
41254721Semaste    bool _is_epilogue_begin,
42254721Semaste    bool _is_terminal_entry
43254721Semaste) :
44254721Semaste    range(section_sp, section_offset, byte_size),
45254721Semaste    file(_file),
46254721Semaste    line(_line),
47254721Semaste    column(_column),
48254721Semaste    is_start_of_statement(_is_start_of_statement),
49254721Semaste    is_start_of_basic_block(_is_start_of_basic_block),
50254721Semaste    is_prologue_end(_is_prologue_end),
51254721Semaste    is_epilogue_begin(_is_epilogue_begin),
52254721Semaste    is_terminal_entry(_is_terminal_entry)
53254721Semaste{
54254721Semaste}
55254721Semaste
56254721Semastevoid
57254721SemasteLineEntry::Clear()
58254721Semaste{
59254721Semaste    range.Clear();
60254721Semaste    file.Clear();
61263363Semaste    line = LLDB_INVALID_LINE_NUMBER;
62254721Semaste    column = 0;
63254721Semaste    is_start_of_statement = 0;
64254721Semaste    is_start_of_basic_block = 0;
65254721Semaste    is_prologue_end = 0;
66254721Semaste    is_epilogue_begin = 0;
67254721Semaste    is_terminal_entry = 0;
68254721Semaste}
69254721Semaste
70254721Semaste
71254721Semastebool
72254721SemasteLineEntry::IsValid() const
73254721Semaste{
74263363Semaste    return range.GetBaseAddress().IsValid() && line != LLDB_INVALID_LINE_NUMBER;
75254721Semaste}
76254721Semaste
77254721Semastebool
78254721SemasteLineEntry::DumpStopContext(Stream *s, bool show_fullpaths) const
79254721Semaste{
80254721Semaste    bool result = false;
81254721Semaste    if (file)
82254721Semaste    {
83254721Semaste        if (show_fullpaths)
84254721Semaste            file.Dump (s);
85254721Semaste        else
86254721Semaste            file.GetFilename().Dump (s);
87254721Semaste
88254721Semaste        if (line)
89254721Semaste            s->PutChar(':');
90254721Semaste        result = true;
91254721Semaste    }
92254721Semaste    if (line)
93254721Semaste        s->Printf ("%u", line);
94254721Semaste    else
95254721Semaste        result = false;
96254721Semaste
97254721Semaste    return result;
98254721Semaste}
99254721Semaste
100254721Semastebool
101254721SemasteLineEntry::Dump
102254721Semaste(
103254721Semaste    Stream *s,
104254721Semaste    Target *target,
105254721Semaste    bool show_file,
106254721Semaste    Address::DumpStyle style,
107254721Semaste    Address::DumpStyle fallback_style,
108254721Semaste    bool show_range
109254721Semaste) const
110254721Semaste{
111254721Semaste    if (show_range)
112254721Semaste    {
113254721Semaste        // Show address range
114254721Semaste        if (!range.Dump(s, target, style, fallback_style))
115254721Semaste            return false;
116254721Semaste    }
117254721Semaste    else
118254721Semaste    {
119254721Semaste        // Show address only
120254721Semaste        if (!range.GetBaseAddress().Dump(s,
121254721Semaste                                         target,
122254721Semaste                                         style,
123254721Semaste                                         fallback_style))
124254721Semaste            return false;
125254721Semaste    }
126254721Semaste    if (show_file)
127254721Semaste        *s << ", file = " << file;
128254721Semaste    if (line)
129254721Semaste        s->Printf(", line = %u", line);
130254721Semaste    if (column)
131254721Semaste        s->Printf(", column = %u", column);
132254721Semaste    if (is_start_of_statement)
133254721Semaste        *s << ", is_start_of_statement = TRUE";
134254721Semaste
135254721Semaste    if (is_start_of_basic_block)
136254721Semaste        *s << ", is_start_of_basic_block = TRUE";
137254721Semaste
138254721Semaste    if (is_prologue_end)
139254721Semaste        *s << ", is_prologue_end = TRUE";
140254721Semaste
141254721Semaste    if (is_epilogue_begin)
142254721Semaste        *s << ", is_epilogue_begin = TRUE";
143254721Semaste
144254721Semaste    if (is_terminal_entry)
145254721Semaste        *s << ", is_terminal_entry = TRUE";
146254721Semaste    return true;
147254721Semaste}
148254721Semaste
149254721Semastebool
150254721SemasteLineEntry::GetDescription (Stream *s, lldb::DescriptionLevel level, CompileUnit* cu, Target *target, bool show_address_only) const
151254721Semaste{
152254721Semaste
153254721Semaste    if (level == lldb::eDescriptionLevelBrief || level == lldb::eDescriptionLevelFull)
154254721Semaste    {
155254721Semaste        if (show_address_only)
156254721Semaste        {
157254721Semaste            range.GetBaseAddress().Dump(s, target, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
158254721Semaste        }
159254721Semaste        else
160254721Semaste        {
161254721Semaste            range.Dump(s, target, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
162254721Semaste        }
163254721Semaste
164254721Semaste        *s << ": " << file;
165254721Semaste
166254721Semaste        if (line)
167254721Semaste        {
168254721Semaste            s->Printf(":%u", line);
169254721Semaste            if (column)
170254721Semaste                s->Printf(":%u", column);
171254721Semaste        }
172254721Semaste
173254721Semaste
174254721Semaste        if (level == lldb::eDescriptionLevelFull)
175254721Semaste        {
176254721Semaste            if (is_start_of_statement)
177254721Semaste                *s << ", is_start_of_statement = TRUE";
178254721Semaste
179254721Semaste            if (is_start_of_basic_block)
180254721Semaste                *s << ", is_start_of_basic_block = TRUE";
181254721Semaste
182254721Semaste            if (is_prologue_end)
183254721Semaste                *s << ", is_prologue_end = TRUE";
184254721Semaste
185254721Semaste            if (is_epilogue_begin)
186254721Semaste                *s << ", is_epilogue_begin = TRUE";
187254721Semaste
188254721Semaste            if (is_terminal_entry)
189254721Semaste                *s << ", is_terminal_entry = TRUE";
190254721Semaste        }
191254721Semaste        else
192254721Semaste        {
193254721Semaste            if (is_terminal_entry)
194254721Semaste                s->EOL();
195254721Semaste        }
196254721Semaste    }
197254721Semaste    else
198254721Semaste    {
199254721Semaste        return Dump (s, target, true, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress, true);
200254721Semaste    }
201254721Semaste    return true;
202254721Semaste}
203254721Semaste
204254721Semaste
205254721Semastebool
206254721Semastelldb_private::operator< (const LineEntry& a, const LineEntry& b)
207254721Semaste{
208254721Semaste    return LineEntry::Compare (a, b) < 0;
209254721Semaste}
210254721Semaste
211254721Semasteint
212254721SemasteLineEntry::Compare (const LineEntry& a, const LineEntry& b)
213254721Semaste{
214254721Semaste    int result = Address::CompareFileAddress (a.range.GetBaseAddress(), b.range.GetBaseAddress());
215254721Semaste    if (result != 0)
216254721Semaste        return result;
217254721Semaste
218254721Semaste    const lldb::addr_t a_byte_size = a.range.GetByteSize();
219254721Semaste    const lldb::addr_t b_byte_size = b.range.GetByteSize();
220254721Semaste
221254721Semaste    if (a_byte_size < b_byte_size)
222254721Semaste        return -1;
223254721Semaste    if (a_byte_size > b_byte_size)
224254721Semaste        return +1;
225254721Semaste
226254721Semaste    // Check for an end sequence entry mismatch after we have determined
227254721Semaste    // that the address values are equal. If one of the items is an end
228254721Semaste    // sequence, we don't care about the line, file, or column info.
229254721Semaste    if (a.is_terminal_entry > b.is_terminal_entry)
230254721Semaste        return -1;
231254721Semaste    if (a.is_terminal_entry < b.is_terminal_entry)
232254721Semaste        return +1;
233254721Semaste
234254721Semaste    if (a.line < b.line)
235254721Semaste        return -1;
236254721Semaste    if (a.line > b.line)
237254721Semaste        return +1;
238254721Semaste
239254721Semaste    if (a.column < b.column)
240254721Semaste        return -1;
241254721Semaste    if (a.column > b.column)
242254721Semaste        return +1;
243254721Semaste
244254721Semaste    return FileSpec::Compare (a.file, b.file, true);
245254721Semaste}
246254721Semaste
247