getelementptr是 llvm ir 中常用的获取复杂地址的指令,目前我只遇到了其中一个比较坑的地方,后面如果遇到更多的注意点,这个部分可能会考虑单开一个文章记录。 获取结构体成员 假设我们定义了如下结构体: %struct.Test=type{i32,double} 那么想要获取第二个成员,则需要使用如下指令: %4=getelementptrinbounds%struct...
若指针通过ptr + N的方式来表示,有两种对应的IR表示,分别是getelementptr inbounds和getelementptr。下面的用例分别表示不同种类的指针和对应的IR char g17[] = "foobar"; char *g20 = g17+0; char *g22 = &g17-3; 对应的IR @g17 = dso_local global [7 x i8] c"foobar\00", align 1, !d...
%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的指针,该字符串包含格式化字符串...
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*@__...
callvoid@llvm.memset.p0i8.i64(i8*align16getelementptrinbounds([256xi8], [256xi8]*@t,i640,i640),i80,i64256,i1false) storei320,i32*%5,align4 brlabel%7 7: ;preds=%26,%2 %8=loadi32,i32*%5,align4 %9=icmpslti32%8,256 ...
LLVM IR 示例与语法 示例程序 我们编写一个简单的 C 语言程序,并将其编译为 LLVM IR。 test.c 文件内容如下: 代码语言:c 代码运行次数:0 运行 AI代码解释 #include<stdio.h>voidtest(inta,intb){intc=a+b;}intmain(void){inta=10;intb=20;test(a,b);return0;} ...
%22 = getelementptr inbounds i8, i8* %19, i64 %21 // 取出当前处理字符 %23 = load i8, i8* %22, align 1 %24 = zext i8 %23 to i32 // 类型强制转化 %25 = ashr i32 %24, 2 // 算数右移两位 input[i]>>2 %26 = add nsw i32 %25, 59 // input[i]+59 ...
要访问给定函数的数据,程序可以将函数指针位转换为指向常量类型的指针,并解引用索引-1。这意味着IR符号指向前缀数据的末尾之后。例如,考虑一个带有单个i32注释的函数的例子, definevoid@f()prefixi32123{ ... } 前缀数据可以被引用为: %a=getelementptrinboundsi32,ptr@f,i32-1 ...
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 ...
%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 =...