forked from OSchip/llvm-project
COFF: PDB: Allow multiple modules with the same name.
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
This commit is contained in:
parent
b8c419085f
commit
9e26e97955
|
@ -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 ``
|
|
@ -64,7 +64,6 @@ public:
|
|||
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 @@ private:
|
|||
|
||||
const DbiStreamHeader *Header;
|
||||
|
||||
StringMap<std::unique_ptr<DbiModuleDescriptorBuilder>> ModiMap;
|
||||
std::vector<DbiModuleDescriptorBuilder *> ModiList;
|
||||
std::vector<std::unique_ptr<DbiModuleDescriptorBuilder>> ModiList;
|
||||
|
||||
StringMap<uint32_t> SourceFileNames;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue