我正在尝试理解我从llvm获取内核的全局注释,但我对某些事情感到困惑。
@sgv = internal constant [4 x i8] c"222\00"
@fgv = internal constant [0 x i8] zeroinitializer
@lvgv = internal constant [0 x i8*] zeroinitializer
@llvm.global.annotations = appending global [1 x { i8*, i8*, i8*, i8*, i32 }] [{ i8*, i8*, i8*, i8*, i32 } { i8* bitcast (void (float addrspace(1)*, float addrspace(1)*, float addrspace(1)*)* @add_kernel to i8*), i8* getelementptr inbounds ([4 x i8]* @sgv, i32 0, i32 0), i8* getelementptr inbounds ([0 x i8]* @fgv, i32 0, i32 0), i8* bitcast ([0 x i8*]* @lvgv to i8*), i32 0 }], section "llvm.metadata"
define void @add_kernel(float addrspace(1)* %out, float addrspace(1)* %in1, float addrspace(1)* %in2) #0 {
所以我能理解sgv,fgv& lvgv部分。但是,当我查看全局注释时,我对它感到困惑的部分就是这个。
[1 x { i8*, i8*, i8*, i8*, i32 }] -- what does the first list mean
[{ i8*, i8*, i8*, i8*, i32 } --> This part before the kernel. What does this signify.
i8* getelementptr inbounds ([4 x i8]* @sgv, i32 0, i32 0), --> In this part am
assuming the i32 0, i32 0 refer to the GEP indexes ?
我需要更多解释这个注释的结构以及这个全局注释的用途。
答案 0 :(得分:1)
我认为让你感到困惑的部分是文字结构 - 它以结构的类型开头,后跟所有结构字段的常量。其中4个常数为constant expressions。
以下是AST的基本细分(不包括[
,{
,}
,]
和,
) - 点击查看大图:
我也懒得深入研究常量表达式 - 但它们基本上都采用格式<type> <instruction> ( <instruction args>... )
- 请参阅语言参考中的更多内容。