[PATCH] D63178: [lld] Fix type server merging with PDBs without IPI stream
Reid Kleckner via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 12 15:30:36 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL363213: [lld] Fix type server merging with PDBs without IPI stream (authored by rnk, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D63178?vs=204196&id=204374#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D63178/new/
https://reviews.llvm.org/D63178
Files:
lld/trunk/COFF/PDB.cpp
lld/trunk/test/COFF/Inputs/no-ipi-stream-obj.obj.yaml
lld/trunk/test/COFF/Inputs/no-ipi-stream-pdb.pdb.yaml
lld/trunk/test/COFF/no-ipi-stream.test
Index: lld/trunk/COFF/PDB.cpp
===================================================================
--- lld/trunk/COFF/PDB.cpp
+++ lld/trunk/COFF/PDB.cpp
@@ -434,9 +434,13 @@
Expected<pdb::TpiStream &> ExpectedTpi = PDBFile.getPDBTpiStream();
if (auto E = ExpectedTpi.takeError())
fatal("Type server does not have TPI stream: " + toString(std::move(E)));
- Expected<pdb::TpiStream &> ExpectedIpi = PDBFile.getPDBIpiStream();
- if (auto E = ExpectedIpi.takeError())
- fatal("Type server does not have TPI stream: " + toString(std::move(E)));
+ pdb::TpiStream *MaybeIpi = nullptr;
+ if (PDBFile.hasPDBIpiStream()) {
+ Expected<pdb::TpiStream &> ExpectedIpi = PDBFile.getPDBIpiStream();
+ if (auto E = ExpectedIpi.takeError())
+ fatal("Error getting type server IPI stream: " + toString(std::move(E)));
+ MaybeIpi = &*ExpectedIpi;
+ }
if (Config->DebugGHashes) {
// PDBs do not actually store global hashes, so when merging a type server
@@ -445,9 +449,6 @@
// synthesize hashes for the IPI stream, using the hashes for the TPI stream
// as inputs.
auto TpiHashes = GloballyHashedType::hashTypes(ExpectedTpi->typeArray());
- auto IpiHashes =
- GloballyHashedType::hashIds(ExpectedIpi->typeArray(), TpiHashes);
-
Optional<uint32_t> EndPrecomp;
// Merge TPI first, because the IPI stream will reference type indices.
if (auto Err =
@@ -456,10 +457,14 @@
fatal("codeview::mergeTypeRecords failed: " + toString(std::move(Err)));
// Merge IPI.
- if (auto Err = mergeIdRecords(TMerger.GlobalIDTable, IndexMap.TPIMap,
- IndexMap.IPIMap, ExpectedIpi->typeArray(),
- IpiHashes))
- fatal("codeview::mergeIdRecords failed: " + toString(std::move(Err)));
+ if (MaybeIpi) {
+ auto IpiHashes =
+ GloballyHashedType::hashIds(MaybeIpi->typeArray(), TpiHashes);
+ if (auto Err =
+ mergeIdRecords(TMerger.GlobalIDTable, IndexMap.TPIMap,
+ IndexMap.IPIMap, MaybeIpi->typeArray(), IpiHashes))
+ fatal("codeview::mergeIdRecords failed: " + toString(std::move(Err)));
+ }
} else {
// Merge TPI first, because the IPI stream will reference type indices.
if (auto Err = mergeTypeRecords(TMerger.TypeTable, IndexMap.TPIMap,
@@ -467,9 +472,11 @@
fatal("codeview::mergeTypeRecords failed: " + toString(std::move(Err)));
// Merge IPI.
- if (auto Err = mergeIdRecords(TMerger.IDTable, IndexMap.TPIMap,
- IndexMap.IPIMap, ExpectedIpi->typeArray()))
- fatal("codeview::mergeIdRecords failed: " + toString(std::move(Err)));
+ if (MaybeIpi) {
+ if (auto Err = mergeIdRecords(TMerger.IDTable, IndexMap.TPIMap,
+ IndexMap.IPIMap, MaybeIpi->typeArray()))
+ fatal("codeview::mergeIdRecords failed: " + toString(std::move(Err)));
+ }
}
return IndexMap;
Index: lld/trunk/test/COFF/no-ipi-stream.test
===================================================================
--- lld/trunk/test/COFF/no-ipi-stream.test
+++ lld/trunk/test/COFF/no-ipi-stream.test
@@ -0,0 +1,4 @@
+# RUN: rm -rf %t && mkdir %t
+# RUN: yaml2obj < %p/Inputs/no-ipi-stream-obj.obj.yaml > %t/no-ipi-stream-obj.obj
+# RUN: llvm-pdbutil yaml2pdb %p/Inputs/no-ipi-stream-pdb.pdb.yaml -pdb=%t/no-ipi-stream-pdb.pdb
+# RUN: lld-link /dll /noentry /debug %t/no-ipi-stream-obj.obj
Index: lld/trunk/test/COFF/Inputs/no-ipi-stream-pdb.pdb.yaml
===================================================================
--- lld/trunk/test/COFF/Inputs/no-ipi-stream-pdb.pdb.yaml
+++ lld/trunk/test/COFF/Inputs/no-ipi-stream-pdb.pdb.yaml
@@ -0,0 +1,2 @@
+PdbStream:
+ Guid: '{01234567-0123-0123-0123-0123456789AB}'
Index: lld/trunk/test/COFF/Inputs/no-ipi-stream-obj.obj.yaml
===================================================================
--- lld/trunk/test/COFF/Inputs/no-ipi-stream-obj.obj.yaml
+++ lld/trunk/test/COFF/Inputs/no-ipi-stream-obj.obj.yaml
@@ -0,0 +1,13 @@
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_I386
+sections:
+ - Name: '.debug$T'
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Types:
+ - Kind: LF_TYPESERVER2
+ TypeServer2:
+ Guid: '{01234567-0123-0123-0123-0123456789AB}'
+ Age: 1
+ Name: 'no-ipi-stream-pdb.pdb'
+symbols:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63178.204374.patch
Type: text/x-patch
Size: 4566 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190612/ecf6d13b/attachment-0001.bin>
More information about the llvm-commits
mailing list