【问题标题】:What is LLVM Comdat?什么是 LLVM Comdat?
【发布时间】:2019-09-10 01:38:24
【问题描述】:

LLVM 中的 comdat 代表什么?您可以在这里找到来源:Comdata

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

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

感谢您的帮助!

【问题讨论】:

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


【解决方案1】:

我也在了解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 的集合都设置为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2012-05-27
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多