clang:生成LLVM IR时支持bitwidth属性

时间:2014-12-19 09:16:46

标签: c clang llvm llvm-ir

我想在使用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 Assembly:

@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选项)被重新定义为非常复杂。真?

1 个答案:

答案 0 :(得分:1)

为clang添加新目标并不难。将现有的目标视图包含在clang中并“克隆”该方法。但是,目标“通常”定义严格的数据布局,通过后端控制程序集的生成。

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

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

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