2016-11-05 87 views
0

我有以下llvm ir,並花了一天的最佳時間嘗試調試它,我似乎無法得到它的處理。當我在Windows機器上運行時,程序簡單地在循環中凍結(with)segfault。llvm ir沒有按預期運行

; standard declaration etc 
%gen__list__0 = type { i8*, i64, i64 } 
%const_array_offset = type { i64, i64 } 
; other declaration etc 
@gbl_constant_59 = common constant [20 x i8] c"aaaaaaaaaaaaaaaaaaaa", align 
; more function declarations etc 

define internal %gen__list__0 @gen__fun__elevate12(%const_array_offset*) { 
entry: 
    %1 = alloca %gen__list__0 
    %2 = getelementptr %const_array_offset, %const_array_offset* %0, i32 0, i32 0 
    %3 = load i64, i64* %2 
    %4 = getelementptr %const_array_offset, %const_array_offset* %0, i32 0, i32 1 
    %5 = load i64, i64* %4 
    %6 = sub i64 %5, %3 
    %7 = mul i64 %6, i64 2 
    %8 = getelementptr %gen__list__0, %gen__list__0* %1, i32 0, i32 0 
    %9 = getelementptr %gen__list__0, %gen__list__0* %1, i32 0, i32 1 
    %10 = getelementptr %gen__list__0, %gen__list__0* %1, i32 0, i32 2 
    store i64 %6, i64* %9 
    store i64 %7, i64* %10 
    %11 = mul i64 ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64), %7 
    %12 = call i8* @malloc(i64 %11) 
    store i8* %12, i8** %8 
    %13 = getelementptr %gen__list__0, %gen__list__0* %1, i32 0, i32 0 
    %14 = load i8*, i8** %13 
    %15 = getelementptr i8, i8* %14, i64 %6 
    %16 = getelementptr [20 x i8], [20 x i8]* @gbl_constant_59, i32 0, i64 %3 
    %17 = alloca i8* 
    store i8* %16, i8** %17 
    %18 = alloca i8* 
    store i8* %14, i8** %18 
    br label %bb2 

bb2:            ; preds = %bb3, %entry 
    %19 = load i8*, i8** %18 
    %20 = icmp ne i8* %19, %15 
    br i1 %20, label %bb3, label %bb4 

bb3:            ; preds = %bb2 
    %21 = load i8*, i8** %17 
    %22 = getelementptr i8, i8* %21, i32 1 
    store i8* %22, i8** %17 
    %23 = load i8*, i8** %18 
    %24 = getelementptr i8, i8* %23, i32 1 
    store i8* %24, i8** %18 
    br label %bb2 

bb4:            ; preds = %bb2 
    %25 = load %gen__list__0, %gen__list__0* %1 
    ret %gen__list__0 %25 
} 

所有的幫助表示讚賞,以理清這/它/我可能會出錯。

循環只是簡單地實現

C++風格的僞代碼排序循環的這種實現

for(iterator it = begin; it != end; ++it) { 
    //code in loop - atm blank 
} 
+1

你試過運行'llc -debug'嗎?查看代碼掛起的位置,或在此處發佈調試信息。 – ConsistentProgrammer

回答

0

發現問題通過將代碼通過LLC。顯然常用鏈接標記的常量只能有一個零初始化器。要在沒有零初始化器的情況下擁有一個全局常量,就像這裏的@gbl_constant_59一樣,您需要聲明內部或外部常量。