Skip to content

Commit

Permalink
COFF: PDB: Allow multiple modules with the same name.
Browse files Browse the repository at this point in the history
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").

Differential Revision: https://reviews.llvm.org/D37589

llvm-svn: 312744
  • Loading branch information
pcc committed Sep 7, 2017
1 parent b8c4190 commit 9e26e97
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 22 deletions.
23 changes: 23 additions & 0 deletions 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 ``
4 changes: 1 addition & 3 deletions llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
Expand Up @@ -64,7 +64,6 @@ class DbiStreamBuilder {
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);

Expand Down Expand Up @@ -113,8 +112,7 @@ class DbiStreamBuilder {

const DbiStreamHeader *Header;

StringMap<std::unique_ptr<DbiModuleDescriptorBuilder>> ModiMap;
std::vector<DbiModuleDescriptorBuilder *> ModiList;
std::vector<std::unique_ptr<DbiModuleDescriptorBuilder>> ModiList;

StringMap<uint32_t> SourceFileNames;

Expand Down
21 changes: 3 additions & 18 deletions llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
Expand Up @@ -90,24 +90,9 @@ uint32_t DbiStreamBuilder::calculateSerializedLength() const {
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,
Expand Down
2 changes: 1 addition & 1 deletion llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
Expand Up @@ -704,7 +704,7 @@ static void yamlToPdb(StringRef Path) {
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) {
Expand Down

0 comments on commit 9e26e97

Please sign in to comment.