SORU
26 Ocak 2012, PERŞEMBE


FFI bağlama ve DSL

Haskell LLVM bindings, değişkenler (aslında derleme sırasında bilinen sabit bir sayı yani) değişken bir dizi ile bir işlev tanımlamak için çalışıyorum. this question ve cevabı takip etmeye çalışıyorum buldum.

İstemiyorum geri tamamen kullanarak FFI için üreten LLVM, kullanmak istiyorum DSL elimden geldiğince ve kullanım FFI tek yaptığım şeyleri yapamıyorum üzerinden DSL.

FunctionType üzerinden bir türü tanımlamak için başardı, hala bir modül defineModule Arama tarafından oluşturulan bir işlev eklemek için kuramıyorum. Yine bence bundan sonraki adım olarak Ekle temel taşları fonksiyonu üzerinden FFI.appendBasicBlock hangi bence kolay, ama nasıl alabilirim argümanları üzerinden FFI.getParam içinde bir blok içinde CodeGenFunction monad.

CEVAP
21 Aralık 2012, Cuma


Bağımsız değişken listesinin büyüklüğü bilinmez 'zamanı gelene kadar, bir işlevi dönüştürmek için bir liste üzerinde zaten çalışma gerekir. (İORef [Word32]) türü IO bir eylem okuyup okumayacağı programın çalışması sırasında (değişken) Word32 listesi/yazma unutmayın. Haskell programları sadece söylemek zorundayımnasılokuma//liste yazmak mutasyona dolayısıyla IO() monad.

Örnek bir Liste var.LLVM gıt hs dosyasını başvurulan proje. LLVM bir derleme yordamı oluşturur"", . arrayLoop

arrayLoop ::
   (Phi a, IsType b,
    Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i Bool) =>
   Value i -> Value (Ptr b) -> a ->
   (Value (Ptr b) -> a -> CodeGenFunction r a) ->
   CodeGenFunction r a
arrayLoop len ptr start loopBody = do

bu artışlarla değer vermez, p, ve azaltır listesi için bir işaretçi kalan uzunluğu, her duada 'vücut' blok. Bu bloğu tekrar tekrar çağırır '' ve depolar sonucu 'vars', sonunda geri döndü (sıfır el değmemiş) için 's mList işlev içinde:'. loopBody

mList ::
   CodeGenModule (Function
      (StablePtr (IORef [Word32]) -> Word32 -> Ptr Word32 -> IO Int32))
mList =
   createFunction ExternalLinkage $ \ ref size ptr -> do
     next <- staticFunction nelem
     let _ = next :: Function (StablePtr (IORef [Word32]) -> IO Word32)
     s <- arrayLoop size ptr (valueOf 0) $ \ ptri y -> do
       flip store ptri =<< call next ref
       return y
     ret (s :: Value Int32)

Tüm ekstra şeyler hakkında nelem/NextListElement 'loopBody, sonra listeyi kaydırır sol. için için kendi örneği içinde kullanılır Bu repo da bir e-posta listesi bahseder: haskell-llvm@projects.haskellorg.

GHC7 LLVM kullanarak derlemek olabilir, ama bu Haskell bir program DZD sürece bir dil çeviri derleme de TAM zamanında geliyor - herkes bu durumda yardımcı olmaz sanırım?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ipsy

    ipsy

    1 EKİM 2012
  • Liam Underwood

    Liam Underwo

    19 Mayıs 2009
  • schmittastic

    schmittastic

    9 EYLÜL 2009