__builtin_va_start在哪里定义?

时间:2019-06-02 05:06:09

标签: gcc glibc

我试图找到__builtin_va_start在GCC的源代码中定义的位置。 (我一直在寻找va_start的定义位置,然后发现此宏定义为__builtin_va_start。)我在GCC 9.1的源代码目录中使用cscope -r来搜索该定义,但避风港没找到。谁能指出该函数的定义位置?

1 个答案:

答案 0 :(得分:0)

__builtin_va_start在任何地方未定义 。它是GCC compiler builtin(有点像sizeof是编译时运算符)。这是与<stdarg.h> standard header(由编译器提供,而不是C标准库实现libc提供)的实现细节。真正重要的是calling conventionsABI,后跟生成的汇编程序。

GCC具有处理编译器内置程序的特殊代码。该代码不是定义内置的,而是实现其在编译器中的临时行为__builtin_va_start被扩展为您的已编译C / C ++代码的某些特定于编译器的内部表示,特定于GCC(也许有些GIMPLE / p>

根据您的评论,我推断您对实现细节感兴趣。但是应该在您的问题中

如果您学习GCC 9.1源代码,请查看 gcc-9.1.0/gcc/builtins.c some (其中的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

中的其他内置函数

您可以编写自己的GCC plugin(在2019年第二季度中,对于GCC 9,对于将来的GCC 10,可能必须更改插件的C ++代码)以添加自己的GCC内置程序。顺便说一句,您甚至可以通过自己的特定代码来超载 现有 __builtin_va_start的行为,并且/或者您可能(至少出于研究目的)拥有拥有带有stdarg.h的{​​{1}}标头,并使您的GCC插件了解您的#define va_start(v,l) __my_builtin_va_start(v,l)特定于插件的内置函数。但是请注意GCC runtime library exception并阅读其基本原理:我不是律师,但是我倾向于认为您应该(并且该法律文件要求您)发布具有某些开源许可证的GCC插件。

您首先需要阅读一本有关编译器的教科书,例如Dragon book ,以了解optimizing compiler主要是 transforming 内部表示形式编译后的代码。

您还需要花费几个月的时间来研究GCC的许多内部表示形式。请记住, GCC是一个非常复杂的程序(大约一千万行代码)。不要指望只有几天的工作就可以理解它。查看GCC resource center website内。

我死去的GCC MELT项目中有参考书目和slides解释了GCC的更多内容(GCC的设计理念和体系结构变化缓慢;因此,即使个别细节有所变化,这些概念仍然相关)。 我花了几乎整整十年的时间来部分了解GCC的一些中端层。我无法在StackOverflow答案中传达这些知识。

我的draft Bismon report(正在进行中,由H2020资助,官僚机构众多)有十几页(在第1.3和1.4节中)介绍了GCC的内部表示形式。