В LLVM и C можно извлечь аргументы из va_list
внутри вызываемой функции, не зная их числа и типа до времени выполнения.
Например, в псевдокоде (дайте мне знать, если он слишком далеко удален от SSA; я стараюсь, чтобы он был чистым / коротким / высокоуровневым):
fn callee(...) {
args = va_list()
va_start(args)
// extract the args and use them:
while not finished {
switch (expected_type_of_arg()) {
case "int" {
int arg = va_arg(args, int)
}
case "float" {
float arg = va_arg(args, float)
}
...
}
}
}
Я хотел бы сделать зеркальное отображение: вставка аргументов в va_list
из вне вызываемой функции (т. Е. На сайте вызова), без знания количества и типа аргументов до времени выполнения. (Предположим, однако, что у меня достаточно метаданных, чтобы соответствовать сигнатуре вызываемого абонента, какой бы она ни была).
Вот так (снова псевдокод):
fn caller() {
args = va_list()
va_start(args, alloca(space_needed())) // e.g.
// insert the args for the callee:
while not finished {
switch (expected_type_of_arg()) {
case "int" {
va_assign(args, int, int_val)
}
case "float" {
va_assign(args, float, float_val)
}
...
}
}
invoke(callee, va_list);
}
Возможно ли динамически построить инструкцию вызова функции таким образом в LLVM? Предположим, что это не приемлемо / невозможно переопределить подпись вызываемого для принятия указателя на va_arg (хотя я не уверен, что это тоже поможет?).
Насколько я могу судить, инструкция call
SSA требует компиляции последовательность аргументов и сигнатура типа во время компиляции. Есть ли флаг, синтаксис или другая инструкция, чтобы обойти это и сделать то, что описано выше?