[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