diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-09-01 07:41:55 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-09-01 07:41:55 +0000 |
commit | 630784966617b620df1f99af31bfe90a9a983a97 (patch) | |
tree | c1e08d208a08c152df39575ce3ed71dc9059ad4f /clang/lib/Serialization/ASTWriter.cpp | |
parent | 84f92184174f88e0f89a1af298351be2c94d0c18 (diff) | |
download | bcm5719-llvm-630784966617b620df1f99af31bfe90a9a983a97.tar.gz bcm5719-llvm-630784966617b620df1f99af31bfe90a9a983a97.zip |
[modules] When emitting line tables, only emit filenames that are actually referenced by the entries that we emit.
llvm-svn: 246534
Diffstat (limited to 'clang/lib/Serialization/ASTWriter.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 0349378076c..225a00c942f 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1981,10 +1981,19 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, 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(SourceManager &SourceMgr, 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); } } |