违反ABI调用约定的后果是什么?



我正在做一些编译器编写项目,我想确保我正确理解ABI和调用约定。

假设我正在为某种高级语言编写编译器L,目标是某个系统S.

如果我理解正确的话,只要我为L生成指令调用其他L的方法方法,我可以使用任何我想要的调用约定。唯一需要遵循S指定的标准调用约定的时候当我想进行系统调用或调用遵循ABI调用约定的外部函数时,

这种理解正确吗?此外,除了与外部函数的明显兼容性之外,语言运行库具有不同的内部调用约定是否有任何负面后果?

如果这是你的语言,你可以在硬件和操作系统的约束下,在内部使用任何你喜欢的调用约定(参见@RaymondChen的注释中的示例)。如果你知道你可以看到一个函数的所有调用位置,你甚至不必保持一致。

但:

  • 如果你想调用外部函数,你还需要实现它们的调用约定(和名称混淆,如果需要的话)。

  • 如果您希望外部函数能够调用您的函数(包括您使用的任何顶级函数),您需要实现他们期望您做的事情。所以你可能需要一些类似c++的extern "<language>"语法来标记外部可调用对象。

系统调用通常有自己的调用过程;通常,这涉及到使用一个引发中断的专用操作码。标准库通常包括用于系统调用的包装器,但是如果你有一些用于声明函数调用约定的语法,你也可以将其用于系统调用,尽管这会限制可移植性。

但是这些都不是反对创建自己的ABI的理由。实际上,您的语言设计可能依赖于没有自定义ABI就无法有效实现的特性(异常、协程、分隔的延续、生成器、异步过程等)。

最新更新