如何解决TLS模型上的GCC公共变量属性
引用GCC website。据说
tls_model属性设置特定__thread变量的线程本地存储模型(请参见Thread-Local),并在每个变量的基础上覆盖-ftls-model =命令行开关。 tls_model参数应为全局动态,局部动态,initial-exec或local-exec中的一个。并非所有目标都支持此属性。
为了研究为不同的TLS模型生成的程序集的差异,创建了一个具有三个__thread变量的类。
#include <cstdint>
class Holder
{
public:
static int32_t calc();
static int32_t calc2();
static int32_t calc3();
static __thread int32_t value __attribute__ ((tls_model("initial-exec")));
static __thread int32_t value2 __attribute__ ((tls_model("local-dynamic")));
static __thread int32_t value3;
};
__thread int32_t Holder::value;
__thread int32_t Holder::value2;
__thread int32_t Holder::value3;
int32_t Holder::calc()
{
return value * 2;
}
int32_t Holder::calc2()
{
return value2 * 2;
}
int32_t Holder::calc3()
{
return value3 * 2;
}
这是用-c -shared -fPIC -O3
标志编译的。但是,请注意,该属性在相应的calc函数中不会产生任何差异。 (所有都在相应的calc函数中使用__tls_get_addr
。)但是,如果添加了-ftls-model=initial-exec
标志,它的确会更改TLS模型,但全部被覆盖以使用inital-exec(所有calc函数都使用{ {1}})
使用在线编译器浏览器,发现clang(LLVM)和icc似乎都支持该属性,但不支持gcc。它也似乎与GCC网站中的描述相矛盾(以每个变量为基础)。可以在this上尝试一下,然后切换到其他编译器。
GCC是否有理由取消覆盖每个变量设置的功能?还是我做错了事或有错误的期望?
感谢您事先提供的帮助和说明。
解决方法
这是一个错误,可能是C ++前端和/或属性合并代码中的错误。如果从定义的声明中移动或复制该属性,则该属性将按预期工作。如果消除定义,仅保留声明,则它也可以根据文档使用。基本上,每个定义似乎都不能正确地继承前面的声明中的属性。这值得在https://gnu.gnu.org/bugzilla
进行错误报告版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。