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

问题描述:

我想在使用clang生成LLVM IR代码时使用__attribute__((bitwidth(N)))来定义自定义大小的整数类型。我发现有一些信息is no plan to support this attribute。但是,支持IR生成的这种属性(即装配表示)将会非常有用。clang:在生成LLVM时支持位宽属性IR

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

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添加一个新的目标并不难。采取现有的目标外观,将其纳入叮当声并“克隆”方法。然而,目标“通常”定义了一个严格的数据布局来控制后端生成装配。

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

所以,如果你想要位宽支持,你可以添加这个属性叮当一个不同的目标,并将其限制在这个目标只。

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

+0

谢谢!你建议的两种方法都需要修改clang来源,对吗?我觉得这不是一种选择,因为我需要在windows计算机上使用完整的构建工具链来实现叮当声......这实施了太多的依赖关系。我目前的方法仅基于C#/ .NET(即Visual Studio) clang被称为可执行文件,LLVM IR只是使用“Sprache”进行简单解析(对于输入代码而言不是很困难) – TheFish 2014-12-19 19:11:27

+1

是的,您必须在两种方法中修改clang。第二种侵扰性较小。在Windows上构建铛声并不难。你从CMake文件中获得一个Visual Studio项目,并且(如果我没有记错的话)clang/LLVM不需要任何依赖。 – 2014-12-19 22:39:46