summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h10
-rw-r--r--llvm/include/llvm/MC/MCSectionMachO.h2
-rw-r--r--llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp6
-rw-r--r--llvm/lib/MC/MCParser/AsmParser.cpp10
-rw-r--r--llvm/test/MC/AsmParser/directive_tbss.s2
-rw-r--r--llvm/test/MC/AsmParser/directive_tdata.s9
-rw-r--r--llvm/test/MC/AsmParser/directive_thread_init_func.s7
-rw-r--r--llvm/test/MC/AsmParser/directive_tlv.s13
8 files changed, 54 insertions, 5 deletions
diff --git a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
index e106a417ff7..3aaab886122 100644
--- a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
+++ b/llvm/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/llvm/include/llvm/MC/MCSectionMachO.h b/llvm/include/llvm/MC/MCSectionMachO.h
index c149926a192..2d9d1333dbe 100644
--- a/llvm/include/llvm/MC/MCSectionMachO.h
+++ b/llvm/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/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index 5bb33c2e357..83768198585 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/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/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index c4916731ef0..2a60a67e1ba 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/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/llvm/test/MC/AsmParser/directive_tbss.s b/llvm/test/MC/AsmParser/directive_tbss.s
index 38d3a3e1fcf..62d71230172 100644
--- a/llvm/test/MC/AsmParser/directive_tbss.s
+++ b/llvm/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/llvm/test/MC/AsmParser/directive_tdata.s b/llvm/test/MC/AsmParser/directive_tdata.s
new file mode 100644
index 00000000000..240bef0dd1a
--- /dev/null
+++ b/llvm/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/llvm/test/MC/AsmParser/directive_thread_init_func.s b/llvm/test/MC/AsmParser/directive_thread_init_func.s
new file mode 100644
index 00000000000..4abd5bf2664
--- /dev/null
+++ b/llvm/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/llvm/test/MC/AsmParser/directive_tlv.s b/llvm/test/MC/AsmParser/directive_tlv.s
new file mode 100644
index 00000000000..c4b3e10ed4c
--- /dev/null
+++ b/llvm/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
OpenPOWER on IntegriCloud