Проблемы с пониманием llvm.global.annotations

#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 (не включая [ , { , } , ] , и , ) — нажмите для увеличения версии:

Сбой AST

Я был слишком ленив, чтобы углубиться в константные выражения, но они в основном все в формате <type> <instruction> ( <instruction args>... ) — подробнее см. В справочнике по языку.