Add full bss data support for darwin tls variables.

llvm-svn: 104414
This commit is contained in:
Eric Christopher 2010-05-22 00:10:22 +00:00
parent ea465e1847
commit 6fdea1bda8
3 changed files with 53 additions and 3 deletions

View File

@ -314,7 +314,32 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
// Handle the tbss directive on darwin which is a thread local bss directive
// like zerofill.
if (GVKind.isThreadBSS() && MAI->hasMachoTBSSDirective()) {
OutStreamer.EmitTBSSSymbol(TheSection, GVSym, Size, 1 << AlignLog);
// Emit the .tbss symbol
MCSymbol *MangSym =
OutContext.GetOrCreateSymbol(GVSym->getName() + Twine("$tlv$init"));
OutStreamer.EmitTBSSSymbol(TheSection, MangSym, Size, 1 << AlignLog);
OutStreamer.AddBlankLine();
// Emit the variable struct for the runtime.
const MCSection *TLVSect
= getObjFileLowering().getTLSExtraDataSection();
OutStreamer.SwitchSection(TLVSect);
// Emit the linkage here.
EmitLinkage(GV->getLinkage(), GVSym);
OutStreamer.EmitLabel(GVSym);
// Three pointers in size:
// - __tlv_bootstrap - used to make sure support exists
// - spare pointer, used when mapped by the runtime
// - pointer to mangled symbol above with initializer
unsigned PtrSize = TD->getPointerSizeInBits()/8;
OutStreamer.EmitSymbolValue(GetExternalSymbolSymbol("__tlv_bootstrap"),
PtrSize, 0);
OutStreamer.EmitIntValue(0, PtrSize, 0);
OutStreamer.EmitSymbolValue(MangSym, PtrSize, 0);
OutStreamer.AddBlankLine();
return;
}

View File

@ -627,6 +627,8 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
getContext().getMachOSection("__DWARF", "__debug_inlined",
MCSectionMachO::S_ATTR_DEBUG,
SectionKind::getMetadata());
TLSExtraDataSection = TLSTLVSection;
}
const MCSection *TargetLoweringObjectFileMachO::
@ -666,9 +668,13 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
const MCSection *TargetLoweringObjectFileMachO::
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler *Mang, const TargetMachine &TM) const {
assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
Mangler *Mang, const TargetMachine &TM) const {
// Handle one kind of thread local...
if (Kind.isThreadBSS()) return TLSBSSSection;
assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
if (Kind.isText())
return GV->isWeakForLinker() ? TextCoalSection : TextSection;

View File

@ -0,0 +1,19 @@
; RUN: llc < %s -march=x86-64 | FileCheck %s
@a = thread_local global i32 0 ; <i32*> [#uses=0]
@b = thread_local global i32 0 ; <i32*> [#uses=0]
; CHECK: .tbss _a$tlv$init, 4, 2
; CHECK: .section __DATA,__thread_vars,thread_local_variables
; CHECK: .globl _a
; CHECK: _a:
; CHECK: .quad ___tlv_bootstrap
; CHECK: .quad 0
; CHECK: .quad _a$tlv$init
; CHECK: .tbss _b$tlv$init, 4, 2
; CHECK: .globl _b
; CHECK: _b:
; CHECK: .quad ___tlv_bootstrap
; CHECK: .quad 0
; CHECK: .quad _b$tlv$init