LLVM libc ++ abi.dylib: вызвана чистая виртуальная функция и неожиданное поведение - PullRequest
0 голосов
/ 16 мая 2019

Я пишу основную функцию, которая должна вызывать другие функции, и, но я получаю эту ошибку 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? Вместо" call ", знаете ли вы, как я могу это исправить?

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...