执行__builtin_va_start(v,l)

时间:2014-03-25 17:36:05

标签: c gcc variadic-functions

在glibc中找到可变宏的兔子洞,我已经到达/usr/lib/gcc/x86_64-linux-gnu/4.8.2/include/stdarg.h,例如,va_start宏被定义为:

#define va_start(v,l) __builtin_va_start(v,l)

但我一直试图寻找__builtin_va_start(v,l)的实际实施而没有成功。我已经用Google搜索并为它进行了搜索,对于Visual Studio来说,我得到的最远的是Microsoft’s implementation,我认为它并没有根本不同。

有人知道glibc实现的位置吗?

TIA。

3 个答案:

答案 0 :(得分:10)

要查看gcc的源代码,请从http://www.netgull.com/gcc/releases/下载匹配版本。例如,4.8.2版本为http://www.netgull.com/gcc/releases/gcc-4.8.2/(82 MB)。

内置关键字在gcc/builtins.c

的第4169行处理

答案 1 :(得分:1)

一般情况下,要了解gcc如何扩展名为“__builtin_ foo ”的内置gcc函数,请在gcc源代码中查看函数'expand_builtin_ foo <的声明/ EM>”。

答案 2 :(得分:0)

在内核0.01 linux中查看stdarg.h的想法 - va_start是一个宏,它以从第一个参数加上其大小(舍入到机器字大小)开始的增量初始化ap; va_arg将ap设置为给定的类型,并以相同的方式进一步递增ap(将类型舍入为机器字)

#define __va_rounded_size(TYPE)  \
  ( ( (sizeof (TYPE) + sizeof (int) - 1) / sizeof (int) ) * sizeof (int)  )

#define va_start(AP, LASTARG)                       \
 (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))

#define va_arg(AP, TYPE)                        \
  (AP += __va_rounded_size (TYPE),                  \
  *((TYPE *) (AP - __va_rounded_size (TYPE)) ))