Author: rsmith Date: Tue Sep 1 02:41:55 2015 New Revision: 246534 URL: http://llvm.org/viewvc/llvm-project?rev=246534&view=rev Log: [modules] When emitting line tables, only emit filenames that are actually referenced by the entries that we emit.
Modified: cfe/trunk/lib/Serialization/ASTReader.cpp cfe/trunk/lib/Serialization/ASTWriter.cpp Modified: cfe/trunk/lib/Serialization/ASTReader.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=246534&r1=246533&r2=246534&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) +++ cfe/trunk/lib/Serialization/ASTReader.cpp Tue Sep 1 02:41:55 2015 @@ -1058,11 +1058,12 @@ bool ASTReader::ParseLineTable(ModuleFil // Parse the file names std::map<int, int> FileIDs; - for (int I = 0, N = Record[Idx++]; I != N; ++I) { + for (unsigned I = 0; Record[Idx]; ++I) { // Extract the file name auto Filename = ReadPath(F, Record, Idx); FileIDs[I] = LineTable.getLineTableFilenameID(Filename); } + ++Idx; // Parse the line entries std::vector<LineEntry> Entries; @@ -1074,7 +1075,7 @@ bool ASTReader::ParseLineTable(ModuleFil // Extract the line entries unsigned NumEntries = Record[Idx++]; - assert(NumEntries && "Numentries is 00000"); + assert(NumEntries && "no line entries for file ID"); Entries.clear(); Entries.reserve(NumEntries); for (unsigned I = 0; I != NumEntries; ++I) { Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=246534&r1=246533&r2=246534&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Tue Sep 1 02:41:55 2015 @@ -1981,10 +1981,19 @@ void ASTWriter::WriteSourceManagerBlock( LineTableInfo &LineTable = SourceMgr.getLineTable(); Record.clear(); - // Emit the file names. - Record.push_back(LineTable.getNumFilenames()); - for (unsigned I = 0, N = LineTable.getNumFilenames(); I != N; ++I) - AddPath(LineTable.getFilename(I), Record); + + // Emit the needed file names. + llvm::DenseMap<int, int> FilenameMap; + for (const auto &L : LineTable) { + if (L.first.ID < 0) + continue; + for (auto &LE : L.second) { + if (FilenameMap.insert(std::make_pair(LE.FilenameID, + FilenameMap.size())).second) + AddPath(LineTable.getFilename(LE.FilenameID), Record); + } + } + Record.push_back(0); // Emit the line entries for (LineTableInfo::iterator L = LineTable.begin(), LEnd = LineTable.end(); @@ -2003,11 +2012,12 @@ void ASTWriter::WriteSourceManagerBlock( LE != LEEnd; ++LE) { Record.push_back(LE->FileOffset); Record.push_back(LE->LineNo); - Record.push_back(LE->FilenameID); + Record.push_back(FilenameMap[LE->FilenameID]); Record.push_back((unsigned)LE->FileKind); Record.push_back(LE->IncludeOffset); } } + Stream.EmitRecord(SOURCE_MANAGER_LINE_TABLE, Record); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits