forked from OSchip/llvm-project
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:
parent
52686e4182
commit
7cf73ec4c7
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
Loading…
Reference in New Issue