7

gcc我可以通过使用usedandnoinline 函数属性轻松实现这一点(请参见下面的代码),但这不起作用,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 发出这个从未被引用的静态函数?

4

1 回答 1

7

这绝对是clang中的一个错误。

正如评论中所说的OP,语义__attribute__((used))是将函数视为代码中实际引用的函数,强制它为函数发出代码,在这种情况下clang没有这样做。

此外,所有类成员函数都具有 C++ 定义的外部链接。因此,当类被实例化,并且编译器(支持 gcc 样式的函数属性)看到__attribute__((used))成员函数时,它应该立即知道应该发出该函数的外部可见定义。gcc正在这样做,bug clang不是。

临时解决方法(对于 clang)是在代码中的某处显式引用该函数。

您还应该向 llvm 提交 clang 错误报告以修复此问题。

于 2013-09-27T09:31:55.433 回答