gpt4 book ai didi

clang:生成 LLVM IR 时支持位宽属性

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:12 25 4
gpt4 key购买 nike

在使用 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 选项)被归类为非常复杂。真的吗?

最佳答案

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

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

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

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

关于clang:生成 LLVM IR 时支持位宽属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27562835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com