diff options
| author | Zachary Turner <zturner@google.com> | 2017-05-22 21:07:43 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2017-05-22 21:07:43 +0000 |
| commit | d4136e945ed7d057b4bb376eb6f5299c76d31614 (patch) | |
| tree | eaf8fea85482f220bed24293bd44ee5ba7016194 /llvm/tools | |
| parent | 12f8c31c04eaa72e480f95ee8123c3aa3dbebcca (diff) | |
| download | bcm5719-llvm-d4136e945ed7d057b4bb376eb6f5299c76d31614.tar.gz bcm5719-llvm-d4136e945ed7d057b4bb376eb6f5299c76d31614.zip | |
Implement various flavors of type merging.
Previous algotirhm assumed that types and ids are in a single
unified stream. For inputs that come from object files, this
is the case. But if the input is already a PDB, or is the result
of a previous merge, then the types and ids will already have
been split up, in which case we need an algorithm that can
accept operate on independent streams of types and ids that
refer across stream boundaries to each other.
Differential Revision: https://reviews.llvm.org/D33417
llvm-svn: 303577
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 18 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 5 |
2 files changed, 12 insertions, 11 deletions
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index 50ee5f4d0ac..3394d3268dd 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -500,6 +500,7 @@ static void yamlToPdb(StringRef Path) { pdb::yaml::PdbInfoStream DefaultInfoStream; pdb::yaml::PdbDbiStream DefaultDbiStream; pdb::yaml::PdbTpiStream DefaultTpiStream; + pdb::yaml::PdbTpiStream DefaultIpiStream; const auto &Info = YamlObj.PdbStream.getValueOr(DefaultInfoStream); @@ -601,11 +602,11 @@ static void yamlToPdb(StringRef Path) { for (const auto &R : Tpi.Records) TpiBuilder.addTypeRecord(R.Record.data(), R.Record.Hash); - const auto &Ipi = YamlObj.IpiStream.getValueOr(DefaultTpiStream); + const auto &Ipi = YamlObj.IpiStream.getValueOr(DefaultIpiStream); auto &IpiBuilder = Builder.getIpiBuilder(); IpiBuilder.setVersionHeader(Ipi.Version); for (const auto &R : Ipi.Records) - TpiBuilder.addTypeRecord(R.Record.data(), R.Record.Hash); + IpiBuilder.addTypeRecord(R.Record.data(), R.Record.Hash); ExitOnErr(Builder.commit(opts::yaml2pdb::YamlPdbOutputFile)); } @@ -852,18 +853,17 @@ static void mergePdbs() { for (const auto &Path : opts::merge::InputFilenames) { std::unique_ptr<IPDBSession> Session; auto &File = loadPDB(Path, Session); - SmallVector<TypeIndex, 128> SourceToDest; + SmallVector<TypeIndex, 128> TypeMap; + SmallVector<TypeIndex, 128> IdMap; if (File.hasPDBTpiStream()) { - SourceToDest.clear(); auto &Tpi = ExitOnErr(File.getPDBTpiStream()); - ExitOnErr(codeview::mergeTypeStreams(MergedIpi, MergedTpi, SourceToDest, - nullptr, Tpi.typeArray())); + ExitOnErr(codeview::mergeTypeRecords(MergedTpi, TypeMap, nullptr, + Tpi.typeCollection())); } if (File.hasPDBIpiStream()) { - SourceToDest.clear(); auto &Ipi = ExitOnErr(File.getPDBIpiStream()); - ExitOnErr(codeview::mergeTypeStreams(MergedIpi, MergedTpi, SourceToDest, - nullptr, Ipi.typeArray())); + ExitOnErr(codeview::mergeIdRecords(MergedIpi, TypeMap, IdMap, + Ipi.typeCollection())); } } diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 78bfa558e4a..96adf49ed69 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -1072,9 +1072,10 @@ void COFFDumper::mergeCodeViewTypes(TypeTableBuilder &CVIDs, W.flush(); error(object_error::parse_failed); } + LazyRandomTypeCollection TypesAndIds(Types, 100); SmallVector<TypeIndex, 128> SourceToDest; - if (auto EC = - mergeTypeStreams(CVIDs, CVTypes, SourceToDest, nullptr, Types)) + if (auto EC = mergeTypeAndIdRecords(CVIDs, CVTypes, SourceToDest, nullptr, + TypesAndIds)) return error(std::move(EC)); } } |

