llvm libLLVMCore源码分析 24 - Comdat Class

源码路径

llvm\include\llvm\IR\Comdat.h

COMDAT

在很多ABI中,定义了COMDAT段,这种类型的段在链接时会根据段名进行合并。链接器如何合并这些段,通过一个标志指示。

llvm支持的标志的可选类型如下:

enum SelectionKind {
    Any,          ///< 链接器可以选择任意一个COMDAT
    ExactMatch,   ///< 所有COMDAT的内容必须完全相同,否则会上报链接错误。
    Largest,      ///< 链接器选择最大的COMDAT
    NoDuplicates, ///< COMDAT只能有一份,否则会上报链接错误
    SameSize,     ///< 所有COMDAT的大小必须相同
  };

llvm Comdat class

在llvm中,通过Comdat类实现COMDAT功能。Comdat类的功能非常简单,主要提供了2个属性SelectionKind和Name,如上文所述,SelectionKind用于指示链接器如何合并Comdat,Name用于标识相同的COMDAT:

class Comdat {
  SelectionKind getSelectionKind() const { return SK; }
  StringRef getName() const;
};

GlobalObject类提供了操作Comdat的接口,这样就可以把GlobalVariable和Function放置到COMDAT中:

class GlobalObject {
  bool hasComdat() const { return getComdat() != nullptr; }
  const Comdat *getComdat() const { return ObjComdat; }
  Comdat *getComdat() { return ObjComdat; }
  void setComdat(Comdat *C) { ObjComdat = C; }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值