c++ - LLVM libc++abi.dylib:纯虚函数调用和意外行为
问题描述
我正在编写一个应该调用其他函数的主函数,但是我收到了这个错误
libc++abi.dylib: Pure virtual function called!
我将函数调用注入主函数的方式是:
Type * returnType = Type::getInt32Ty(TheContext);
std::vector<Type *> argTypes(0, Type::getInt32Ty(TheContext));
FunctionType * functionType = FunctionType::get(returnType, argTypes, false);
Function * function = Function::Create(functionType, Function::ExternalLinkage, "main", TheModule.get());
function->getBasicBlockList().clear();
BasicBlock * BB = BasicBlock::Create(TheContext, "entry", function);
Builder.SetInsertPoint(BB);
for (const auto & call : calls) {
Builder.CreateCall(call.first, call.second, "call");
}
Builder.CreateRet(Builder.getInt32(0));
verifyFunction(*function);
如果我运行这个for循环,我会提到错误但生成的IR似乎很好,除了出于某种原因它调用“calltmp?而不是“调用”你知道我该如何解决这个问题吗?
declare i32 @writeln(i32)
define i32 @a() {
entry:
ret i32 3
}
ine i32 @__anon_call() {
entry:
%calltmp = call i32 @a()
%calltmp1 = call i32 @writeln(i32 %calltmp)
ret i32 %calltmp1
entry2: ; No predecessors!
%calltmp3 = call i32 @a()
%calltmp4 = call i32 @writeln(i32 %calltmp3)
ret i32 %calltmp4
}
define i32 @main() {
entry:
%call = call i32 @a()
%call1 = call i32 @writeln(i32 %calltmp)
%call2 = call i32 @a()
%call3 = call i32 @writeln(i32 %calltmp3)
ret i32 0
}
解决方案
推荐阅读
- docker - consul客户端注册服务时,consul/config中的配置文件有什么用?
- c++ - 模板实例化深度超过最大值 - 如何停止特定情况?
- reactjs - 在 next.js 中使用 history.replaceState 失败
- mysql - 向表中添加 SQL 列会复制该表
- android - 密钥库密码不正确/Gradle 任务 assembleRelease 失败,退出代码为 1
- android - Android - 当用户最小化应用程序时使指纹身份验证无效,但在跨活动移动时无效
- wordpress - 更改 wp 属性的侧边栏
- sql - postgresql unnest 和 pivot int 数组列
- python - 通过 pygsheets/python 关闭过滤器
- python - 如何使 python 库可配置?(初始化)