llvm ir没有按预期运行

问题描述:

我有以下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

发现问题通过将代码通过LLC。显然常用链接标记的常量只能有一个零初始化器。要在没有零初始化器的情况下拥有一个全局常量,就像这里的@gbl_constant_59一样,您需要声明内部或外部常量。