我想要一个编译器插件来注释带有一些信息的结构.例如,原始结构只有一个字段:
struct X { x: i32 }
Run Code Online (Sandbox Code Playgroud)
我想添加另一个字段:
struct X { x: i32, y: MARKTYPE }
Run Code Online (Sandbox Code Playgroud)
当我查看Rust编译器插件时,我决定使用MultiModifier(SyntaxExtension)来完成我的工作.enum ItemKind定义Struct(VariantData, Generics)并VariantData存储数据字段:
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
pub enum VariantData {
/// Struct variant.
///
/// E.g. `Bar { .. }` as in `enum Foo { Bar { .. } }`
Struct(Vec<StructField>, NodeId),
/// Tuple variant.
///
/// E.g. `Bar(..)` as in `enum Foo { Bar(..) }`
Tuple(Vec<StructField>, NodeId),
/// Unit …Run Code Online (Sandbox Code Playgroud) Rust使用动态检查方法来检查很多东西.一个这样的例子是数组的边界检查.
以此代码为例,
fn test_dynamic_checking() -> i32 {
let x = [1, 2, 3, 4];
x[1]
}
Run Code Online (Sandbox Code Playgroud)
由此产生的LLVM IR是:
; Function Attrs: uwtable
define internal i32 @_ZN10dynamic_ck21test_dynamic_checking17hcef32a1e8c339e2aE() unnamed_addr #0 {
entry-block:
%x = alloca [5 x i32]
%0 = bitcast [5 x i32]* %x to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ([5 x i32]* @const7091 to i8*), i64 20, i32 4, i1 false)
%1 = getelementptr inbounds [5 x i32], [5 x i32]* %x, i32 0, i32 0
%2 = …Run Code Online (Sandbox Code Playgroud) 我想分析LLVM IR中的指针值。
Value是一个非常重要的LLVM类。它是程序所计算的所有值的基类,可用作所有其他值的操作数。值是其他重要类的超类,例如指令和功能。所有值都有一个类型。类型不是Value的子类。一些值可以具有名称,并且它们属于某个模块。在值上设置名称会自动更新模块的符号表。
要测试a Value是否为指针,有一个函数a->getType()->isPointerTy()。LLVM还提供了LLVM PointerType类,但是没有直接的api来比较指针的值。
所以我想知道如何比较这些指针值,以测试它们是否相等。我知道有AliasAnalysis,但是我对AliasAnalysis结果有疑问,所以我想自己验证一下。