让LLVM根据平台选择int大小

时间:2019-07-03 02:11:05

标签: llvm llvm-ir

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

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

由于我希望前端与平台无关,是否有任何机制可以让LLVM为我选择一种类型的大小?

2 个答案:

答案 0 :(得分:1)

由于“ int”是C / C ++功能,因此其大小由C / C ++平台ABI指定。 clang肯定知道必要的大小/对齐方式,因此您需要以一种或另一种方式与C / C ++前端集成(例如,一次执行clang以得出必要的大小)。

答案 1 :(得分:1)

这不是您想要的,但是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)的或多或少的扩展版本来提供8位,16位,32位和64位整数。除读取/写入内存外,所有操作均具有相同的性能。但是您可以ask LLVM which ones of 16/32/48/64 are good,然后选择适合您的int大小。