我试图理解从 C++ 程序生成的 LLVM IR
int add(int *x);
int func()
{
int T;
T=25;
return add(&T);
}
Run Code Online (Sandbox Code Playgroud)
生成的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
}
Run Code Online (Sandbox Code Playgroud)
我不明白这一行%0 = bitcast i32* %T to i8*。%T从转换i32为的目的是什么i8?
假设您了解内在函数
llvm.lifetime.start / llvm.lifetime.end
及其用作 MemoryDependenceAnalysis 的内存使用标记。
关于指针(变量地址)的选择,因为 i8 是为了使其更通用,作为字节可寻址内存区域,第一个参数的字节数与我们在 malloc 中使用的字节数相同。
因此,为了生成内部调用,我们需要一个内存字节地址和 sizeof(T) 的字节数。这就是为什么我们需要将 i32* 转换为 i8*。
顺便说一句,如果您的示例中使用的生命周期内在函数是签名
声明 void @llvm.lifetime.start(i64 , i8* nocapture )
声明 void @llvm.lifetime.end(i64 , i8* nocapture )
请通过Lang ref获取更多信息。
| 归档时间: |
|
| 查看次数: |
4785 次 |
| 最近记录: |