LLVM: SSA для вызова функции с Dynami c число + тип аргументов - PullRequest
0 голосов
/ 17 января 2020

В 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 требует компиляции последовательность аргументов и сигнатура типа во время компиляции. Есть ли флаг, синтаксис или другая инструкция, чтобы обойти это и сделать то, что описано выше?

...