#llvm #llvm-ir
#llvm #llvm-ir
Вопрос:
Я пытаюсь понять глобальные аннотации, которые я получаю с помощью ядра из llvm, но я немного запутался в нескольких вещах.
@sgv = internal constant [4 x i8] c"2220"
@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:
Я думаю, что часть, которая вас смущает, — это литеральная структура, которая начинается с типа структуры и сопровождается константами для всего поля структуры. 4 из этих констант являются постоянными выражениями.
Вот основная разбивка AST (не включая [
, {
, }
, ]
, и ,
) — нажмите для увеличения версии:
Я был слишком ленив, чтобы углубиться в константные выражения, но они в основном все в формате <type> <instruction> ( <instruction args>... )
— подробнее см. В справочнике по языку.