什么是LLVM Comdat?

什么是LLVM Comdat?,llvm,llvm-clang,llvm-ir,llvm-c++-api,Llvm,Llvm Clang,Llvm Ir,Llvm C++ Api,LLVM中的comdat代表什么?您可以在此处找到来源: 源代码级程序表示(c++)的示例将非常有用 如果您需要更多信息,请随时询问。我在llvm代码库中的许多地方都能找到它,但我无法确定它到底是什么,以及它的用途 谢谢你的帮助 我还学习了Comdat,并从中看到以下解释 Comdat节是对象文件中放置对象的节,可以在其他对象文件中复制。每个对象都有链接器的信息,指示在检测到重复项时必须执行的操作。选项可以是:任意 — 做任何事,对吗 — 重复项必须完全匹配,否则会发生错误,最大 — 取值最大的

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

源代码级程序表示(c++)的示例将非常有用

如果您需要更多信息,请随时询问。我在llvm代码库中的许多地方都能找到它,但我无法确定它到底是什么,以及它的用途


谢谢你的帮助

我还学习了
Comdat
,并从中看到以下解释

Comdat节是对象文件中放置对象的节,可以在其他对象文件中复制。每个对象都有链接器的信息,指示在检测到重复项时必须执行的操作。选项可以是:任意 — 做任何事,对吗 — 重复项必须完全匹配,否则会发生错误,最大 — 取值最大的对象nopublicates — 不应该有重复的,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.
  };
enum SelectionKind{
Any,//<链接器可以选择任何COMDAT。
ExactMatch,//
类Comdat实际上代表一对(名称,SelectionKind)。(事实上,一切都更复杂。)所有因某种原因无法删除的变量都放在一组NotDiscardableComdat中。对于函数和全局别名,我们也这样做 — 无法删除的内容被放置在NotDiscardableComdats中。然后,分别调用全局构造函数、全局函数、全局变量、全局别名和全局析构函数的优化函数。在循环中继续优化,直到没有执行优化为止。在循环的每次迭代中,NotDiscardableComdats的集合被设置为零。

可能的重复项