我正在试图理解从C++程序生成的LLVM IR。
生成的 IR(中间代码)如下:
int add(int *x);
int func()
{
int T;
T=25;
return add(&T);
}
生成的 IR(中间代码)如下:
define i32 @_Z4funcv() local_unnamed_addr #0 {
entry:
%T = alloca i32, align 4
%0 = bitcast i32* %T to i8*
call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) #3
store i32 25, i32* %T, align 4, !tbaa !2
%call = call i32 @_Z3addPi(i32* nonnull %T)
call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) #3
ret i32 %call
}
我不理解这行代码的意思 %0 = bitcast i32* %T to i8*
。将%T
从i32
转换为i8
有什么作用呢?
@llvm.lifetime.start
内置函数,表示在该函数中直到这一点(即下一个store
之前)该指针已经无效。你可以查看文档和LLVM源代码以获取示例用法。 - compor