LLVMパスに組み込みのcos()関数呼び出しを挿入しようとしています。FunctionPassの私のコード:
std::vector<Type *> arg_type;
arg_type.push_back(Type::getFloatTy(getGlobalContext()));
Function *fun = Intrinsic::getDeclaration(F.getParent(), Intrinsic::cos, arg_type);
CallInst* callInst = CallInst::Create(fun, args, Twine("cos"), (Instruction *)&I);
最後の行で生成されたIRを省略すると、次のようになります。
define i32 @main() nounwind uwtable {
entry:
...
}
declare float @llvm.cos.f32(float) nounwind readonly
、しかしCallInstが含まれていると、私が得るのは次のとおりです。
0 opt 0x000000000094f4bf
1 opt 0x000000000094f9c9
2 libpthread.so.0 0x00007fb92b652cb0
3 opt 0x00000000008be244 llvm::Instruction::Instruction(llvm::Type*, unsigned int, llvm::Use*, unsigned int, llvm::Instruction*) + 148
4 LLVMObfuscation.so 0x00007fb92a66c52f
5 LLVMObfuscation.so 0x00007fb92a66c9a5
6 LLVMObfuscation.so 0x00007fb92a66df21
7 opt 0x00000000008e921f llvm::FPPassManager::runOnFunction(llvm::Function&) + 591
8 opt 0x00000000008e9293 llvm::FPPassManager::runOnModule(llvm::Module&) + 51
9 opt 0x00000000008e8f34 llvm::MPPassManager::runOnModule(llvm::Module&) + 532
10 opt 0x00000000008ea4fb llvm::PassManagerImpl::run(llvm::Module&) + 171
11 opt 0x0000000000496208 main + 4104
12 libc.so.6 0x00007fb92a89376d __libc_start_main + 237
13 opt 0x000000000049cfe5
他に何をする必要がありますか?モジュールでこの関数を定義する必要はないと思います。
関数に送信される引数は次のように定義されます。
std::vector<Value *> args;
args.push_back(fp);
fpが以前に挿入された場所命令:
Instruction *fp = BinaryOperator::Create(Instruction::FSub, ...
変数Iはinst_iteratorですが、これをサイクルの外で行っています。
ありがとうございました。