如何使用属性

简介

LLVM 中的属性在一些基本方面发生了变化。进行这些更改是为了支持扩展属性,使其包含不仅仅是少数几个属性——例如命令行选项。旧的属性处理方式是将它们表示为值的位掩码。此位掩码存储在一个引用计数的“列表”结构中。这样做的好处是可以通过“或”和“与”操作来操作属性。缺点是扩展空间有限,并且除了对齐之外,几乎不支持属性-值对。

在新方案中,Attribute 对象表示一个唯一的单个属性。您可以使用 Attribute::get 方法来创建一个新的 Attribute 对象。属性可以是单个“枚举”值(枚举为 Attribute::AttrKind 枚举)、表示目标相关属性的字符串或属性-值对。一些例子

  • 目标无关:noinlinezext

  • 目标相关:"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 的“内省”方法(例如 RawgetRawPointer 等)。这些方法破坏了封装,并且可能会在将来的版本中删除。

AttrBuilder

最后,我们有一个“构建器”类来帮助创建 AttributeList 对象,而无需创建多个不同的中间唯一 AttributeList 对象。 AttrBuilder 类允许您随意添加和删除属性。在您调用相应的 AttributeList::get 方法之前,属性不会被唯一化。

AttrBuilder 对象被设计为按值传递。它应该通过引用传递。

注意:建议您不要使用 AttrBuilder::addRawValue() 方法或 AttrBuilder(uint64_t Val) 构造函数。这些是为了向后兼容,并且可能会在将来的版本中删除。

基本上就是这样!很多功能都隐藏在这些类后面,但接口非常简单明了。