Implémentation de __builtin_va_start (v, l)

En descendant dans le trou de lapin des macros variadiques dans la glibc, j’ai atteint /usr/lib/gcc/x86_64-linux-gnu/4.8.2/include/stdarg.h où, par exemple, la macro va_start est définie comme suit:

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

Mais j’ai essayé de rechercher l’implémentation réelle de __builtin_va_start(v,l) sans succès. Je l’ai cherché sur Google, et le plus éloigné est l’implémentation de Microsoft pour Visual Studio, qui, je suppose, n’est pas radicalement différente.

Est-ce que quelqu’un sait où est implémentée la glibc?

TIA.

Pour consulter le code source de gcc, téléchargez la version correspondante à l’ adresse http://www.netgull.com/gcc/releases/. Par exemple, la version 4.8.2 se trouve à l’ adresse http://www.netgull.com/gcc/ releases / gcc-4.8.2 / (82 Mo).

Le mot-clé builtin est traité à la ligne 4169 de gcc/builtins.c

En général, pour savoir comment gcc développe la fonction gcc intégrée dont le nom est ‘__builtin_ foo ‘, recherchez dans la source gcc la déclaration de la fonction ‘expand_builtin_ foo ‘.

jetez un oeil à stdarg.h dans le kernel 0.01 linux pour une idée – va_start est une macro qui initialise ap avec un incrément à partir du premier argument plus sa taille (arrondi à la taille du mot machine); va_arg définit ap comme type donné et incrémente celle-ci de la même manière (en arrondissant le type aux mots machine)

 #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)) ))