Index: lld/trunk/ELF/InputFiles.cpp =================================================================== --- lld/trunk/ELF/InputFiles.cpp +++ lld/trunk/ELF/InputFiles.cpp @@ -461,12 +461,19 @@ 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 @@ 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 @@ } 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; } Index: lld/trunk/ELF/LTO.cpp =================================================================== --- lld/trunk/ELF/LTO.cpp +++ lld/trunk/ELF/LTO.cpp @@ -87,7 +87,9 @@ 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; Index: lld/trunk/test/ELF/lto/module-asm.ll =================================================================== --- lld/trunk/test/ELF/lto/module-asm.ll +++ lld/trunk/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 +}