LLVM IR 线程本地存储模型

在LLVM程序中,变量可以定义为thread_local,这意味着它不会被线程共享(每个线程都有一个独立的变量副本)。并非所有目标都支持线程局部变量。可选的,一个TLS变量可以指定一下TLS模型之一:

名称 说明
localdynamic 用于仅在当前共享库中使用的变量。
initialexec 用于不会动态加载的模块中的变量。
localexec 用于可执行文件中定义的变量,并且仅在本可执行文件中使用。

如果没有给出明确的模型,则使用 “general dynamic” 模型。

LLVM IR的TLS模型对应于ELF TLS模型,有关在何种情况下可以使用不同模型的详细信息,请参阅线程局部存储的ELF处理。如果不支持指定的模型,或者可以更好地选择模型,目标可以选择不同的TLS模型。

模型也可以在别名中指定,但它仅控制别名的访问方式。它对别名没有任何影响。

对于没有ELF TLS模型的链接器支持的平台,-femulated-tls标志可用于生成GCC兼容的模拟TLS代码。