[英]forcing clang to emit code for never-referenced static member function of class-template instantiation
我可以使用used
和noinline
函数属性在gcc
轻松实现这一点(参见下面的代码),但这在clang
不起作用,即使它应该支持这两个函数属性。
一个简化的例子:
template<typename T>
struct Factory {
static __attribute__((used, noinline))
T createFoo() { return T(); }
};
int main() {
Factory<int> f; // instantiate and use Factory<int>
}
编译gcc
的代码并使用nm
确认gcc正确发出了函数:
nm --demangle test | grep createFoo
0000000000403185 W Factory<int>::createFoo()
代码在clang
编译得很好,但是它不像它应该的那样为静态createFoo()
函数发出代码。
如何强制clang发出从未引用过的静态函数?
正如OP在注释中所述, __attribute__((used))
的语义是将函数视为代码中实际引用的函数,强制它为函数发出代码,在这种情况下clang不执行。
此外,所有类成员函数都具有C ++定义的外部链接。 因此,当实例化类时,编译器(支持gcc样式函数attibutes)会看到成员函数的__attribute__((used))
,它应该立即知道应该发出该函数的外部可见定义。 gcc正在这样做,bug clang不是。
临时解决方法(对于clang)是在代码中的某处显式引用该函数。
您还应该使用llvm提交clang错误报告以解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.