我正在尝试为系统提供的功能添加功能声明
但是,函数原型返回size_t
,它在32位平台上为int32,在64位平台上为int64
我想知道是否有一种方法来检测目标平台并相应地添加声明?
答案 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
中提供正确的位数调用击>
这将使您在构建模块传递的平台上使用正确的整数类型大小。
用于动态检测类型的大小'在运行pass的平台上,我知道除了在某种配置文件中提供该信息之外别无其他。
但是,这可以自动化并使用各种构建系统的示例(例如LLVM
也使用LLVM
),您可以创建一个可以编译的自然代码的简单程序
为此,为了使其尽可能便携并避免重新发明轮子,您可以使用cmake
的{{3}}模块。击>