commat在LLVM中代表什么?您可以在此处找到来源:Comdata
源代码级程序表示(c ++)中的示例将非常有帮助。
如果您需要更多信息,请随时询问。我在llvm代码库中的很多地方都找到了它,但是我无法弄清楚它到底是什么,并且它使用了
感谢您的帮助!
答案 0 :(得分:0)
我也在学习Comdat
,并从此blog看到以下说明。
Comdat部分是目标文件中放置对象的部分,可以在其他目标文件中复制这些对象。每个对象都有链接程序的信息,指示检测到重复项时必须执行的操作。选项可以是:任何-执行任何操作,ExactMatch-重复项必须完全匹配,否则会发生错误,最大-取最大值的对象,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类实际上代表一对(名称,SelectionKind)。 (实际上,一切都更加复杂。)由于某种原因而无法删除的所有变量都放置在一组NotDiscardableComdats中。使用函数和全局别名,我们可以执行相同的操作-无法删除的内容放置在NotDiscardableComdats中。然后,为全局构造函数,全局函数,全局变量,全局别名和全局析构函数调用单独的优化函数。优化将继续循环,直到没有执行优化为止。在循环的每次迭代中,NotDiscardableComdats的集合都设置为零。