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