如何实现“ __builtin_va_list”?

lin*_*ang 3 c gcc clang

我想深入研究macOS上C语言中“ printf”函数的实现。“ printf”使用<stdarg.h>头文件。我打开<stdarg.h>文件,发现那va_list只是一个宏。

所以,我真的很好奇如何__builtin_va_list实现?我知道它是特定于编译器的。在哪里可以找到的定义__builtin_va_list?我应该下载clang编译器的源代码吗?

Bas*_*tch 5

所以,我真的很好奇__builtin_va_list是如何实现的?

__builtin_va_list实现内部GCC编译器(或锵/ LLVM之一)。因此,您应该研究GCC编译器源代码以了解详细信息。

查看gcc / builtins.defgcc / builtins.c了解更多信息。

我不太熟悉Clang,它实现了相同的内置函数。

但是GCC和Clang都是开源或免费软件。它们是复杂的野兽(每个野兽都有几百万行代码),因此您可能需要花很多年的时间才能理解它们。

请注意,编译器的ABI很重要。例如,查看X86 psABI以获得更多详细信息。

顺便说一句,格雷迪播放器评论:

为每个这些令牌从栈中弹出正确的字节数...

不幸的是,今天它要复杂得多。在当前的处理器和ABI上,调用约定确实使用处理器寄存器来传递一些参数(而罪魁祸首是细节)。

我应该下载clang编译器的源代码吗?

是的,您还需要分配几年的工作来了解详细信息。

几年前,我确实编写了一些教程幻灯片和有关GCC实施的外部文档的链接,请参阅我的GCC MELT文档页面(有点烂)。

  • @GradyPlayer 据我所知,可变参数函数是用寄存器中的参数调用的,就像其他函数一样;此外,%al 必须设置为用于浮点参数的向量寄存器的数量。https://c9x.me/compile/doc/abi.html (2认同)