如何使用LLVM传递插入内联汇编指令



我尝试在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); 

然而,当我在其中一个测试文件上运行pass时,test。bc,我发现文件中没有插入INT3指令。我将创建的语句与Ptr:

进行了比较。
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)

最新更新