Metadata 背景介绍
由于 LLVM IR Opcode 的表达能力有限,为了将额外的信息传递给优化器和代码生成器,LLVM 通常有三个解决方法,分别是 Attribute、Metadata 和 Intrinsic。如下图所示,三种方法各有优劣,使用哪种方法取决于需要传递的信息量。
Metadata 根据命名可知,代表元数据,它没有类型,也不是直接表示值,是用于描述 LLVM IR 的元数据格式。可以用来存储关于 LLVM IR 中各种实体(如:函数、变量、指令等)的附加信息,例如调试信息、优化提示、源代码位置等。
Metadata 组成
所有的 Metadata 都会用一个感叹号 ! 定义。在 LLVM 中 Metadata 的子类有四个:DistinctMDOperandPlaceholder、MDNode、MDString 和 ValueAsMetadata,Metadata 常见的组成可以是如下几种形态:
(1)DistinctMDOperandPlaceholder 是一个占位符,为了解决前置引用问题,在 Operand 创建后可以用 RAUW 函数替换,使用场景较少。