ELF: Implement basic support for module asm in bitcode files.

Differential Revision: http://reviews.llvm.org/D18872

llvm-svn: 265956
This commit is contained in:
Peter Collingbourne 2016-04-11 16:39:43 +00:00
parent 52686e4182
commit 7cf73ec4c7
3 changed files with 39 additions and 8 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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
}