GCC(/ Clang):使用相同的指令合并函数(COMDAT折叠)

时间:2013-03-01 23:57:34

标签: templates gcc linker clang compiler-optimization

好奇的是,GCC或Clang工具集目前是否实现了MSVC identical COMDAT folding(ICF)的等价物?如果没有,有什么计划吗?除了旧的GCC邮件列表消息之外,我似乎无法找到关于该主题的任何最新权威链接。

如果不是,这是否意味着不同类型的模板实例化在结果二进制文件中始终是不同的函数(在它们未完全内联的情况下),即使它们是二进制兼容的,或者是否存在其他机制在其他一些层面处理这个问题?

另外,是否有人发现ICF在实践中最小化可执行文件的大小方面有很大的不同?我没有任何大型的MSVC项目可以方便地进行测试。 (如果您碰巧在许多不同的vtable-layout兼容类型上实例化模板,我猜它真的很有帮助。)

最后,是否符合C ++ 11标准的两个函数指针指向不同的函数,以便在运行时进行比较? This link似乎暗示它不是,但它适用于C99。编辑:found previous question on this topic

1 个答案:

答案 0 :(得分:18)

GCC和Clang都不是链接器,ICF需要由链接器完成,或者至少与链接器合作完成。编辑:他们不做ICF,所以是的,不同的实例化产生不同的代码。 GNU gold链接器支持ICF --icf选项,需要GCC选项{ {1}}要使用。

不同的函数必须具有不同的地址......我不记得是否对任何具有其地址的函数禁用了ICF,但如果没有,则应该可以在组合函数之前加载一些无操作指令并使每个不同的实例化开始于不同的指令,因此它们具有不同的地址。编辑:gold的-ffunction-sections选项仅为可以证明不具有其地址的函数启用ICF,因此依赖于不同地址的代码仍然有效。

ICF是一个简洁的优化,但不是必需的。通过一些努力,您可以将非依赖代码提升到非模板或具有较少参数的模板,以减少可执行文件中重复代码的数量。关于我在几年前做过Diet Templates谈话的幻灯片中有更多相关信息。