LLVM允许call
指令和define
指定调用约定。 IR本身是否已经需要遵守指定的惯例?例如,当使用ccc
时,我认为返回值需要适合我的OS /架构上的64位eax
。我是否允许编写LLVM IR代码,返回3 i32
的结构? LLVM是否将其转换为符合C调用约定的内容?我可以在不更改任何其他代码的情况下更改调用约定吗?
当我查看使用-emit-llvm
编译C文件的输出时,IR生成器已经应用了调用约定,并将在调用站点分配,并将返回值转换为指针参数。这个阶段绝对必要吗? LLVM如何处理下一阶段使用的调用约定的信息-emit-obj
?
答案 0 :(得分:2)
遗憾的是,这里混杂了很多东西。调用约定通常根据源语言定义。转换为LLVM IR时,许多必要的细节已经丢失。因此,为了保留ABI和调用约定,前端应该正确地布置参数/返回值,以便它们在LLVM级别上正确编码。
因此,长话短说:调用约定包含高级(源语言)和低级需求。前者由前端处理,后者由后端处理。您可以更改LLVM IR,但是您需要确保生成的代码确实与您的C代码兼容。在某些平台上,这可能很复杂。