Loading lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +19 −19 Original line number Diff line number Diff line Loading @@ -1021,7 +1021,7 @@ uint32_t SymbolFileNativePDB::ResolveSymbolContext( return 0; } static void AppendLineEntryToSequence(LineSequence &sequence, static void AppendLineEntryToSequence(LineTable &table, LineSequence &sequence, const CompilandIndexItem &cci, lldb::addr_t base_addr, uint32_t file_number, Loading @@ -1040,18 +1040,21 @@ static void AppendLineEntryToSequence(LineSequence &sequence, uint32_t lno = cur_info.getStartLine(); LineTable::AppendLineEntryToSequence(&sequence, addr, lno, 0, file_number, is_statement, false, is_prologue, is_epilogue, false); table.AppendLineEntryToSequence(&sequence, addr, lno, 0, file_number, is_statement, false, is_prologue, is_epilogue, false); } static void TerminateLineSequence(const LineFragmentHeader &block, static void TerminateLineSequence(LineTable &table, const LineFragmentHeader &block, lldb::addr_t base_addr, uint32_t file_number, uint32_t last_line, LineSequence &seq) { uint32_t last_line, std::unique_ptr<LineSequence> seq) { // The end is always a terminal entry, so insert it regardless. LineTable::AppendLineEntryToSequence(&seq, base_addr + block.CodeSize, table.AppendLineEntryToSequence(seq.get(), base_addr + block.CodeSize, last_line, 0, file_number, false, false, false, false, true); table.InsertSequence(seq.release()); } bool SymbolFileNativePDB::ParseLineTable(CompileUnit &comp_unit) { Loading @@ -1065,11 +1068,11 @@ bool SymbolFileNativePDB::ParseLineTable(CompileUnit &comp_unit) { CompilandIndexItem *cci = m_index->compilands().GetCompiland(cu_id.asCompiland().modi); lldbassert(cci); auto line_table = std::make_unique<LineTable>(&comp_unit); // This is basically a copy of the .debug$S subsections from all original COFF // object files merged together with address relocations applied. We are // looking for all DEBUG_S_LINES subsections. std::vector<std::unique_ptr<LineSequence>> sequences; for (const DebugSubsectionRecord &dssr : cci->m_debug_stream.getSubsectionsArray()) { if (dssr.kind() != DebugSubsectionKind::Lines) Loading Loading @@ -1108,23 +1111,20 @@ bool SymbolFileNativePDB::ParseLineTable(CompileUnit &comp_unit) { lldbassert(fn_iter != cci->m_file_list.end()); uint32_t file_index = std::distance(cci->m_file_list.begin(), fn_iter); std::unique_ptr<LineSequence> sequence = LineTable::CreateLineSequenceContainer(); std::unique_ptr<LineSequence> sequence( line_table->CreateLineSequenceContainer()); lldbassert(!group.LineNumbers.empty()); for (const LineNumberEntry &entry : group.LineNumbers) { AppendLineEntryToSequence(*sequence, *cci, virtual_addr, file_index, *lfh, entry); AppendLineEntryToSequence(*line_table, *sequence, *cci, virtual_addr, file_index, *lfh, entry); } LineInfo last_line(group.LineNumbers.back().Flags); TerminateLineSequence(*lfh, virtual_addr, file_index, last_line.getEndLine(), *sequence); sequences.push_back(std::move(sequence)); TerminateLineSequence(*line_table, *lfh, virtual_addr, file_index, last_line.getEndLine(), std::move(sequence)); } } auto line_table = std::make_unique<LineTable>(&comp_unit, std::move(sequences)); if (line_table->GetSize() == 0) return false; Loading lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +11 −13 Original line number Diff line number Diff line Loading @@ -1772,6 +1772,7 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, // to do a mapping so that we can hand out indices. llvm::DenseMap<uint32_t, uint32_t> index_map; BuildSupportFileIdToSupportFileIndexMap(*compiland_up, index_map); auto line_table = std::make_unique<LineTable>(&comp_unit); // Find contributions to `compiland` from all source and header files. auto files = m_session_up->getSourceFilesForCompiland(*compiland_up); Loading @@ -1780,10 +1781,9 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, // For each source and header file, create a LineSequence for contributions // to the compiland from that file, and add the sequence. std::vector<std::unique_ptr<LineSequence>> sequences; while (auto file = files->getNext()) { std::unique_ptr<LineSequence> sequence = LineTable::CreateLineSequenceContainer(); std::unique_ptr<LineSequence> sequence( line_table->CreateLineSequenceContainer()); auto lines = m_session_up->findLineNumbers(*compiland_up, *file); if (!lines) continue; Loading Loading @@ -1812,12 +1812,12 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, // of the previous entry's address range if the current entry resulted in // a gap from the previous entry. if (is_gap && ShouldAddLine(match_line, prev_line, prev_length)) { LineTable::AppendLineEntryToSequence( line_table->AppendLineEntryToSequence( sequence.get(), prev_addr + prev_length, prev_line, 0, prev_source_idx, false, false, false, false, true); sequences.push_back(std::move(sequence)); sequence = LineTable::CreateLineSequenceContainer(); line_table->InsertSequence(sequence.release()); sequence = line_table->CreateLineSequenceContainer(); } if (ShouldAddLine(match_line, lno, length)) { Loading @@ -1836,7 +1836,7 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, is_epilogue = (addr == epilogue->getVirtualAddress()); } LineTable::AppendLineEntryToSequence(sequence.get(), addr, lno, col, line_table->AppendLineEntryToSequence(sequence.get(), addr, lno, col, source_idx, is_statement, false, is_prologue, is_epilogue, false); } Loading @@ -1849,16 +1849,14 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, if (entry_count > 0 && ShouldAddLine(match_line, prev_line, prev_length)) { // The end is always a terminal entry, so insert it regardless. LineTable::AppendLineEntryToSequence( line_table->AppendLineEntryToSequence( sequence.get(), prev_addr + prev_length, prev_line, 0, prev_source_idx, false, false, false, false, true); } sequences.push_back(std::move(sequence)); line_table->InsertSequence(sequence.get()); } auto line_table = std::make_unique<LineTable>(&comp_unit, std::move(sequences)); if (line_table->GetSize()) { comp_unit.SetLineTable(line_table.release()); return true; Loading Loading
lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +19 −19 Original line number Diff line number Diff line Loading @@ -1021,7 +1021,7 @@ uint32_t SymbolFileNativePDB::ResolveSymbolContext( return 0; } static void AppendLineEntryToSequence(LineSequence &sequence, static void AppendLineEntryToSequence(LineTable &table, LineSequence &sequence, const CompilandIndexItem &cci, lldb::addr_t base_addr, uint32_t file_number, Loading @@ -1040,18 +1040,21 @@ static void AppendLineEntryToSequence(LineSequence &sequence, uint32_t lno = cur_info.getStartLine(); LineTable::AppendLineEntryToSequence(&sequence, addr, lno, 0, file_number, is_statement, false, is_prologue, is_epilogue, false); table.AppendLineEntryToSequence(&sequence, addr, lno, 0, file_number, is_statement, false, is_prologue, is_epilogue, false); } static void TerminateLineSequence(const LineFragmentHeader &block, static void TerminateLineSequence(LineTable &table, const LineFragmentHeader &block, lldb::addr_t base_addr, uint32_t file_number, uint32_t last_line, LineSequence &seq) { uint32_t last_line, std::unique_ptr<LineSequence> seq) { // The end is always a terminal entry, so insert it regardless. LineTable::AppendLineEntryToSequence(&seq, base_addr + block.CodeSize, table.AppendLineEntryToSequence(seq.get(), base_addr + block.CodeSize, last_line, 0, file_number, false, false, false, false, true); table.InsertSequence(seq.release()); } bool SymbolFileNativePDB::ParseLineTable(CompileUnit &comp_unit) { Loading @@ -1065,11 +1068,11 @@ bool SymbolFileNativePDB::ParseLineTable(CompileUnit &comp_unit) { CompilandIndexItem *cci = m_index->compilands().GetCompiland(cu_id.asCompiland().modi); lldbassert(cci); auto line_table = std::make_unique<LineTable>(&comp_unit); // This is basically a copy of the .debug$S subsections from all original COFF // object files merged together with address relocations applied. We are // looking for all DEBUG_S_LINES subsections. std::vector<std::unique_ptr<LineSequence>> sequences; for (const DebugSubsectionRecord &dssr : cci->m_debug_stream.getSubsectionsArray()) { if (dssr.kind() != DebugSubsectionKind::Lines) Loading Loading @@ -1108,23 +1111,20 @@ bool SymbolFileNativePDB::ParseLineTable(CompileUnit &comp_unit) { lldbassert(fn_iter != cci->m_file_list.end()); uint32_t file_index = std::distance(cci->m_file_list.begin(), fn_iter); std::unique_ptr<LineSequence> sequence = LineTable::CreateLineSequenceContainer(); std::unique_ptr<LineSequence> sequence( line_table->CreateLineSequenceContainer()); lldbassert(!group.LineNumbers.empty()); for (const LineNumberEntry &entry : group.LineNumbers) { AppendLineEntryToSequence(*sequence, *cci, virtual_addr, file_index, *lfh, entry); AppendLineEntryToSequence(*line_table, *sequence, *cci, virtual_addr, file_index, *lfh, entry); } LineInfo last_line(group.LineNumbers.back().Flags); TerminateLineSequence(*lfh, virtual_addr, file_index, last_line.getEndLine(), *sequence); sequences.push_back(std::move(sequence)); TerminateLineSequence(*line_table, *lfh, virtual_addr, file_index, last_line.getEndLine(), std::move(sequence)); } } auto line_table = std::make_unique<LineTable>(&comp_unit, std::move(sequences)); if (line_table->GetSize() == 0) return false; Loading
lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +11 −13 Original line number Diff line number Diff line Loading @@ -1772,6 +1772,7 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, // to do a mapping so that we can hand out indices. llvm::DenseMap<uint32_t, uint32_t> index_map; BuildSupportFileIdToSupportFileIndexMap(*compiland_up, index_map); auto line_table = std::make_unique<LineTable>(&comp_unit); // Find contributions to `compiland` from all source and header files. auto files = m_session_up->getSourceFilesForCompiland(*compiland_up); Loading @@ -1780,10 +1781,9 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, // For each source and header file, create a LineSequence for contributions // to the compiland from that file, and add the sequence. std::vector<std::unique_ptr<LineSequence>> sequences; while (auto file = files->getNext()) { std::unique_ptr<LineSequence> sequence = LineTable::CreateLineSequenceContainer(); std::unique_ptr<LineSequence> sequence( line_table->CreateLineSequenceContainer()); auto lines = m_session_up->findLineNumbers(*compiland_up, *file); if (!lines) continue; Loading Loading @@ -1812,12 +1812,12 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, // of the previous entry's address range if the current entry resulted in // a gap from the previous entry. if (is_gap && ShouldAddLine(match_line, prev_line, prev_length)) { LineTable::AppendLineEntryToSequence( line_table->AppendLineEntryToSequence( sequence.get(), prev_addr + prev_length, prev_line, 0, prev_source_idx, false, false, false, false, true); sequences.push_back(std::move(sequence)); sequence = LineTable::CreateLineSequenceContainer(); line_table->InsertSequence(sequence.release()); sequence = line_table->CreateLineSequenceContainer(); } if (ShouldAddLine(match_line, lno, length)) { Loading @@ -1836,7 +1836,7 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, is_epilogue = (addr == epilogue->getVirtualAddress()); } LineTable::AppendLineEntryToSequence(sequence.get(), addr, lno, col, line_table->AppendLineEntryToSequence(sequence.get(), addr, lno, col, source_idx, is_statement, false, is_prologue, is_epilogue, false); } Loading @@ -1849,16 +1849,14 @@ bool SymbolFilePDB::ParseCompileUnitLineTable(CompileUnit &comp_unit, if (entry_count > 0 && ShouldAddLine(match_line, prev_line, prev_length)) { // The end is always a terminal entry, so insert it regardless. LineTable::AppendLineEntryToSequence( line_table->AppendLineEntryToSequence( sequence.get(), prev_addr + prev_length, prev_line, 0, prev_source_idx, false, false, false, false, true); } sequences.push_back(std::move(sequence)); line_table->InsertSequence(sequence.get()); } auto line_table = std::make_unique<LineTable>(&comp_unit, std::move(sequences)); if (line_table->GetSize()) { comp_unit.SetLineTable(line_table.release()); return true; Loading