summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/InputFiles.cpp6
-rw-r--r--lld/ELF/Symbols.cpp4
-rw-r--r--lld/ELF/Symbols.h2
-rw-r--r--lld/test/ELF/lto/weak.ll16
4 files changed, 23 insertions, 5 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 927feb43217..2d90bebf2ce 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -450,10 +450,12 @@ void BitcodeFile::parse() {
Sym.printName(OS);
StringRef NameRef = Saver.save(StringRef(Name));
SymbolBody *Body;
- if (Sym.getFlags() & BasicSymbolRef::SF_Undefined)
+ uint32_t Flags = Sym.getFlags();
+ if (Flags & BasicSymbolRef::SF_Undefined)
Body = new (Alloc) Undefined(NameRef, false, STV_DEFAULT, false);
else
- Body = new (Alloc) DefinedBitcode(NameRef);
+ Body =
+ new (Alloc) DefinedBitcode(NameRef, Flags & BasicSymbolRef::SF_Weak);
SymbolBodies.push_back(Body);
}
}
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 39abc47404c..c5198e3299f 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -161,8 +161,8 @@ Defined::Defined(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility,
bool IsTls, bool IsFunction)
: SymbolBody(K, Name, IsWeak, Visibility, IsTls, IsFunction) {}
-DefinedBitcode::DefinedBitcode(StringRef Name)
- : Defined(DefinedBitcodeKind, Name, false, STV_DEFAULT, false, false) {}
+DefinedBitcode::DefinedBitcode(StringRef Name, bool IsWeak)
+ : Defined(DefinedBitcodeKind, Name, IsWeak, STV_DEFAULT, false, false) {}
bool DefinedBitcode::classof(const SymbolBody *S) {
return S->kind() == DefinedBitcodeKind;
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index ba885244985..2d84910d1b7 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -190,7 +190,7 @@ public:
class DefinedBitcode : public Defined {
public:
- DefinedBitcode(StringRef Name);
+ DefinedBitcode(StringRef Name, bool IsWeak);
static bool classof(const SymbolBody *S);
};
diff --git a/lld/test/ELF/lto/weak.ll b/lld/test/ELF/lto/weak.ll
new file mode 100644
index 00000000000..381ef7a1a34
--- /dev/null
+++ b/lld/test/ELF/lto/weak.ll
@@ -0,0 +1,16 @@
+; REQUIRES: x86
+; RUN: llvm-as %s -o %t.o
+; RUN: ld.lld -m elf_x86_64 %t.o %t.o -o %t.so -shared
+; RUN: llvm-readobj -t %t.so | FileCheck %s
+
+target triple = "x86_64-unknown-linux-gnu"
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define weak void @f() {
+ ret void
+}
+
+; CHECK: Name: f
+; CHECK-NEXT: Value: 0x1000
+; CHECK-NEXT: Size: 1
+; CHECK-NEXT: Binding: Weak
OpenPOWER on IntegriCloud