如何使用 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)