The first version of macOS which had TLV inside DYLD was macOS 10.7 and llvm/clang can't compile code:
__thread int x;
void use_x() {
x = 7;
}This patch allows to compile code above on macOS before 10.7 as:
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 6
.globl _use_x ## -- Begin function use_x
.p2align 4, 0x90
_use_x: ## @use_x
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
leaq ___emutls_v.x(%rip), %rdi
callq ___emutls_get_address
movl $7, (%rax)
popq %rbp
retq
.cfi_endproc
## -- End function
.section __DATA,__data
.globl ___emutls_v.x ## @__emutls_v.x
.p2align 3
___emutls_v.x:
.quad 4 ## 0x4
.quad 4 ## 0x4
.quad 0
.quad 0
.subsections_via_symbolsWhich allows me to build rust for macOS 10.6 for example.
As far as I know it was impossible to run x86_64/i386 on apple hardware before 10.4, and LLVM have some issue with ABI on PowerPC for macOS => I've limited support for 10.4+.
This changes effectively reverts an assumption that was introduced at least at 25 Jun 2010 in commit https://github.com/llvm/llvm-project/commit/17c7b89054639ad3cd86f917ad11a50377c8de17
I guess it isn't the only place, but it shown how deep ago it was.
This patch was tested on all MacPorts users for quite a while since it was firstly introduced on 13 Dec 2018 at commit https://github.com/macports/macports-ports/commit/5949e6264728ac7f74625c9eaf5b41d2852d07e6
Co-authored-by: Ken Cunningham <ken.cunningham.webuse@gmail.com>