llvm之IR手册翻译(5)

原网址是:http://llvm.org/docs/LangRef.html#abstract
下面这些是我自己的翻译,肯定有很多不恰当的地方,做这些只是希望自己以后翻阅更加方便,如果能对大家有所帮助那是极好的!


别名:
别名,不像函数或变量,不会创建任何新新数据。他们只是一个现有数据的新符号和元数据。
别名有一个名字,别名是一个全局值或常量表达式。
别名有一个可选的链接类型,可选的可见形式,可选的DLL存储类和一个可选的TLS模式。
语法:

@<Name> = [Linkage] [Visibility] [DLLStorageClass] [ThreadLocal] [unnamed_addr] alias <AliaseeTy> @<Aliasee>

别名的链接类型必须是:private, internal, linkonce, weak, linkonce_odr, weak_odr, external的一种。请注意,某些系统链接器可能无法正确处理丢弃一个是别名的弱符号。
别名不是unnamed_addr保证了别名和别名表达的具有相同地址。 unnamed_addr只保证指向相同的内容。
由于别名只是第二名字,受到一些限制,其中一些只能在生成目标文件时进行检查:
定义别名的表达式必须是可计算的装配时间。因为它只是一个名字,没有重定位可以使用。
在表达式中没有别名可以是弱类型,因此在对象文件中不会出现中间别名被覆盖。
在表达式中没有全局值可以是一个声明,因为这将需要重定位,这是不可能的。
Comdats
Comdat IR提供了访问COFF和ELF目标文件COMDAT功能。
Comdats有代表了COMDAT关键字的名称。所有指定该关键字的全局对象将只在目标文件最后结束如果链接器选择关键字在其他一些关键字之上。别名放置在同一COMDAT其别名可以计算到,如果有的话。
Comdats提供一种选择意见链接器应该如何选择在两个不同的目标文件的关键字。
语法:
$ = comdat SelectionKind
选择类型必须是下列之一:
any
链接器可以选择任何COMDAT键,选择是任意的。
exactmatch
接头可以选择任何COMDAT键,但节必须包含相同的数据。
largest
链接器会选择包含最大COMDAT键的节。
noduplicates
链接器要求只有存在COMDAT键的节。
samesize
连接器可以选择任何COMDAT键,但节必须包含相同的数据量。
需要注意的是Mach-O的平台不支持COMDATs和ELF只支持“any”作为选择类型。
这里是一组COMDAT哪个函数会被选择如果COMDAT的选择类型为“largest”的例子:
$foo = comdat largest
@foo = global i32 2, comdat($foo)
define void @bar() comdat($foo) {
ret void
}

作为语法来说如果名字和全局名称相同则, name foo = comdat any
@foo = global i32 2, comdat
在COFF目标文件中,这将创建“IMAGE_COMDAT_SELECT_LARGEST”选择类型的 COMDAT节包含了@foo符号的内容和其他是“IMAGE_COMDAT_SELECT_ASSOCIATIVE”选择类型包含了 @bar符号内容的COMDAT节。
对全局对象的属性的一些限制。它,或它的别名,当针对COFF时,必须具有相同的名称作为 COMDAT组。在链接时间,可以使用此对象的内容和大小,以确定哪些COMDAT组根据选择种类被选择。因为对象的名称必须与COMDAT组的名称匹配,全局对象的链接类型不能是“local”;局部符号可以重命名如果在符号表中发生冲突。
COMDATS和节属性的组合使用可以产生令人惊讶的结果。 例如:

$foo = comdat any
$bar = comdat any
@g1 = global i32 42, section "sec", comdat($foo)
@g2 = global i32 42, section "sec", comdat($bar)

从目标文件的角度来看,这需要创建两个具有相同名称的节。这是必要的,因为这两个全局变量属于不同COMDAT组和COMDATs,在目标文件级,由节表示。
请注意,实际的IR结构体如全局变量和函数可能生成COMDATs 在目标文件中此外这些指定使用COMDAT IR。这出现在当码生成器被配置为生成全局值在各个节中(例如,当数据节和函数节提供给LLC)。
命名元数据
命名元数据是元数据的集合。元数据节点(而不是元数据字符串)是对命名元数据唯一有效的操作。
命名元数据被表示为带有元数据前缀的字符串。对于元数据的名称的规则和标识符相同,但是引用名称是不允许的。 “\ XX”型仍然有效,它允许任何字符是名称的一部分。
语法:

;一些没有命名的元数据节点,被命名的元数据引用。 
!0 = !{!"zero"}
!1 = !{!"one"}
!2 = !{!"two"}

; 一个命名的元数据
!name = !{!0, !1, !2}


未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值