Remember archive name when creating LazyObjectFile.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 5 May 2017 13:55:51 +0000 (13:55 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 5 May 2017 13:55:51 +0000 (13:55 +0000)
It is needed for creating an unique identifier for ThinLTO.

This fixes pr32931.

llvm-svn: 302235

lld/ELF/Driver.cpp
lld/ELF/InputFiles.cpp
lld/ELF/InputFiles.h
lld/test/ELF/lto/Inputs/duplicated-name.ll [new file with mode: 0644]
lld/test/ELF/lto/duplicated-name.ll [new file with mode: 0644]

index b3f0367..093f622 100644 (file)
@@ -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));
   }
index adc7e51..35bddb7 100644 (file)
@@ -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() {
index 7a8943b..8fae4bf 100644 (file)
@@ -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 (file)
index 0000000..78678c0
--- /dev/null
@@ -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 (file)
index 0000000..b9e6c54
--- /dev/null
@@ -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
+}