diff options
| author | Eric Christopher <echristo@apple.com> | 2010-05-22 00:10:22 +0000 |
|---|---|---|
| committer | Eric Christopher <echristo@apple.com> | 2010-05-22 00:10:22 +0000 |
| commit | 6fdea1bda839653c05a523e20760997d59dfb030 (patch) | |
| tree | 6b622f0bae00fe3721d3d056ad5562edd6c83de1 /llvm/lib/CodeGen | |
| parent | ea465e1847a91f8b62b7f92ecf94a1338a0dc2d1 (diff) | |
| download | bcm5719-llvm-6fdea1bda839653c05a523e20760997d59dfb030.tar.gz bcm5719-llvm-6fdea1bda839653c05a523e20760997d59dfb030.zip | |
Add full bss data support for darwin tls variables.
llvm-svn: 104414
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 27 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 10 |
2 files changed, 34 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 50a50750e8b..d0b48b0db8d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -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; } diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 83768198585..605e2a817b1 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -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; |

