2014-06-20 5 views
0

llvm에서 커널을 사용하여 얻은 전역 주석을 이해하려고 노력하고 있지만 몇 가지 사항에 다소 혼란 스럽습니다. 문제 이해 llvm.global.annotations

@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

내가 혼란스럽게 생각하는 부분은 구조체의 형식으로 시작하고 모든 구조체 필드의 상수와 함께 따라 오는 문자 그대로의 구조체라고 생각합니다. 이 상수 중 4 개는 constant expressions입니다.

An AST breakdown

내가 상수를 드릴 다운 너무 게으른했다 : 더 큰 버전을 클릭 - 여기

은 ( [, {, }, ], 포함되지 않음) AST의 기본 고장입니다 표현식도 포함되지만 기본적으로 모두는 <type> <instruction> (<instruction args>...) 형식입니다. 자세한 내용은 언어 참조를 참조하십시오.

+0

오크 .. 고맙습니다. – ssarangi