Первое: вы не можете использовать хвостовой вызов, если хотите передать переменные:
http://llvm.org/docs/LangRef.html
- Необязательный маркер "tail" указывает, что вызываемый абонентФункция не имеет доступа к allocas или varargs в вызывающем абоненте.
Второе: Каковы ваши соглашения о вызовах?
Третье: для обработки varargs (как в C) вам нужноиспользовать функции va_*
для создания нового списка va_list и копирования в него всех параметров:
http://llvm.org/docs/LangRef.html#int-varargs
Last: каждая функция, которая будет вызываться этим диспетчером, должна использовать va_*
функциичтобы получить его аргументы.
ОБНОВЛЕНИЕ:
Вы должны знать, какое соглашение о вызовах вы будете использовать (какое по умолчанию), прежде чем вы скажете о стеке как хранилище аргументов функции.Затем.Вы не можете получить доступ, не передавая аргумент "..." без функций va_ *, потому что это ЕДИНСТВЕННЫЙ способ получить к ним доступ в сборке LLVM.
Существует способ выполнить что-то, как в C, здесьprintf вызовет vfprintf со всеми аргументами "..." и не зная, сколько аргументов нужно передать
// 3-clause BSD licensed to The Regents of the University of California.
int
printf(const char *fmt, ...)
{
int ret;
va_list ap;
va_start(ap, fmt);
ret = vfprintf(stdout, fmt, ap);
va_end(ap);
return (ret);
}
Vfprintf объявлен специальным образом, чтобы получить "..." и извлечь из него аргументы:
int
vfprintf(FILE *fp, const char *fmt0, __va_list ap)
{
...
va_arg(ap, type) //to get next arg of type `type`