【问题标题】:clang: support for bitwidth attribute when generating LLVM IRclang:生成 LLVM IR 时支持位宽属性
【发布时间】:2015-02-18 04:47:46
【问题描述】:

在使用 clang 生成 LLVM IR 代码时,我想使用 __attribute__((bitwidth(N))) 来定义自定义大小的整数类型。我在is no plan to support this attribute 找到了一些信息。但是,为 IR 生成(即程序集表示)支持这样的属性将非常有帮助。

我的用例:我想以最小的努力为自定义微架构编写编译器*。该架构仅支持非常特定/不寻常的位宽。微架构的“程序”应该用 C 的有限子集编写。在这种情况下,有希望使用 clang 来生成 LLVM IR 并将其用作进一步处理的基础。如果可以使用 bitwidth 属性将有关数据类型的其他信息传递到下一步,那就太好了,如下例所示:

C-代码:

typedef int __attribute__((bitwidth(22))) int22;
int22 myVar = 0;

LLVM IR 组装:

@myVar = global i22 0, align 3
; note that the align information is not relevant
; in my case, i.e. "align 4" would also be fine

也许有一些技巧可以为 IR“启用”这个属性(恕我直言,实现起来不会太难),或者有人有比我能找到的更新的信息(llvm bugzilla 条目现在相当旧)。

如果没有,也许有一些替代方法可以“附加”有关 C 中定义的数据类型的附加信息。


*) 将自定义微架构添加到 clang(以便可以使用 -target 选项)被重新分级为非常复杂。是吗?

【问题讨论】:

    标签: c clang llvm llvm-ir


    【解决方案1】:

    向 clang 添加一个新目标并不难。看看现有的目标,它包含在 clang 中的位置并“克隆”该方法。但是,目标“通常”定义了一个严格的数据布局,用于控制后端程序集的生成。

    bitwidth 属性需要后端来处理任意大小的类型(例如,您展示的具有 22 位的 int)。 AFAIK,LLVM 中的任何后端都不能处理这个问题(如果我错了,可能有人纠正我)。

    因此,如果您想要位宽支持,您可以将此属性添加到具有不同目标的 clang 中,并将其限制为仅此目标。

    另一种方法:如果您只需要 LLVM IR,并且从这一点开始您自己做事,也许您只需要向生成的 IR 添加一些元数据,即,您为 clang 带来一个自定义属性,告诉将元数据添加到 destinct 类型(例如,您说 i32 应该是 22 位宽)。您可以查看 clang 代码并搜索 align 属性,将其克隆为 bitwidth 属性,然后在代码生成中处理您的属性以将元数据添加到模块中。

    【讨论】:

    • 谢谢!您建议的两种方法都需要修改clang源,对吗?我觉得这不是一个选择,因为我需要完整的构建工具链来在 Windows 机器上进行 clang ......这会带来太多的依赖关系。我目前的方法仅基于 C#/.NET(即 Visual Studio); clang 被称为可执行文件,LLVM IR 使用“Sprache”简单地解析(输入代码有一些限制不是很困难)
    • 是的,您必须在这两种方法中修改 clang。第二个侵入性较小。在 Windows 上构建 clang 并不难。您从 CMake 文件中获得了一个 Visual Studio 项目,并且(如果我没记错的话)clang/LLVM 不需要任何依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2015-12-29
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多