什么是LLVM Comdat?

时间:2019-04-19 20:45:36

标签: llvm llvm-clang llvm-ir llvm-c++-api

commat在LLVM中代表什么?您可以在此处找到来源:Comdata

源代码级程序表示(c ++)中的示例将非常有帮助。

如果您需要更多信息,请随时询问。我在llvm代码库中的很多地方都找到了它,但是我无法弄清楚它到底是什么,并且它使用了

感谢您的帮助!

1 个答案:

答案 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的集合都设置为零。