LLVM IR中的调用约定

LLVM IR中的调用约定,llvm,llvm-ir,Llvm,Llvm Ir,LLVM允许call指令和defines指定调用约定。IR本身是否已经需要遵守指定的约定?例如,当使用ccc时,我认为返回值需要适合我的操作系统/体系结构上的64位eax。我是否可以编写LLVM IR代码,返回3i32的结构?LLVM是否将其转换为遵守C调用约定的内容?我可以在不更改任何其他代码的情况下更改呼叫约定吗 当我查看使用-emit llvm编译C文件的输出时,IR生成器已经应用了调用约定,将在调用站点进行分配,并将返回值转换为指针参数。在现阶段这是绝对必要的吗?LLVM如何处理下一阶段

LLVM允许
call
指令和
define
s指定调用约定。IR本身是否已经需要遵守指定的约定?例如,当使用
ccc
时,我认为返回值需要适合我的操作系统/体系结构上的64位
eax
。我是否可以编写LLVM IR代码,返回3
i32
的结构?LLVM是否将其转换为遵守C调用约定的内容?我可以在不更改任何其他代码的情况下更改呼叫约定吗


当我查看使用
-emit llvm
编译C文件的输出时,IR生成器已经应用了调用约定,将在调用站点进行分配,并将返回值转换为指针参数。在现阶段这是绝对必要的吗?LLVM如何处理下一阶段使用的调用约定的信息,
-emit obj

不幸的是,这里有很多东西混合在一起。调用约定通常是根据源语言定义的。在转换为LLVM IR时,许多必要的细节已经丢失。因此,为了保留ABI和调用约定,前端应该适当地布置参数/返回值,以便在LLVM级别对它们进行适当的编码

因此,长话短说:调用约定包含高级(源语言)和低级需求。前者由前端处理,后者由后端处理。您可以更改LLVM IR,但需要确保生成的代码确实与您的C代码兼容。在某些平台上,这可能很复杂