getelementptr是 llvm ir 中常用的获取复杂地址的指令,目前我只遇到了其中一个比较坑的地方,后面如果遇到更多的注意点,这个部分可能会考虑单开一个文章记录。 获取结构体成员 假设我们定义了如下结构体: %struct.Test=type{i32,double} 那么想要获取第二个成员,则需要使用如下指令: %4=getelementptrinbounds%struct...
definevoid@_Z2f2v()#1{%1=call i8*@__cxa_allocate_exception(i648)#2%2=bitcast i8*%1to i8**store i8*getelementptrinbounds([6x i8],[6x i8]*@.str,i640,i640),i8**%2,align16callvoid@__cxa_throw(i8*%1,i8*bitcast(i8**@_ZTIPKc to i8*),i8*null)#3unreachable}declare i8*@__...
, getelementptr inbounds (TY, CSTPTR, IDX0, IDX1, …):在常量上执行getelementptr操作。与getelementptr指令一样,其索引列表可有一个或多个索引,这些索引需要对"指向TY的指针"的类型有意义。这些索引可以隐含符号扩展或截断,以匹配CSTPTR的地址空间的索引大小。 icmp COND (VAL1, VAL2):对常数进行icmp...
%format_str = getelementptr inbounds [4 x i8], [4 x i8]* @.str, i64 0, i64 0 call i32 (i8*, ...) @printf(i8* %format_str, i32 %sum) ret i32 %sum } 在这个示例中,我们首先使用add指令计算a+b的值,然后使用getelementptr指令获取全局字符串@.str的指针,该字符串包含格式化字符串...
%a=getelementptrinboundsi32,ptr@f,i32-1 %b=loadi32,ptr%a 前缀数据的布局方式类似于它是前缀数据类型的全局变量的初始化器。函数将被放置在前缀数据的开头位置对齐的地方。这意味着,如果前缀数据的大小不是对齐大小的倍数,函数的入口点将不对齐。如果需要对齐函数的入口点,则必须在前缀数据中添加填充。
%call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.5, i64 0, i64 0), i8* %2, i8* %3) store i32 -1907967449, i32* %switchVar br label %loopEnd2 if.else: ; preds =...
%arrayidxalteredBB = getelementptr inbounds i8*, i8** %70, i64 1 %71 = load i8*, i8** %arrayidxalteredBB, align 8 %callalteredBB = call i32 @atoi(i8* %71) #3 store i32 %callalteredBB, i32* %aalteredBB, align 4
body in_loop_body: ;read & swap %tmpj_left = load i32, i32* %j, align 4 %tmpj_right = add i32 %tmpj_left, 1 %left_addr = getelementptr inbounds i32, i32* %0, i32 %tmpj_left %right_addr = getelementptr inbounds i32, i32* %0, i32 %tmpj_right ...
callvoid@llvm.memset.p0i8.i64(i8*align16getelementptrinbounds([256xi8], [256xi8]*@s,i640,i640),i80,i64256,i1false) callvoid@llvm.memset.p0i8.i64(i8*align16getelementptrinbounds([256xi8], [256xi8]*@t,i640,i640),i80,i64256,i1false) ...
%addr = getelementptr inbounds i32, i32* %0, i32 %i %val = load i32, i32* %addr, align 4 %new_res = add i32 %res, %val %newi = add i32 %i, 1 br label %loop final: ret i32 %res; } 下面是一个数组冒泡排序的函数片段。这个函数包含两个循环体。LLVM IR实现循环本身就比较复杂...