[PATCH] D37589: COFF: PDB: Allow multiple modules with the same name.

Peter Collingbourne via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 7 13:14:40 PDT 2017


pcc created this revision.
Herald added subscribers: hiraditya, mehdi_amini.

It is possible for two modules to have the same name if they are
archive members with the same name, or if we are doing LTO (in which
case all modules will have the name "lto.tmp").


https://reviews.llvm.org/D37589

Files:
  lld/test/COFF/pdb-same-name.test
  llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
  llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
  llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp


Index: llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
===================================================================
--- llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
+++ llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
@@ -704,7 +704,7 @@
     ModiBuilder.setObjFileName(MI.Obj);
 
     for (auto S : MI.SourceFiles)
-      ExitOnErr(DbiBuilder.addModuleSourceFile(MI.Mod, S));
+      ExitOnErr(DbiBuilder.addModuleSourceFile(ModiBuilder, S));
     if (MI.Modi.hasValue()) {
       const auto &ModiStream = *MI.Modi;
       for (auto Symbol : ModiStream.Symbols) {
Index: llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
===================================================================
--- llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
+++ llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
@@ -90,24 +90,9 @@
 Expected<DbiModuleDescriptorBuilder &>
 DbiStreamBuilder::addModuleInfo(StringRef ModuleName) {
   uint32_t Index = ModiList.size();
-  auto MIB =
-      llvm::make_unique<DbiModuleDescriptorBuilder>(ModuleName, Index, Msf);
-  auto M = MIB.get();
-  auto Result = ModiMap.insert(std::make_pair(ModuleName, std::move(MIB)));
-
-  if (!Result.second)
-    return make_error<RawError>(raw_error_code::duplicate_entry,
-                                "The specified module already exists");
-  ModiList.push_back(M);
-  return *M;
-}
-
-Error DbiStreamBuilder::addModuleSourceFile(StringRef Module, StringRef File) {
-  auto ModIter = ModiMap.find(Module);
-  if (ModIter == ModiMap.end())
-    return make_error<RawError>(raw_error_code::no_entry,
-                                "The specified module was not found");
-  return addModuleSourceFile(*ModIter->second, File);
+  ModiList.push_back(
+      llvm::make_unique<DbiModuleDescriptorBuilder>(ModuleName, Index, Msf));
+  return *ModiList.back();
 }
 
 Error DbiStreamBuilder::addModuleSourceFile(DbiModuleDescriptorBuilder &Module,
Index: llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
===================================================================
--- llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
+++ llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
@@ -64,7 +64,6 @@
   void setSymbolRecordStreamIndex(uint32_t Index);
 
   Expected<DbiModuleDescriptorBuilder &> addModuleInfo(StringRef ModuleName);
-  Error addModuleSourceFile(StringRef Module, StringRef File);
   Error addModuleSourceFile(DbiModuleDescriptorBuilder &Module, StringRef File);
   Expected<uint32_t> getSourceFileNameIndex(StringRef FileName);
 
@@ -113,8 +112,7 @@
 
   const DbiStreamHeader *Header;
 
-  StringMap<std::unique_ptr<DbiModuleDescriptorBuilder>> ModiMap;
-  std::vector<DbiModuleDescriptorBuilder *> ModiList;
+  std::vector<std::unique_ptr<DbiModuleDescriptorBuilder>> ModiList;
 
   StringMap<uint32_t> SourceFileNames;
 
Index: lld/test/COFF/pdb-same-name.test
===================================================================
--- /dev/null
+++ lld/test/COFF/pdb-same-name.test
@@ -0,0 +1,23 @@
+# RUN: rm -rf %t1 %t2
+# RUN: mkdir %t1 %t2
+# RUN: yaml2obj < %p/Inputs/pdb1.yaml > %t1/foo.obj
+# RUN: llvm-ar cru %t1/foo.lib %t1/foo.obj
+# RUN: yaml2obj < %p/Inputs/pdb2.yaml > %t2/foo.obj
+# RUN: llvm-ar cru %t2/foo.lib %t2/foo.obj
+
+# RUN: rm -f %t.dll %t.pdb
+# RUN: lld-link /debug /pdb:%t.pdb /dll /out:%t.dll /entry:main /nodefaultlib \
+# RUN:   %t1/foo.lib %t2/foo.lib
+
+# RUN: llvm-pdbutil dump -modules %t.pdb | FileCheck -check-prefix RAW %s
+
+RAW:                               Modules
+RAW-NEXT: ============================================================
+RAW-NEXT:   Mod 0000 | `foo.obj`:
+RAW-NEXT:              Obj: `{{.*}}1\foo.lib`:
+RAW-NEXT:              debug stream: 9, # files: 1, has ec info: false
+RAW-NEXT:              pdb file ni: 0 ``, src file ni: 0 ``
+RAW-NEXT:   Mod 0001 | `foo.obj`:
+RAW-NEXT:              Obj: `{{.*}}2\foo.lib`:
+RAW-NEXT:              debug stream: 10, # files: 1, has ec info: false
+RAW-NEXT:              pdb file ni: 0 ``, src file ni: 0 ``


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37589.114246.patch
Type: text/x-patch
Size: 4002 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170907/072868d0/attachment.bin>


More information about the llvm-commits mailing list