【发布时间】:2015-04-10 07:48:49
【问题描述】:
我正在试验 LLVM 的 JIT 功能,并在调用 powf 时观察到,如果我只是为其添加声明,则调用 powf 时有效
declare float @powf(float, float))
并用两个变量调用它
%4 = call float @powf(float %3, float %2)
但是,当我使用恒定指数 0.5 做同样的事情时
%4 = call float @powf(float %3, float 5.000000e-01)
它失败并出现以下错误:
LLVM 错误:程序使用了无法解析的外部函数“fabsf”!
powf 调用被以下优化通道替换,所以我知道fabsf 来自哪里:
%sqrtf = tail call float @sqrtf(float %3) #1
%fabsf = tail call float @fabsf(float %sqrtf) #1
%4 = fcmp oeq float %3, 0xFFF0000000000000
%5 = select i1 %4, float 0x7FF0000000000000, float %fabsf
我尝试在外部注册fabsf(但显然不正确),但没有成功:
auto float_type = llvm::Type::getFloatTy(context);
std::vector<llvm::Type *> unary_arg_types(1, float_type);
auto unary_op_type = llvm::FunctionType::get(float_type, unary_arg_types, false);
auto fabsf_llvm = llvm::Function::Create(unary_op_type, llvm::Function::ExternalLinkage, "fabsf", module);
ee->addGlobalMapping(fabsf_llvm, reinterpret_cast<void *>(&::fabsf));
我正在使用 MCJIT ExecutionEngine 并在带有 LLVM 的 Windows 7 上运行,我的测试程序使用 MinGW 编译。
问题一:如何注册fabsf才不会出现错误?
问题 2:为什么这里需要 fabsf?
编辑:看来我偶然发现了一个(已知的)MCJIT 错误:http://llvm.org/bugs/show_bug.cgi?id=20656
【问题讨论】: