2017-06-01 13 views
1

私は大学のプロジェクトのためのコンパイラをビルドしています。私はllvmを使用しています。私のコンパイラで生成されたllvm IRはsegfaultingです

私は、最小限のプログラムのために、このIRを生成した:

; ModuleID = 'Main' 
source_filename = "Main.java" 

%A = type { i16 } 
%Main = type { i16 } 

@progvtable = constant [1 x <{ i16, i8*, i8* }>] [<{ i16, i8*, i8* }> <{ i16 0, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @1, i64 0, i64 0), i8* bitcast (i64 (%A*)* @getX to i8*) }>], align 8 
@0 = constant [8 x i8] c"%lld %c\00", align 8 
@1 = constant [5 x i8] c"getX\00", align 8 

declare i32 @strcmp(i8*, i8*) 

define i8* @vlookup(i16 %type, i8* %funcname) { 
vlookup: 
    %i = alloca i64, align 8 
    %finalres = alloca i8*, align 8 
    store i64 0, i64* %i, align 8 
    store i8* null, i8** %finalres, align 8 
    br i1 true, label %loop, label %endloop 

loop:            ; preds = %loop, %vlookup 
    %0 = load i64, i64* %i, align 8 
    %1 = getelementptr inbounds [1 x <{ i16, i8*, i8* }>], [1 x <{ i16, i8*, i8* }>]* @progvtable, i64 0, i64 %0 
    %2 = getelementptr <{ i16, i8*, i8* }>, <{ i16, i8*, i8* }>* %1, i32 0, i32 0 
    %3 = load i16, i16* %2, align 8 
    %4 = getelementptr <{ i16, i8*, i8* }>, <{ i16, i8*, i8* }>* %1, i32 0, i32 1 
    %5 = load i8*, i8** %4, align 8 
    %6 = getelementptr <{ i16, i8*, i8* }>, <{ i16, i8*, i8* }>* %1, i32 0, i32 2 
    %7 = load i8*, i8** %6, align 8 
    store i8* %7, i8** %finalres, align 8 
    %8 = icmp eq i16 %3, %type 
    %9 = call i32 @strcmp(i8* %5, i8* %funcname) 
    %10 = icmp eq i32 %9, 0 
    %11 = and i1 %10, %8 
    %12 = add i64 %0, 1 
    store i64 %12, i64* %i, align 8 
    br i1 %11, label %loop, label %endloop 

endloop:           ; preds = %loop, %vlookup 
    %13 = load i8*, i8** %finalres, align 8 
    ret i8* %13 
} 

declare i32 @printf(i8*, ...) 

declare i8* @GC_malloc(i64) 

define %A* @A_init() { 
A_init: 
    %0 = call i8* @GC_malloc(i64 2) 
    %this = bitcast i8* %0 to %A* 
    %1 = getelementptr inbounds %A, %A* %this, i32 0, i32 0 
    store i16 0, i16* %1, align 8 
    ret %A* %this 
} 

define i64 @getX(%A* %this) { 
getX: 
    ret i64 1 
} 

define %Main* @Main_init() { 
Main_init: 
    %0 = call i8* @GC_malloc(i64 2) 
    %this = bitcast i8* %0 to %Main* 
    %1 = getelementptr inbounds %Main, %Main* %this, i32 0, i32 0 
    store i16 5, i16* %1, align 8 
    ret %Main* %this 
} 

define void @main(i8**) { 
main: 
    %1 = alloca i8**, align 8 
    store i8** %0, i8*** %1, align 8 
    %args = load i8**, i8*** %1, align 8 
    %2 = alloca %A*, align 8 
    %3 = call %A* @A_init() 
    store %A* %3, %A** %2, align 8 
    %e = load %A*, %A** %2, align 8 
    %4 = getelementptr inbounds %A, %A* %e, i32 0, i32 0 
    %5 = load i16, i16* %4, align 8 
    %6 = call i8* @vlookup(i16 %5, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @1, i64 0, i64 0)) 
    %7 = bitcast i8* %6 to i64 (%A*)* 
    %8 = call i64 %7(%A* %e) 
    %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @0, i64 0, i64 0), i64 %8, i8 10) 
    ret void 
} 

現在、これが最適化されていない出力であるが、それは問題ではない、私は上記をllc、私はその後、libgc.soをリンクするgccを使用して、私は、アプリケーションを実行それはsegfaultsです。

は、私はセグメンテーション違反がstrcmpへの呼び出しで発生することが確認GDBを使用して、lldbは、いずれかのパラメータのいずれかがnullであることを示しました。

私はIRを徹底的に見ていますが、問題はありませんが、それはなぜ起こったのですか?記録@progvtableについては

は私が実装するつもりだ言語でポリモーフィズムをサポートするためにvirtual tablesの私の表現です。

私はllvm 4とgcc 7.1.1を使用しています。私のOSはArch Linux x64です。

答えて

0

愚かな私に、問題は、それがここにある非常に些細なxDである:

br i1 %11, label %loop, label %endloop 

この命令に問題が条件オペランドがそれを継続していないループを破るためにあるということである、要求されたものをすべてを切り替えることですlabel %looplabel %endloop場所。

関連する問題