如何使用属性¶
简介¶
LLVM 中的属性在一些基本方面发生了变化。进行这些更改是为了支持扩展属性,使其包含不仅仅是少数几个属性——例如命令行选项。旧的属性处理方式是将它们表示为值的位掩码。此位掩码存储在一个引用计数的“列表”结构中。这样做的好处是可以通过“或”和“与”操作来操作属性。缺点是扩展空间有限,并且除了对齐之外,几乎不支持属性-值对。
在新方案中,Attribute
对象表示一个唯一的单个属性。您可以使用 Attribute::get
方法来创建一个新的 Attribute
对象。属性可以是单个“枚举”值(枚举为 Attribute::AttrKind
枚举)、表示目标相关属性的字符串或属性-值对。一些例子
目标无关:
noinline
、zext
目标相关:
"no-sse"
、"thumb2"
属性-值对:
"cpu" = "cortex-a8"
、align = 4
注意:对于属性值对,我们期望目标相关属性的值为字符串。
Attribute
¶
Attribute
对象被设计为按值传递。
因为属性不再表示为位掩码,所以您需要将任何将属性视为位掩码的代码转换为使用 Attribute 类上的新查询方法。
AttributeList
¶
AttributeList
存储与每个可能具有关联属性的对象相关联的 Attribute 对象集合:整个函数、返回值或函数的参数。函数的属性位于索引 AttributeList::FunctionIndex
处;返回值的属性位于索引 AttributeList::ReturnIndex
处;函数参数的属性位于索引 1、…、n(其中“n”是参数的数量)处。 AttributeList
类上的大多数方法都带有一个索引参数。
AttributeList
也是一个唯一的且不可变的对象。您可以通过 AttributeList::get
方法创建 AttributeList
。您可以添加和删除属性,这将导致创建新的 AttributeList
。
AttributeList
对象被设计为按值传递。
注意:建议您不要使用 AttributeList
的“内省”方法(例如 Raw
、getRawPointer
等)。这些方法破坏了封装,并且可能会在将来的版本中删除。
AttrBuilder
¶
最后,我们有一个“构建器”类来帮助创建 AttributeList
对象,而无需创建多个不同的中间唯一 AttributeList
对象。 AttrBuilder
类允许您随意添加和删除属性。在您调用相应的 AttributeList::get
方法之前,属性不会被唯一化。
AttrBuilder
对象不被设计为按值传递。它应该通过引用传递。
注意:建议您不要使用 AttrBuilder::addRawValue()
方法或 AttrBuilder(uint64_t Val)
构造函数。这些是为了向后兼容,并且可能会在将来的版本中删除。
基本上就是这样!很多功能都隐藏在这些类后面,但接口非常简单明了。