如何在LLVM传递中添加特定于平台的函数定义?

时间:2017-11-25 01:10:43

标签: llvm

我正在尝试为系统提供的功能添加功能声明 但是,函数原型返回size_t,它在32位平台上为int32,在64位平台上为int64 我想知道是否有一种方法来检测目标平台并相应地添加声明?

1 个答案:

答案 0 :(得分:1)

经过一些研究,LLVM IR作为目标中性语言不可能知道特定于目标的类型大小。看看Chris {{}}关于这个主题的评论。this相关讨论。此外,在this相关的SO问题上。

所以,这是前端的工作,这会导致额外的簿记信息,前端需要"知道"对于目标及其ABI。因此,例如,对于this编程语言,您可能需要Loci等项目。

现在,根据this专门针对size_t

  

[...] {...}}可以安全地存储任何非成员指针的值   在哪种情况下,它与std::size_t同义。

因此,您可以使用DataLayout类的std::uintptr_t方法。

对于任何其他数据类型,我不确定"猜测" 可以带给您多少(从以前的参考文献来看可能不是很远)。

最后,另一个替代方案可能是extending getIntPtrType,其中包含自定义内在函数(例如,请参阅memcpy),这不可避免地会针对每个目标进行特定定义。

为了实际调整整数类型创建,您可以使用sizeof运算符以及CHAR_BIT的使用,以便在getIntNType中提供正确的位数调用

<击>

这将使您在构建模块传递的平台上使用正确的整数类型大小。

用于动态检测类型的大小&#39;在运行pass的平台上,我知道除了在某种配置文件中提供该信息之外别无其他。

但是,这可以自动化并使用各种构建系统的示例(例如LLVM也使用LLVM),您可以创建一个可以编译的自然代码的简单程序

为此,为了使其尽可能便携并避免重新发明轮子,您可以使用cmake的{​​{3}}模块。