我正在尝试查找GCC源代码中定义__builtin_va_start
的位置,并看看它是如何实现的。(我一开始是在寻找定义va_start
的地方,然后发现这个宏被定义为__builtin_va_start
。)我在GCC 9.1的源代码目录中使用cscope -r
搜索了定义,但没有找到。有人可以指出这个函数的定义在哪里吗?
__builtin_va_start
在任何地方都没有被定义。它是GCC编译器内置函数(有点像sizeof
是一个编译时运算符)。它是与<stdarg.h>
标准头文件相关的实现细节(由编译器提供,而不是C标准库实现libc
)。真正重要的是生成的汇编遵循的调用约定和ABI。gcc-9.1.0/gcc/builtins.c
(其中的expand_builtin_va_start
函数),以及其他内置函数,这些内置函数位于gcc-9.1.0/gcc/c-family/c-cppbuiltin.c
、gcc-9.1.0/gcc/cppbuiltin.c
和gcc-9.1.0/gcc/jit/jit-builtins.c
中。__builtin_va_start
行为,并且/或者您可能具有自己的stdarg.h
头文件,其中包含#define va_start(v,l) __my_builtin_va_start(v,l)
,并且让您的GCC插件理解您的__my_builtin_va_start
插件特定的内置函数。但是请注意GCC运行时库异常并阅读其原理:我不是律师,但我倾向于认为您应该(并且法律文件要求您)使用某些开源许可证发布您的GCC插件。我已经停止了GCC MELT项目,但是该项目有参考资料和幻灯片来解释更多关于GCC的内容(GCC的设计哲学和架构变化缓慢,因此即使个别细节发生变化,这些概念仍然具有相关性)。我花费了将近十年的全职时间才部分理解了GCC的一些中间层。我无法通过StackOverflow回答来传授那些知识。
我的草稿 Bismon报告(正在进行中,由H2020资助,因此存在很多官僚主义)在其第§1.3和1.4节中引入了GCC的内部表示方式,共有十几页。
__builtin_va_start
在某个时刻会被一些代码替换掉。我正在尝试理解它被替换成了什么代码以及那段代码在哪里被定义。 - Jay
builtins.c
文件中的expand_builtin_va_start
函数,与cpplearner提供的完全相同的信息。通过简单的grep
命令,可以找到cpplearner所提到的行。 - Basile Starynkevitchbasile.starynkevitch@cea.fr
,用于您的论文。谢谢。 - Basile Starynkevitch