【发布时间】:2012-03-14 00:10:45
【问题描述】:
我想在基本块中插入零扩展指令和乘法指令。输入是,
define void @DriverInit() {
EntryBlock:
%abc = call i32 @cuInit(i32 0)
ret void
}
我想把它改成,
define void @DriverInit() {
EntryBlock:
%abc = call i32 @cuInit(i32 0)
%2 = zext i32 1 to i64
%3 = mul i64 %2, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64)
ret void
}
如何使用 LLVM C++ API 来做到这一点?我使用下面的代码来创建零扩展指令,但我无法做到。
IRBuilder<> builder(BB);
Value *One = builder.getInt32(1);
Value *zer=builder.CreateZExt(One, IntegerType::getInt64Ty(M.getContext()),"1");
CreateZExt 的第二个参数是我想要零扩展的目标类型,如果我错了,请纠正我。
我是 LLVM 的初学者,我很难获得有关在 pass 中使用哪些函数的信息。除了源代码的 doxygen 文档之外,还有哪些资源可用?
【问题讨论】:
-
我不明白你的问题 - 你能澄清一下吗?你有什么输入 IR,你想创建什么输出?
mul的第二个参数中的指针咒语是做什么的? -
如果输入函数中已经有了
EntryBlock,为什么还要创建一个基本块? -
此外,如果你在展示你正在做的(错误的)方式之前真正解释了你想要完成的事情,这可能会有所帮助。
标签: compiler-construction llvm