LLVM IR 前缀数据

前缀数据是与函数关联的数据,代码生成器在函数入口点之前立即发出的。此功能的目的是允许前端(frontends)将语言特定的运行时元数据与特定函数相关联,并通过函数指针使其可用,同时仍允许调用函数指针。

要访问给定函数的数据,程序可以将函数指针bitcast到指向常量类型和取消逆向引用索引(dereference index,可能是指内容-1处的索引)-1的指针。这意味着IR符号刚刚超过前缀数据的末尾。

以单个i32注释的函数为例:

define void @f() prefix i32 123 { ... }

#前缀数据可以被引用为
%0 = bitcast void* () @f to i32*
%a = getelementptr inbounds i32, i32* %0, i32 -1
%b = load i32, i32* %a

前缀数据的布局就好像它是前缀数据类型的全局变量的初始化程序。该函数将被放置为使得前缀数据的开始对齐。这意味着如果前缀数据的大小不是对齐大小的倍数,则函数的入口点不会对齐。如果需要对齐函数的入口点,则必须将填充添加到前缀数据中。

一个函数可能有前缀数据但没有主体。这与available_externally链接具有相似的语义,因为优化器可能会使用这些数据,但不会在目标文件中发送数据。