Próbuję zaimplementować prosty kompilator JIT za pomocą interfejsu API LLVM C. Do tej pory nie mam problemów z generowaniem kodu IR i jego wykonaniem, to znaczy dopóki nie zacznę rozrzucać obiektów i odtwarzać je.Interfejs API LLVM: poprawny sposób tworzenia/usuwania
W zasadzie chciałbym wyczyścić zasoby JIT w momencie, gdy nie są już używane przez silnik. Co mam w zasadzie próbuje zrobić coś takiego:
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();
}
to jednak nie wydaje się działać poprawnie: druga iteracja pętli Dostaję dość poważny błąd ...
Podsumowując: jaki jest właściwy sposób na zniszczenie i ponowne utworzenie interfejsu API LLVM?
Przypuszczam, że należy najpierw usunąć moduł. – arrowd
@arrowdodger Wydaje mi się, że to niemożliwe. Mechanizm wykonawczy odwołuje się do modułu i wykonuje "usuń". Nawet jeśli każde włókno w moim ciele nakłania to do usunięcia go, twój program na pewno naruszy to, jeśli to zrobisz. – atlaste
Spróbuj przenieść 'InitializeNativeTarget()' z pętli, następnie. – arrowd