diff --git a/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h b/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h index e106a417ff7..3aaab886122 100644 --- a/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h +++ b/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h @@ -84,19 +84,23 @@ public: class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { - /// TLSDataSection - Section directive for Thread Local data. + /// TLSDataSection - Section for thread local data. /// const MCSection *TLSDataSection; // Defaults to ".tdata". - /// TLSBSSSection - Section directive for Thread Local uninitialized data. + /// TLSBSSSection - Section for thread local uninitialized data. /// const MCSection *TLSBSSSection; // Defaults to ".tbss". - /// TLSTLVSection - Section directive for Thread Local structure infomation. + /// TLSTLVSection - Section for thread local structure infomation. /// Contains the source code name of the variable, visibility and a pointer /// to the initial value (.tdata or .tbss). const MCSection *TLSTLVSection; // Defaults to ".tlv". + /// TLSThreadInitSection - Section for thread local data initialization + /// functions. + const MCSection *TLSThreadInitSection; // Defaults to ".thread_init_func". + const MCSection *CStringSection; const MCSection *UStringSection; const MCSection *TextCoalSection; diff --git a/include/llvm/MC/MCSectionMachO.h b/include/llvm/MC/MCSectionMachO.h index c149926a192..2d9d1333dbe 100644 --- a/include/llvm/MC/MCSectionMachO.h +++ b/include/llvm/MC/MCSectionMachO.h @@ -98,7 +98,7 @@ public: S_THREAD_LOCAL_VARIABLE_POINTERS = 0x14U, /// S_THREAD_LOCAL_INIT_FUNCTION_POINTERS - Section with thread local /// variable initialization pointers to functions. - S_THREAD_LOCAL_INIT_FUNCTION_POINTERS = 0x15, + S_THREAD_LOCAL_INIT_FUNCTION_POINTERS = 0x15U, LAST_KNOWN_SECTION_TYPE = S_THREAD_LOCAL_INIT_FUNCTION_POINTERS, diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 5bb33c2e357..83768198585 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -475,6 +475,12 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, = getContext().getMachOSection("__DATA", "__thread_vars", MCSectionMachO::S_THREAD_LOCAL_VARIABLES, SectionKind::getDataRel()); + + TLSThreadInitSection + = getContext().getMachOSection("__DATA", "__thread_init", + MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS, + SectionKind::getDataRel()); + CStringSection // .cstring = getContext().getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index c4916731ef0..2a60a67e1ba 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -623,6 +623,16 @@ bool AsmParser::ParseStatement() { return ParseDirectiveSectionSwitch("__OBJC", "__selector_strs", MCSectionMachO::S_CSTRING_LITERALS); + if (IDVal == ".tdata") + return ParseDirectiveSectionSwitch("__DATA", "__thread_data", + MCSectionMachO::S_THREAD_LOCAL_REGULAR); + if (IDVal == ".tlv") + return ParseDirectiveSectionSwitch("__DATA", "__thread_vars", + MCSectionMachO::S_THREAD_LOCAL_VARIABLES); + if (IDVal == ".thread_init_func") + return ParseDirectiveSectionSwitch("__DATA", "__thread_init", + MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS); + // Assembler features if (IDVal == ".set") return ParseDirectiveSet(); diff --git a/test/MC/AsmParser/directive_tbss.s b/test/MC/AsmParser/directive_tbss.s index 38d3a3e1fcf..62d71230172 100644 --- a/test/MC/AsmParser/directive_tbss.s +++ b/test/MC/AsmParser/directive_tbss.s @@ -1,4 +1,4 @@ -# RUN: llvm-mc -triple i386-unknown-darwin %s | FileCheck %s +# RUN: llvm-mc -triple x86_64-unknown-darwin %s | FileCheck %s # CHECK: .tbss _a$tlv$init, 4 # CHECK: .tbss _b$tlv$init, 4, 3 diff --git a/test/MC/AsmParser/directive_tdata.s b/test/MC/AsmParser/directive_tdata.s new file mode 100644 index 00000000000..240bef0dd1a --- /dev/null +++ b/test/MC/AsmParser/directive_tdata.s @@ -0,0 +1,9 @@ +# RUN: llvm-mc -triple x86_64-unknown-darwin %s | FileCheck %s + +# CHECK: __DATA,__thread_data,thread_local_regular +# CHECK: _a$tlv$init: +# CHECK: .quad 4 + + .tdata +_a$tlv$init: + .quad 4 diff --git a/test/MC/AsmParser/directive_thread_init_func.s b/test/MC/AsmParser/directive_thread_init_func.s new file mode 100644 index 00000000000..4abd5bf2664 --- /dev/null +++ b/test/MC/AsmParser/directive_thread_init_func.s @@ -0,0 +1,7 @@ +# RUN: llvm-mc -triple x86_64-unknown-darwin %s | FileCheck %s + +# CHECK: __DATA,__thread_init,thread_local_init_function_pointers +# CHECK: .quad 0 + +.thread_init_func + .quad 0 diff --git a/test/MC/AsmParser/directive_tlv.s b/test/MC/AsmParser/directive_tlv.s new file mode 100644 index 00000000000..c4b3e10ed4c --- /dev/null +++ b/test/MC/AsmParser/directive_tlv.s @@ -0,0 +1,13 @@ +# RUN: llvm-mc -triple x86_64-unknown-darwin %s | FileCheck %s + +# CHECK: __DATA,__thread_vars,thread_local_variables +# CHECK: .globl _a +# CHECK: _a: +# CHECK: .quad 0 + + .tlv +.globl _a +_a: + .quad 0 + .quad 0 + .quad 0