如何使用 llvm pass 插入内联汇编指令
how to insert inline assembly instruction by using llvm pass
我尝试在 LLVM 的 IR Pass 中使用 pass 将汇编指令插入到每个基本块中。
更新:
LLVMContext *Ctx = nullptr;
Ctx = &M.getContext();
BasicBlock::iterator IP = BB.getFirstInsertionPt();
IRBuilder<> IRB(&(*IP));
StringRef asmString = "int3";
StringRef constraints = "~{dirflag},~{fpsr},~{flags}";
llvm::InlineAsm *IA = llvm::InlineAsm::get(Ty,asmString,constraints,true,false,InlineAsm::AD_ATT);
ArrayRef<Value *> Args = None;
llvm::CallInst *Ptr = IRB.CreateCall(IA,Args);
Ptr->addAttribute(AttributeList::FunctionIndex, Attribute::NoUnwind);
但是,当我 运行 通过其中一个测试文件 test.bc 时,我发现 file.I 中没有插入任何 INT3 指令与我创建的语句进行比较指针:
call void asm sideeffect "int3", "~{dirflag},~{fpsr},~{flags}"() #4
而IR中真正的INT3是:
call void asm sideeffect "int3", "~{dirflag},~{fpsr},~{flags}"() #2, !srcloc !2
我想知道如何修改我的代码以使其工作?
内联汇编的类型当然不必与它所使用的函数类型相匹配。
对于 int3
内联程序集,您可能需要 void (void)
类型,即 FunctionType::get(Type::getVoidTy(ctx), false)
。
我尝试在 LLVM 的 IR Pass 中使用 pass 将汇编指令插入到每个基本块中。
更新:
LLVMContext *Ctx = nullptr;
Ctx = &M.getContext();
BasicBlock::iterator IP = BB.getFirstInsertionPt();
IRBuilder<> IRB(&(*IP));
StringRef asmString = "int3";
StringRef constraints = "~{dirflag},~{fpsr},~{flags}";
llvm::InlineAsm *IA = llvm::InlineAsm::get(Ty,asmString,constraints,true,false,InlineAsm::AD_ATT);
ArrayRef<Value *> Args = None;
llvm::CallInst *Ptr = IRB.CreateCall(IA,Args);
Ptr->addAttribute(AttributeList::FunctionIndex, Attribute::NoUnwind);
但是,当我 运行 通过其中一个测试文件 test.bc 时,我发现 file.I 中没有插入任何 INT3 指令与我创建的语句进行比较指针:
call void asm sideeffect "int3", "~{dirflag},~{fpsr},~{flags}"() #4
而IR中真正的INT3是:
call void asm sideeffect "int3", "~{dirflag},~{fpsr},~{flags}"() #2, !srcloc !2
我想知道如何修改我的代码以使其工作?
内联汇编的类型当然不必与它所使用的函数类型相匹配。
对于 int3
内联程序集,您可能需要 void (void)
类型,即 FunctionType::get(Type::getVoidTy(ctx), false)
。