Я пишу генератор LLVM IR для языка псевдокодов. Этот язык должен позволить переопределить функцию.Ошибка LLVM: неверное переопределение функции
Вот один случай, когда у меня есть две функции с именем «f», но у них разные параметры.
function f(int i, float r) returns int { return i; }
function f(float r, float r2) returns int {return i; }
Я думал LLVM мог отчетливый, но я получаю
error: invalid redefinition of function
И код, который я генерируемый:
define i32 @f(i32 %i, float %r) {
%var.i.0 = alloca i32
store i32 %i, i32* %var.i.0
%var.r.1 = alloca float
store float %r, float* %var.r.1
%int.2 = load i32* %var.i.0
ret i32 %int.2
; -- 0 :: i32
%int.3 = add i32 0, 0
ret i32 %int.3
}
define i32 @f(float %r, float %r2) {
%var.r.2 = alloca float
store float %r, float* %var.r.2
%var.r2.3 = alloca float
store float %r2, float* %var.r2.3
%var.i.4 = alloca i32
%float.3 = load float* %var.r.2
%int.7 = fptosi float %float.3 to i32
store i32 %int.7, i32* %var.i.4
%int.8 = load i32* %var.i.4
ret i32 %int.8
; -- 0 :: i32
%int.9 = add i32 0, 0
ret i32 %int.9
}
Так что, я думаю, что LLVM не допускают перегрузку функции? Тогда хорошая идея, что я генерирую последовательный счетчик и выделяю все эти функции, добавляя этот последовательный счетчик в качестве суффикса i.e define i32 @f.1()
и define i32 @f.2()
?
Я m сделать то же самое для динамически типизированного языка, и я взял генерацию сигнатур функций как '@ modulename_functionname_xyz', где' xy' кодирует arity. В вашем случае вы можете кодировать тип. Например. @ foo.f_if и @ foo.f_ff. –
@FrankC. Я собираюсь изменить эту вещь позже, но пока я буду ее дифференцировать с помощью счетчика, так как я не единственный человек, который работает над этим. –