summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Driver.cpp4
-rw-r--r--lld/ELF/InputFiles.cpp2
-rw-r--r--lld/ELF/InputFiles.h5
-rw-r--r--lld/test/ELF/lto/Inputs/duplicated-name.ll6
-rw-r--r--lld/test/ELF/lto/duplicated-name.ll15
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
+}
OpenPOWER on IntegriCloud