Sto tentando di implementare un semplice compilatore JIT utilizzando l'API LLVM C. Finora, non ho problemi a generare codice IR e ad eseguirlo, cioè: fino a quando non ho iniziato a smaltire gli oggetti e a ricrearli.LLVM: modo corretto per creare/eliminare
Quello che fondamentalmente mi piacerebbe fare è ripulire le risorse JIT nel momento in cui non vengono più utilizzate dal motore. Quello che sto fondamentalmente tentando di fare è qualcosa di simile:
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();
}
Tuttavia, questo non sembra funzionare correttamente: la seconda iterazione del ciclo ottengo un errore piuttosto male ...
Quindi, per riassumere: qual è il modo corretto per distruggere e ricreare l'API LLVM?
Suppongo che sia necessario eliminare prima il modulo. – arrowd
@arrowdodger Mi sembra impossibile. Il motore di esecuzione fa riferimento al modulo e fa un 'delete'. Anche se ogni fibra nel mio corpo spinge a cancellarla, il tuo programma segnerà sicuramente se lo fai. – atlaste
Prova a spostare 'InitializeNativeTarget()' out of loop, quindi. – arrowd