无法理解llvm.global.annotations

时间:2014-06-20 00:39:52

标签: llvm llvm-ir

我正在尝试理解我从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 ?

我需要更多解释这个注释的结构以及这个全局注释的用途。

1 个答案:

答案 0 :(得分:1)

我认为让你感到困惑的部分是文字结构 - 它以结构的类型开头,后跟所有结构字段的常量。其中4个常数为constant expressions

以下是AST的基本细分(不包括[{}],) - 点击查看大图:

An AST breakdown

我也懒得深入研究常量表达式 - 但它们基本上都采用格式<type> <instruction> ( <instruction args>... ) - 请参阅语言参考中的更多内容。