__builtin_va_start定义在哪里?

4

我正在尝试查找GCC源代码中定义__builtin_va_start的位置,并看看它是如何实现的。(我一开始是在寻找定义va_start的地方,然后发现这个宏被定义为__builtin_va_start。)我在GCC 9.1的源代码目录中使用cscope -r搜索了定义,但没有找到。有人可以指出这个函数的定义在哪里吗?


4
https://gcc.gnu.org/viewvc/gcc/trunk/gcc/builtins.c?view=markup#l5162 - cpplearner
1
你应该在问题中解释清楚,而不是在评论中。作为一个经验法则,永远不要在自己的问题下发表评论(相反,编辑你的问题以改进它)。我仍然认为它应该被关闭,因为你还没有编辑你的问题。 - Basile Starynkevitch
我在我的回答中提到了builtins.c文件中的expand_builtin_va_start函数,与cpplearner提供的完全相同的信息。通过简单的grep命令,可以找到cpplearner所提到的行。 - Basile Starynkevitch
我还参与了一个旨在使C语言更安全的项目。请查看我所提到的草案bismon报告。因此,我认为您应该接受我的答案。 - Basile Starynkevitch
您能否通过电子邮件发送一份BibTeX条目至basile.starynkevitch@cea.fr,用于您的论文。谢谢。 - Basile Starynkevitch
显示剩余7条评论
1个回答

8
__builtin_va_start在任何地方都没有被定义。它是GCC编译器内置函数(有点像sizeof是一个编译时运算符)。它是与<stdarg.h> 标准头文件相关的实现细节(由编译器提供,而不是C标准库实现libc)。真正重要的是生成的汇编遵循的调用约定ABI
GCC有特殊的代码来处理编译器内置函数。而这段代码不是定义内置函数,而是在编译器内部实现其特定行为。而__builtin_va_start会被扩展成一些特定于GCC的编译后C/C++代码的内部表示形式(例如GIMPLE)。请注意,这里只涉及实现细节,如果您对此感兴趣,请在问题中提出。
如果您研究GCC 9.1源代码,请查看一些gcc-9.1.0/gcc/builtins.c(其中的expand_builtin_va_start函数),以及其他内置函数,这些内置函数位于gcc-9.1.0/gcc/c-family/c-cppbuiltin.cgcc-9.1.0/gcc/cppbuiltin.cgcc-9.1.0/gcc/jit/jit-builtins.c中。
您可以在2019年第二季度为GCC 9编写自己的GCC插件,并且您的插件的C++代码可能需要更改以适应未来的GCC 10。顺便说一句,您甚至可以通过自己的特定代码重载现有的__builtin_va_start行为,并且/或者您可能具有自己的stdarg.h头文件,其中包含#define va_start(v,l) __my_builtin_va_start(v,l),并且让您的GCC插件理解您的__my_builtin_va_start插件特定的内置函数。但是请注意GCC运行时库异常并阅读其原理:我不是律师,但我倾向于认为您应该(并且法律文件要求您)使用某些开源许可证发布您的GCC插件。
你需要首先阅读一本编译器的教材,比如 Dragon book,来了解一个 优化编译器 主要是对编译代码的内部表示进行转换。
此外,你还需要花费数月时间研究 GCC 的许多内部表示。记住,GCC 是一个非常复杂的程序(大约有一千万行代码)。不要指望只用几天就能理解它。参考 GCC 资源中心网站

我已经停止了GCC MELT项目,但是该项目有参考资料和幻灯片来解释更多关于GCC的内容(GCC的设计哲学和架构变化缓慢,因此即使个别细节发生变化,这些概念仍然具有相关性)。我花费了将近十年的全职时间才部分理解了GCC的一些中间层。我无法通过StackOverflow回答来传授那些知识。

我的草稿 Bismon报告(正在进行中,由H2020资助,因此存在很多官僚主义)在其第§1.3和1.4节中引入了GCC的内部表示方式,共有十几页。


我很难理解“GCC内置函数没有定义在任何地方”的含义。您能详细说明一下吗?据我所知,在编译过程中,__builtin_va_start 在某个时刻会被一些代码替换掉。我正在尝试理解它被替换成了什么代码以及那段代码在哪里被定义。 - Jay
是的,你的理解是错误的。你需要花几个月的时间阅读更多关于编译器实现和GCC内部的内容。 - Basile Starynkevitch
请问编译器如何“理解”那些内置函数的作用,即使它们没有在任何地方被“定义”? - Jay
对不起,我提供了几个参考资料,但你需要多年的工作经验。 - Basile Starynkevitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接