diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/NativeLineNumber.h b/llvm/include/llvm/DebugInfo/PDB/Native/NativeLineNumber.h --- a/llvm/include/llvm/DebugInfo/PDB/Native/NativeLineNumber.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/NativeLineNumber.h @@ -19,7 +19,8 @@ class NativeLineNumber : public IPDBLineNumber { public: explicit NativeLineNumber(const NativeSession &Session, - const codeview::LineInfo Line, uint32_t Length, + const codeview::LineInfo Line, + uint32_t ColumnNumber, uint32_t Length, uint32_t Section, uint32_t Offset, uint32_t SrcFileId); @@ -39,6 +40,7 @@ private: const NativeSession &Session; const codeview::LineInfo Line; + uint32_t ColumnNumber; uint32_t Section; uint32_t Offset; uint32_t Length; diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/SymbolCache.h b/llvm/include/llvm/DebugInfo/PDB/Native/SymbolCache.h --- a/llvm/include/llvm/DebugInfo/PDB/Native/SymbolCache.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/SymbolCache.h @@ -75,6 +75,7 @@ struct LineTableEntry { uint64_t Addr; codeview::LineInfo Line; + uint32_t ColumnNumber; uint32_t FileNameIndex; bool IsTerminalEntry; }; diff --git a/llvm/lib/DebugInfo/PDB/Native/NativeLineNumber.cpp b/llvm/lib/DebugInfo/PDB/Native/NativeLineNumber.cpp --- a/llvm/lib/DebugInfo/PDB/Native/NativeLineNumber.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/NativeLineNumber.cpp @@ -13,10 +13,11 @@ NativeLineNumber::NativeLineNumber(const NativeSession &Session, const codeview::LineInfo Line, - uint32_t Section, uint32_t Offset, - uint32_t Length, uint32_t SrcFileId) - : Session(Session), Line(Line), Section(Section), Offset(Offset), - Length(Length), SrcFileId(SrcFileId) {} + uint32_t ColumnNumber, uint32_t Section, + uint32_t Offset, uint32_t Length, + uint32_t SrcFileId) + : Session(Session), Line(Line), ColumnNumber(ColumnNumber), + Section(Section), Offset(Offset), Length(Length), SrcFileId(SrcFileId) {} uint32_t NativeLineNumber::getLineNumber() const { return Line.getStartLine(); } @@ -24,7 +25,7 @@ return Line.getEndLine(); } -uint32_t NativeLineNumber::getColumnNumber() const { return 0; } +uint32_t NativeLineNumber::getColumnNumber() const { return ColumnNumber; } uint32_t NativeLineNumber::getColumnNumberEnd() const { return 0; } diff --git a/llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp b/llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp --- a/llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp @@ -460,18 +460,30 @@ continue; std::vector Entries; - for (const LineNumberEntry &LN : Group.LineNumbers) { - LineInfo Line(LN.Flags); - uint64_t VA = - Session.getVAFromSectOffset(RelocSegment, RelocOffset + LN.Offset); - Entries.push_back({VA, Line, Group.NameIndex, false}); + auto LineIt = Group.LineNumbers.begin(); + auto ColIt = Group.Columns.begin(); + auto LinesEnd = Group.LineNumbers.end(); + auto ColsEnd = Group.Columns.end(); + for (; LineIt != LinesEnd; ++LineIt) { + uint64_t VA = Session.getVAFromSectOffset(RelocSegment, + RelocOffset + LineIt->Offset); + LineInfo Line(LineIt->Flags); + uint32_t ColNum = 0; + if (Lines.hasColumnInfo() && ColIt != ColsEnd) { + ColNum = ColIt->StartColumn; + ++ColIt; + } + Entries.push_back({VA, Line, ColNum, Group.NameIndex, false}); } // Add a terminal entry line to mark the end of this subsection. - LineInfo LastLine(Group.LineNumbers.back().Flags); uint64_t VA = Session.getVAFromSectOffset( RelocSegment, RelocOffset + Lines.header()->CodeSize); - Entries.push_back({VA, LastLine, Group.NameIndex, true}); + LineInfo LastLine(Group.LineNumbers.back().Flags); + uint32_t ColNum = + (Lines.hasColumnInfo()) ? Group.Columns.back().StartColumn : 0; + Entries.push_back({VA, LastLine, ColNum, Group.NameIndex, true}); + EntryList.push_back(Entries); } } @@ -571,8 +583,8 @@ auto ChecksumIter = ExpectedChecksums->getArray().at(LineIter->FileNameIndex); uint32_t SrcFileId = getOrCreateSourceFile(*ChecksumIter); - NativeLineNumber LineNum(Session, LineIter->Line, LineSect, LineOff, - LineLength, SrcFileId); + NativeLineNumber LineNum(Session, LineIter->Line, LineIter->ColumnNumber, + LineSect, LineOff, LineLength, SrcFileId); LineNumbers.push_back(LineNum); ++LineIter; }