疑似コード言語用のLLVM IRジェネレータを作成しています。この言語は機能の再定義を可能にすべきである。LLVMエラー:関数の再定義が無効です
「f」という名前の2つの機能がありますが、パラメータが異なります。私はLLVMが明瞭でなく、私は
error: invalid redefinition of function
そして、私は、生成されたコードを取得できると思っていた
function f(int i, float r) returns int { return i; }
function f(float r, float r2) returns int {return i; }
がある:だから
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は、関数のオーバーロードを許可しないと思いますか?それから、シーケンシャルカウンタを生成し、このシーケンシャルカウンタを接尾辞として追加することでこれらの機能をすべて区別することをお勧めします。つまり、define i32 @f.1()
とdefine i32 @f.2()
?
私は」動的に型付けされた言語のために同じことをしています。関数署名を '@ modulename_functionname_xyz'として生成しました。ここで' xy'は引数をエンコードします。あなたの場合は、型をエンコードすることができます。例えば。 @ foo.f_ifと@ foo.f_ff。 –
@FrankC。私はこのことを後で変えることを考えていますが、今は私がカウンターで分化させておきます。私はこのことを研究する唯一の人ではないからです。 –