源码路径
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; }
};