LLVM IR Prologue data

Prologue属性允许在函数体之前插入任意代码(以字节编码)。这可以用于启用函数热补丁和仪器。

为了保持普通函数调用的语义,序言数据必须有特定的格式。具体来说,它必须以一系列字节开始,该字节序列解码为一系列机器指令,对模块的目标代码有效,将控制转移到紧接在序言数据之后的位置,而不执行任何其他可见动作。这允许内联和其他传递推理函数定义的语义,而不需要推理序言数据。显然这使得序言数据的格式高度依赖于目标。

x86体系结构的有效序言数据的一个简单示例是i8 144, 对指令nop进行编码:

define void @f() prologue i8 144 { ... }

通常,可以通过对跳过元数据的相对分支指令进行编码来形成序言数据,如x86_64体系结构的有效序言数据的示例,其中前两个字节编码为:jmp .+10

%0 = type <{ i8, i8, i8* }>

define void @f() prologue %0 <{ i8 235, i8 8, i8* @md}> { ... }

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