我试图找到__builtin_va_start在GCC源代码中定义的位置,并查看其实现方式。(我一直在寻找va_start定义的位置,然后发现该宏定义为__builtin_va_start。)我cscope -r在GCC 9.1的源代码目录中使用它来搜索定义,但没有找到它。谁能指出该函数的定义位置?
那__builtin_va_start在任何地方都没有定义。它是内置的GCC编译器(有点像编译时运sizeof算符)。它是与标准头相关的实现细节(由编译器提供,而不是C标准库实现)。真正重要的是调用约定和ABI,然后是生成的汇编程序。<stdarg.h> libc
GCC具有处理编译器内置程序的特殊代码。该代码不是定义内置函数,而是在编译器内部实现其即席行为。而__builtin_va_start被扩展到一些具体的编译器内部表示的已编译的C / C ++代码,具体到GCC(一些GIMPLE也许)
根据您的评论,我推断您对实现细节感兴趣。但这应该是你的问题
如果你研究GCC 9.1的源代码,看看里面一些的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
您可以编写自己的GCC插件(在2019年第二季度适用于GCC 9,并且将来的GCC 10可能必须更改插件的C ++代码)以添加自己的GCC内置插件。顺便说一句,您甚至可能通过自己的特定代码超载现有 的行为__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的内部代表。
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |