我可以使用gcc
和used
function attributes在noinline
轻松实现此目标(请参阅下面的代码),但这并不适用{{1}即使它应该支持这两个函数属性。
简化示例:
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
确认gcc正确发出了该函数:
nm
代码在nm --demangle test | grep createFoo
0000000000403185 W Factory<int>::createFoo()
中编译得很好,但它不会像它应该的那样为静态clang
函数发出代码。
如何强制clang发出从未引用过的静态函数?
答案 0 :(得分:4)
正如OP在评论中所述,__attribute__((used))
的语义是将函数视为代码中实际引用,强制它为函数发出代码,在这种情况下哪个铿锵不行。
此外,所有类成员函数都具有C ++定义的外部链接。因此,当实例化类时,编译器(支持gcc样式函数attibutes)会看到成员函数的__attribute__((used))
,它应该立即知道应该发出该函数的外部可见定义。 gcc 正在执行此操作,错误 clang 不是。
临时解决方法(对于clang)是在代码中的某处显式引用该函数。
您还应该file a clang bug report with llvm修复此问题。