LLVM — Как правильно использовать глобалы с MCJIT

Поэтому я создаю компилятор, который может вызывать код во время компиляции. После того, как все успешно скомпилировано, я создаю llvm::ExecutionEngine и добавить каждый llvm::Module программа требует.

Наконец я звоню llvm::ExecutionEngine::finalizeObject и выполнить функцию внутри модулей.

llvm::ExecutionEngine* execution_engine = llvm::EngineBuilder(std::move(module)).setErrorStr(&error_str).create();

// Ensure execution engine was created successfully
if(!execution_engine){
std::cerr << "Failed to construct ExecutionEngine: " << error_str << std::endl;
return 1;
}

// Add all of the dependencies to the execution engine
for(size_t i = 0; i != dependencies.size(); i++){
ModuleDependency* dependency = &dependencies[i];

if(!dependency->is_nothing){
llvm::SMDiagnostic sm_diagnostic;
std::unique_ptr<llvm::Module> required_module = llvm::parseIRFile(dependency->bytecode_filename, sm_diagnostic, llvm_context);

if (!required_module) {
sm_diagnostic.print("Failed to parse IR File: ", llvm::errs());
return false;
}

required_module->setModuleIdentifier(dependency->bytecode_filename.c_str());
execution_engine->addModule(std::move(required_module));
}
}

execution_engine->finalizeObject();
llvm::GenericValue returned_value = execution_engine->runFunction(entry_point, args);

Все отлично работает, кроме одного:

llvm::ExecutionEngine::finalizeObject падает с Integer division by zero ошибка всякий раз, когда модуль содержит глобальные переменные.

Итак, мой вопрос:
Как правильно использовать глобальные переменные с MCJIT?

Заметки:
— Глобальные переменные работают нормально, когда в нативных исполняемых файлах
— Механизм выполнения работает нормально, когда не используются глобальные переменные
— Я думаю, что проблема может иметь какое-то отношение к связыванию глобальных переменных или расположению данных механизма исполнения.

Спасибо за любые отзывы!

1

Решение

Я нашел свою проблему.

У моих глобалов был CommonLinkage, который не имеет смысла для кода JIT. Изменение связывания глобальных переменных на InernalLinkage сделало мой код работающим очень хорошо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]