API LLVM C++ создает ошибки структурного сегмента

Я изучаю LLVM с помощью C++ API и пытаюсь понять, как создавать структуры и использовать их. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь выделить структуру, происходит ошибка сегментации.

    llvm::LLVMContext ctx;
    llvm::IRBuilder<> builder(ctx);
    std::unique_ptr<llvm::Module> module;

    std::vector<llvm::Type *> types;
    types.push_back(llvm::Type::getInt16Ty(ctx));

    auto structType = llvm::StructType::create(ctx, "Foo");
    structType->setBody(types);

    auto bb = llvm::BasicBlock::Create(ctx, "entry", nullptr);
    builder.SetInsertPoint(bb);

    builder.CreateAlloca(structType, nullptr, "alloctmp");

Я явно упускаю что-то простое. Почему CreateAlloca вызывает ошибку seg?

После получения отладочной версии в коде CreateAlloca произошел сбой сегмента, поскольку BasicBlock был нулевым. Итак, я добавил BasicBlock, и теперь он не работает, потому что GlobalValue равен нулю. Как это должно быть установлено?


person Rich    schedule 15.02.2020    source источник
comment
Если вы разрабатываете с использованием LLVM, создайте и используйте отладочную версию библиотеки. Вы получите намного более качественные ошибки сегментации.   -  person arnt    schedule 16.02.2020


Ответы (1)


Несколько важных советов по безопасности, извлеченных из этого.

  1. Модуль должен быть создан.
    std::unique_ptr<llvm::Module> module(new llvm::Module("mod", ctx));
  1. CreateAlloca размещает в стеке. По-видимому, для вещей верхнего уровня нет, поэтому его нужно использовать внутри функции.
    auto ft = llvm::FunctionType::get(structType, types, false);
    auto fn = llvm::Function::Create(ft, llvm::Function::ExternalLinkage, "func", module.get());

    auto bb = llvm::BasicBlock::Create(ctx, "entry", fn);
person Rich    schedule 16.02.2020