2016-11-24 9 views
0

疑似コード言語用の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()

+0

私は」動的に型付けされた言語のために同じことをしています。関数署名を '@ modulename_functionname_xyz'として生成しました。ここで' xy'は引数をエンコードします。あなたの場合は、型をエンコードすることができます。例えば。 @ foo.f_ifと@ foo.f_ff。 –

+0

@FrankC。私はこのことを後で変えることを考えていますが、今は私がカウンターで分化させておきます。私はこのことを研究する唯一の人ではないからです。 –

答えて

2

LLVM IRに機能のオーバーロードがないことは間違いありません。

ご使用の言語のコードがどのように構成されているかによって、順次カウンタを使用することはおそらくお勧めできません。増分する整数を代入するだけの場合は、異なるファイルのコンパイルで確定的ではない場合があります。例えば、C++で、あなたはuser.cppをコンパイルする場合、コンパイラが参照されるfが実際にf.2という名前になりますことを知っているための方法はありません

// library.cpp 
int f(int i, float r) { ... } 
int f(float r, float r2) { ... } 

// user.cpp 
extern int f(float r, float r2); 
int foo() { return f(1.0, 2.0); } 

のようなものを想像するかもしれません。

関数のオーバーロードを実装する典型的な方法は、何らかの形で関数の型シグネチャをその名前にエンコードして、オーバーロードの存在下で一意になるようにすることです。

+0

あなたは正しいです、私は実行時ライブラリが同じ名前の関数を持つことも忘れていました。 –

1

マイ・ジェネレータはJavaで書かれているので、関数定義を解析するたびに、関数名がすでにスコープ・テーブルに存在する場合は、同じ関数名のカウンタを増やします。

私のテーブルをキーとして、関数名と地図によって定義され、値としての機能のDEFのリストされています

Map<String,ArrayList<functionSymbol>> = new HashMap<>();

、その後、コンストラクタは次のようになります。

static int counter = 0; 
public FunctionSymbol(String functionName, Type retType, List<Variable> paramList){ 
    this.functionName = functionName+counter; 
    this.paramList = paramList; 
    this.retType = retType; 
    counter++; 
} 
関連する問題