diff options
-rw-r--r-- | lld/ELF/InputFiles.cpp | 24 | ||||
-rw-r--r-- | lld/ELF/LTO.cpp | 4 | ||||
-rw-r--r-- | lld/test/ELF/lto/module-asm.ll | 19 |
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 +} |