Hi I reviewed some questions about instrumentation and try to learn from them to do a simple instrumentation by writing a new pass. For example, for every basicblock, I would like to assign a block id and call the printf or my own print function to handle the block id. Suppose the block id is a string. My code is below: int inst_blocks = 0; LLVMContext& Ctx = M.getContext(); Constant* c = M.getOrInsertFunction("printf",Type::getVoidTy(Ctx), Type::getInt32Ty(Ctx), NULL); Function* myprint = cast<Function>(c); for (auto &F : M) for (auto &BB : F) { inst_blocks++; BasicBlock::iterator IP = BB.getFirstInsertionPt(); IRBuilder<> IRB(&(*IP)); Value * ID IRB.CreateGlobalStringPtr(StringRef(std::to_string(inst_blocks))); Value* args[] = {ID}; IRB.CreateCall(myprint, args); } I compiled the pass successfully and then try to use -Xclang -load -Xclang pass.so to compile my target C code. However, I come across the below exception clang-4.0: /home/jmh/Downloads/llvm-4/llvm/lib/IR/Instructions.cpp:263: void llvm::CallInst::init(llvm::FunctionType*, llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*> >, const llvm::Twine&): Assertion `(i >= FTy->getNumParams() || FTy->getParamType(i) == Args[i]->getType()) && "Calling a function with a bad signature!"' failed. I even do not know how to debug. Do I miss anything important? Thank you so much for your help Regards Muhui -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180906/01adb4d8/attachment.html>