diff options
| -rw-r--r-- | lld/ELF/Driver.cpp | 4 | ||||
| -rw-r--r-- | lld/ELF/InputFiles.cpp | 2 | ||||
| -rw-r--r-- | lld/ELF/InputFiles.h | 5 | ||||
| -rw-r--r-- | lld/test/ELF/lto/Inputs/duplicated-name.ll | 6 | ||||
| -rw-r--r-- | lld/test/ELF/lto/duplicated-name.ll | 15 |
5 files changed, 28 insertions, 4 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index b3f03677ad7..093f622e38e 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -187,7 +187,7 @@ void LinkerDriver::addFile(StringRef Path, bool WithLOption) { // we'll handle it as if it had a symbol table. if (!File->hasSymbolTable()) { for (MemoryBufferRef MB : getArchiveMembers(MBRef)) - Files.push_back(make<LazyObjectFile>(MB)); + Files.push_back(make<LazyObjectFile>(MB, MBRef.getBufferIdentifier())); return; } @@ -215,7 +215,7 @@ void LinkerDriver::addFile(StringRef Path, bool WithLOption) { return; default: if (InLib) - Files.push_back(make<LazyObjectFile>(MBRef)); + Files.push_back(make<LazyObjectFile>(MBRef, "")); else Files.push_back(createObjectFile(MBRef)); } diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index adc7e514fea..35bddb777a9 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -981,7 +981,7 @@ InputFile *LazyObjectFile::fetch() { MemoryBufferRef MBRef = getBuffer(); if (MBRef.getBuffer().empty()) return nullptr; - return createObjectFile(MBRef); + return createObjectFile(MBRef, ArchiveName); } template <class ELFT> void LazyObjectFile::parse() { diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h index 7a8943be9b1..8fae4bf4d19 100644 --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -219,7 +219,10 @@ private: // archive file semantics. class LazyObjectFile : public InputFile { public: - explicit LazyObjectFile(MemoryBufferRef M) : InputFile(LazyObjectKind, M) {} + explicit LazyObjectFile(MemoryBufferRef M, StringRef ArchiveName) + : InputFile(LazyObjectKind, M) { + this->ArchiveName = ArchiveName; + } static bool classof(const InputFile *F) { return F->kind() == LazyObjectKind; diff --git a/lld/test/ELF/lto/Inputs/duplicated-name.ll b/lld/test/ELF/lto/Inputs/duplicated-name.ll new file mode 100644 index 00000000000..78678c0c5ad --- /dev/null +++ b/lld/test/ELF/lto/Inputs/duplicated-name.ll @@ -0,0 +1,6 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @f2() { + ret void +} diff --git a/lld/test/ELF/lto/duplicated-name.ll b/lld/test/ELF/lto/duplicated-name.ll new file mode 100644 index 00000000000..b9e6c54564b --- /dev/null +++ b/lld/test/ELF/lto/duplicated-name.ll @@ -0,0 +1,15 @@ +; REQUIRES: x86 +; Cretae two archive with the same member name +; RUN: rm -f %t1.a %t2.a +; RUN: opt -module-summary %s -o %t.o +; RUN: llvm-ar rcS %t1.a %t.o +; RUN: opt -module-summary %p/Inputs/duplicated-name.ll -o %t.o +; RUN: llvm-ar rcS %t2.a %t.o +; RUN: ld.lld -m elf_x86_64 -shared -o %t.so -uf1 -uf2 %t1.a %t2.a + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @f1() { + ret void +} |

