API LLVM C ++ создает ошибки структуры seg - PullRequest
1 голос
/ 15 февраля 2020

Я изучаю 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?

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

1 Ответ

0 голосов
/ 16 февраля 2020

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

  1. Модуль должен быть создан.
    std::unique_ptr<llvm::Module> module(new llvm::Module("mod", ctx));
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);
...