Я пытаюсь реализовать простой JIT-компилятор с использованием API LLVM C. Пока у меня нет проблем с генерированием IR-кода и его выполнением, то есть до тех пор, пока я не начну удалять объекты и не воссоздавать их.LLVM API: правильный способ создания/удаления
Что я хотел бы сделать, так это очистить ресурсы JIT в тот момент, когда они больше не используются двигателем. То, что я в основном пытаюсь сделать что-то вроде этого:
while (true)
{
// Initialize module & builder
InitializeCore(GetGlobalPassRegistry());
module = ModuleCreateWithName(some_unique_name);
builder = CreateBuilder();
// Initialize target & execution engine
InitializeNativeTarget();
engine = CreateExecutionEngineForModule(...);
passmgr = CreateFunctionPassManagerForModule(module);
AddTargetData(GetExecutionEngineTargetData(engine), passmgr);
InitializeFunctionPassManager(passmgr);
// [... my fancy JIT code ...] --** Will give a serious error the second iteration
// Destroy
DisposePassManager(passmgr);
DisposeExecutionEngine(engine);
DisposeBuilder(builder);
// DisposeModule(module); //--> Commented out: Deleted by execution engine
Shutdown();
}
Однако, это, кажется, не работает правильно: вторая итерация цикла я получаю довольно плохую ошибку ...
Итак, чтобы подвести итог: как правильно уничтожить и воссоздать LLVM API?
Я полагаю, вы должны сначала удалить модуль. – arrowd
@arrowdodger Мне кажется, что это невозможно. Механизм выполнения ссылается на модуль и выполняет «удаление». Несмотря на то, что каждое волокно в моем теле также хочет удалить его, ваша программа, безусловно, будет segfault, если вы это сделаете. – atlaste
Попробуйте переместить 'InitializeNativeTarget()' из цикла, затем. – arrowd