LLVM C API'sini kullanarak basit bir JIT derleyicisini uygulamaya çalışıyorum. Şimdiye kadar, IR kodu oluşturma ve onu yürütme konusunda hiçbir sorunum yok, yani: nesneleri elime almaya ve onları yeniden yaratmaya başlayıncaya kadar.LLVM API: oluşturma/çıkarma için doğru yol
Temel olarak yapmak istediğim, JIT'ted kaynaklarının artık motor tarafından kullanılmadığı anda temizlenmesidir.
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();
}
Ancak bu düzgün çalışıyor gibi görünmüyor: Ne temelde yapmaya çalışılıyor böyle bir şeydir Ben oldukça kötü bir hata alıyorum döngünün ikinci tekrarlama ...
Özetle: LLVM API'sini imha etmenin ve yeniden oluşturmanın doğru yolu nedir?
Sanırım önce modülü silmelisiniz. – arrowd
@arrowdodger Bana öyle geliyor ki bu imkansız. Yürütme motoru modülü referans alır ve 'sil' yapar. Vücudumdaki her lif de onu silmeye çalışsa da, eğer programınız mutlaka kesilir. – atlaste
'InitializeNativeTarget() işlevini döngüden çıkarmayı deneyin. – arrowd