124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- LineEntry.cpp -------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineEntry.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
13eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLineEntry::LineEntry() :
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    range(),
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    file(),
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line(0),
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    column(0),
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_start_of_statement(0),
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_start_of_basic_block(0),
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_prologue_end(0),
25cdcb156c0b35a54fd61c4adf52077c10d6e1cdfdEric Christopher    is_epilogue_begin(0),
26cdcb156c0b35a54fd61c4adf52077c10d6e1cdfdEric Christopher    is_terminal_entry(0)
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLineEntry::LineEntry
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
323508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    const lldb::SectionSP &section_sp,
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t section_offset,
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t byte_size,
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const FileSpec &_file,
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t _line,
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint16_t _column,
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool _is_start_of_statement,
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool _is_start_of_basic_block,
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool _is_prologue_end,
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool _is_epilogue_begin,
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool _is_terminal_entry
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
443508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    range(section_sp, section_offset, byte_size),
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    file(_file),
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line(_line),
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    column(_column),
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_start_of_statement(_is_start_of_statement),
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_start_of_basic_block(_is_start_of_basic_block),
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_prologue_end(_is_prologue_end),
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_epilogue_begin(_is_epilogue_begin),
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_terminal_entry(_is_terminal_entry)
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLineEntry::Clear()
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    range.Clear();
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    file.Clear();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line = 0;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    column = 0;
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_start_of_statement = 0;
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_start_of_basic_block = 0;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_prologue_end = 0;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_epilogue_begin = 0;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    is_terminal_entry = 0;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLineEntry::IsValid() const
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return range.GetBaseAddress().IsValid() && line != 0;
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
7872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg ClaytonLineEntry::DumpStopContext(Stream *s, bool show_fullpaths) const
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool result = false;
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (file)
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8372b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton        if (show_fullpaths)
8472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton            file.Dump (s);
8572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton        else
8672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton            file.GetFilename().Dump (s);
8772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (line)
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->PutChar(':');
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result = true;
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (line)
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf ("%u", line);
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result = false;
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLineEntry::Dump
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Stream *s,
104eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    Target *target,
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_file,
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address::DumpStyle style,
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address::DumpStyle fallback_style,
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_range
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) const
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (show_range)
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Show address range
114eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        if (!range.Dump(s, target, style, fallback_style))
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Show address only
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!range.GetBaseAddress().Dump(s,
121eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton                                         target,
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         style,
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         fallback_style))
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (show_file)
12712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        *s << ", file = " << file;
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (line)
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf(", line = %u", line);
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (column)
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf(", column = %u", column);
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_start_of_statement)
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", is_start_of_statement = TRUE";
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_start_of_basic_block)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", is_start_of_basic_block = TRUE";
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_prologue_end)
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", is_prologue_end = TRUE";
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_epilogue_begin)
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", is_epilogue_begin = TRUE";
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_terminal_entry)
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", is_terminal_entry = TRUE";
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
150eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonLineEntry::GetDescription (Stream *s, lldb::DescriptionLevel level, CompileUnit* cu, Target *target, bool show_address_only) const
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (level == lldb::eDescriptionLevelBrief || level == lldb::eDescriptionLevelFull)
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        if (show_address_only)
15612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        {
157eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton            range.GetBaseAddress().Dump(s, target, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
15812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        }
15912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        else
16012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        {
161eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton            range.Dump(s, target, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
16212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        }
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        *s << ": " << file;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (line)
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->Printf(":%u", line);
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (column)
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->Printf(":%u", column);
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (level == lldb::eDescriptionLevelFull)
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (is_start_of_statement)
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *s << ", is_start_of_statement = TRUE";
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (is_start_of_basic_block)
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *s << ", is_start_of_basic_block = TRUE";
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (is_prologue_end)
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *s << ", is_prologue_end = TRUE";
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (is_epilogue_begin)
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *s << ", is_epilogue_begin = TRUE";
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (is_terminal_entry)
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *s << ", is_terminal_entry = TRUE";
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (is_terminal_entry)
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->EOL();
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
199eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        return Dump (s, target, true, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress, true);
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator< (const LineEntry& a, const LineEntry& b)
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LineEntry::Compare (a, b) < 0;
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLineEntry::Compare (const LineEntry& a, const LineEntry& b)
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int result = Address::CompareFileAddress (a.range.GetBaseAddress(), b.range.GetBaseAddress());
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (result != 0)
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result;
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::addr_t a_byte_size = a.range.GetByteSize();
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::addr_t b_byte_size = b.range.GetByteSize();
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_byte_size < b_byte_size)
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_byte_size > b_byte_size)
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return +1;
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Check for an end sequence entry mismatch after we have determined
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // that the address values are equal. If one of the items is an end
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // sequence, we don't care about the line, file, or column info.
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a.is_terminal_entry > b.is_terminal_entry)
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a.is_terminal_entry < b.is_terminal_entry)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return +1;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a.line < b.line)
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a.line > b.line)
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return +1;
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a.column < b.column)
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a.column > b.column)
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return +1;
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FileSpec::Compare (a.file, b.file, true);
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
247