【发布时间】:2019-09-10 01:38:24
【问题描述】:
LLVM 中的 comdat 代表什么?您可以在这里找到来源:Comdata
源代码级程序表示 (c++) 的示例将非常有帮助。
如果您需要更多信息,请随时询问。我在 llvm 代码库的很多地方都找到了它,但我无法弄清楚它到底是什么,它的用途
感谢您的帮助!
【问题讨论】:
标签: llvm llvm-clang llvm-ir llvm-c++-api
LLVM 中的 comdat 代表什么?您可以在这里找到来源:Comdata
源代码级程序表示 (c++) 的示例将非常有帮助。
如果您需要更多信息,请随时询问。我在 llvm 代码库的很多地方都找到了它,但我无法弄清楚它到底是什么,它的用途
感谢您的帮助!
【问题讨论】:
标签: llvm llvm-clang llvm-ir llvm-c++-api
我也在了解Comdat,并从blog 中查看以下解释。
Comdat 部分是对象文件中的一个部分,其中放置对象,可以在其他对象文件中复制。每个对象都有链接器的信息,指示检测到重复时它必须做什么。选项可以是:Any — 做任何事情,ExactMatch — 重复项必须完全匹配,否则会出错,Largest — 取最大值的对象,NoDublicates — 不应该有重复项,SameSize — 重复项必须具有相同的大小,否则会出错。
在 LLVM 中,Comdat 数据由枚举表示:
enum SelectionKind {
Any, ///< The linker may choose any COMDAT.
ExactMatch, ///< The data referenced by the COMDAT must be the same.
Largest, ///< The linker will choose the largest COMDAT.
NoDuplicates, ///< No other Module may specify this COMDAT.
SameSize, ///< The data referenced by the COMDAT must be the same size.
};
并且 Comdat 类实际上表示一对 (Name, SelectionKind)。 (实际上,一切都更复杂。)由于某种原因无法删除的所有变量都放在一组 NotDiscardableComdats 中。对于函数和全局别名,我们也是这样做的 —— 不能删除的东西放在 NotDiscardableComdats 中。然后,分别调用全局构造函数、全局函数、全局变量、全局别名和全局析构函数的优化函数。优化在循环中继续,直到不执行优化。在循环的每次迭代中,NotDiscardableComdats 的集合都设置为零。
【讨论】: