summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/InputFiles.cpp24
-rw-r--r--lld/ELF/LTO.cpp4
-rw-r--r--lld/test/ELF/lto/module-asm.ll19
3 files changed, 39 insertions, 8 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index daff7cf304a..71d7a585583 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -461,12 +461,19 @@ BitcodeFile::createSymbolBody(const DenseSet<const Comdat *> &KeptComdats,
const IRObjectFile &Obj,
const BasicSymbolRef &Sym) {
const GlobalValue *GV = Obj.getSymbolGV(Sym.getRawDataRefImpl());
- assert(GV);
- if (const Comdat *C = GV->getComdat())
- if (!KeptComdats.count(C))
- return nullptr;
+ if (GV)
+ if (const Comdat *C = GV->getComdat())
+ if (!KeptComdats.count(C))
+ return nullptr;
- uint8_t Visibility = getGvVisibility(GV);
+ uint32_t Flags = Sym.getFlags();
+ uint8_t Visibility;
+ if (GV)
+ Visibility = getGvVisibility(GV);
+ else
+ // FIXME: Set SF_Hidden flag correctly for module asm symbols, and expose
+ // protected visibility.
+ Visibility = STV_DEFAULT;
SmallString<64> Name;
raw_svector_ostream OS(Name);
@@ -475,11 +482,13 @@ BitcodeFile::createSymbolBody(const DenseSet<const Comdat *> &KeptComdats,
const Module &M = Obj.getModule();
SymbolBody *Body;
- uint32_t Flags = Sym.getFlags();
bool IsWeak = Flags & BasicSymbolRef::SF_Weak;
if (Flags & BasicSymbolRef::SF_Undefined) {
Body = new (Alloc) UndefinedBitcode(NameRef, IsWeak, Visibility);
} else if (Flags & BasicSymbolRef::SF_Common) {
+ // FIXME: Set SF_Common flag correctly for module asm symbols, and expose
+ // size and alignment.
+ assert(GV);
const DataLayout &DL = M.getDataLayout();
uint64_t Size = DL.getTypeAllocSize(GV->getValueType());
Body = new (Alloc)
@@ -488,7 +497,8 @@ BitcodeFile::createSymbolBody(const DenseSet<const Comdat *> &KeptComdats,
} else {
Body = new (Alloc) DefinedBitcode(NameRef, IsWeak, Visibility);
}
- if (GV->isThreadLocal())
+ // FIXME: Expose a thread-local flag for module asm symbols.
+ if (GV && GV->isThreadLocal())
Body->Type = STT_TLS;
return Body;
}
diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp
index 2fdf94a6c5f..bd3c215e39d 100644
--- a/lld/ELF/LTO.cpp
+++ b/lld/ELF/LTO.cpp
@@ -87,7 +87,9 @@ void BitcodeCompiler::add(BitcodeFile &F) {
for (const BasicSymbolRef &Sym : Obj->symbols()) {
GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl());
- assert(GV);
+ // Ignore module asm symbols.
+ if (!GV)
+ continue;
if (GV->hasAppendingLinkage()) {
Keep.push_back(GV);
continue;
diff --git a/lld/test/ELF/lto/module-asm.ll b/lld/test/ELF/lto/module-asm.ll
new file mode 100644
index 00000000000..1389b9f5472
--- /dev/null
+++ b/lld/test/ELF/lto/module-asm.ll
@@ -0,0 +1,19 @@
+; REQUIRES: x86
+; RUN: llvm-as %s -o %t.o
+; RUN: ld.lld -m elf_x86_64 %t.o -o %t
+; RUN: llvm-nm %t | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+module asm ".text"
+module asm ".globl foo"
+; CHECK: T foo
+module asm "foo: ret"
+
+declare void @foo()
+
+define void @_start() {
+ call void @foo()
+ ret void
+}
OpenPOWER on IntegriCloud