From c6177a4531a5d7e2207a3184cc8a4f1792073a7d Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Mon, 17 May 2010 22:53:55 +0000 Subject: [PATCH] More data/parsing support for tls directives. Add a few more testcases and cleanup comments as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103985 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/TargetLoweringObjectFileImpl.h | 10 +++++++--- include/llvm/MC/MCSectionMachO.h | 2 +- lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 6 ++++++ lib/MC/MCParser/AsmParser.cpp | 10 ++++++++++ test/MC/AsmParser/directive_tbss.s | 2 +- test/MC/AsmParser/directive_tdata.s | 9 +++++++++ test/MC/AsmParser/directive_thread_init_func.s | 7 +++++++ test/MC/AsmParser/directive_tlv.s | 13 +++++++++++++ 8 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 test/MC/AsmParser/directive_tdata.s create mode 100644 test/MC/AsmParser/directive_thread_init_func.s create mode 100644 test/MC/AsmParser/directive_tlv.s 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