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 §ion_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