让 LLVM 根据平台选择 int 大小

Let LLVM choose int size depend on platform

我正在编写一个编译器,我希望我的前端与平台细节几乎没有关系,尤其是原型类型(int、long 等)的大小。

现在,如果我创建一个 int 变量,我必须使用 IntegerType::get(mod->getContext(), 32)。通过使用它,我必须知道平台信息并设置 3216.

既然我希望我的前端与平台关系不大,有没有什么机制可以让LLVM为我选择一个类型的大小?

因为"int"是一个C/C++特性,那么它的大小由C/C++平台ABI指定。 clang 肯定知道必要的大小/对齐方式,因此您需要以一种或另一种方式与 C/C++ 前端集成(例如,执行一次 clang 以获得必要的大小)。

这不是您想要的,但 LLVM 确实有一种机制可以询问目标平台的大小,称为 DataLayout。这是我用来生成调试信息的一些代码:

const DataLayout & dl = getModule().getDataLayout();
uint sizeInBits = 0;
if(...)
  sizeInBits = dl.getStructLayout(getObjectStructType())->getSizeInBits();
...

DataLayout 不为整数提供单一大小,因为 the CPU may may have several,正如 Intel 4004 家族的当前成员所做的那样。

IIRC 所有当前成员都使用相同寄存器(AL、AX、EAX、RAX)的 more-or-less 扩展版本提供 8 位、16 位、32 位和 64 位整数,对于内存的 reading/writing 以外的所有操作具有相同的性能。但是你可以 ask LLVM which ones of 16/32/48/64 are good 然后选择一个适合你的 int 大小。