2014-11-24 32 views
5

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?

+0

Sanırım önce modülü silmelisiniz. – arrowd

+0

@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

+0

'InitializeNativeTarget() işlevini döngüden çıkarmayı deneyin. – arrowd

cevap

3

Kod çok uzun olduğu için bunu Yanıt olarak kaydetme. Mümkünse ve başka kısıtlama yoksa, LLVM'yi böyle kullanmayı deneyin. Döngünün içindeki Shutdown()'un buradaki suçlu olduğundan eminim. Ve ben de dışarıda Builder tutmak için zarar vereceğini sanmıyorum. Bu, JIT'imde LLVM kullanma şeklimi iyi yansıtıyor.

+0

Teşekkürler, ben bunu vereceğim, hadi görelim Ne olursa olsun, modülü yok etmediğinizi fark ettim, bu amaca uygun muydu? – atlaste

+0

Oldukça biraz profil hazırladım ve sızıntıların hepsi bitti. Birkaç önemli işaretçi: Her zaman yürütme motorunu atın. Önemli bir bellek sızıntısı olsun, ALso, LLVM fonksiyonlarına (fonksiyon dönüş değeri de dahil) geçtiğiniz tüm jenerik değerleri attığınızdan emin olun. Çözümünüzle kombinasyon halinde, bu benim için hile yaptı. Cevabınızı doğru çözüm olarak kullanın. – atlaste

+0

Yep, acı veren (segfault) yolu keşfettiğim gibi, modül Execution Engine'e aittir ve onunla birlikte silinir. – antipattern