2011-06-23 6 views
7

Tło: Napisałem zabawkowy interpreter Lisp, do którego próbuję dodać funkcjonalność LLVM JIT. W tej chwili nie narzuca następujące ograniczenia:Dodawanie funkcji w LLVM (powiązania haskell), gdy liczba parametrów nie jest znana w czasie kompilacji

  • tylko wartości całkowite są dozwolone w funkcji
  • Zmienne mogą odwoływać się tylko parametry formalne

Biorąc:

compile :: [Value] -- List of Formal Parameters 
     -> [Value] -- Body of function 
     -> CodeGenModule(Function a)` 

Pytanie: Jak wygenerować funkcję, w której liczba p parametry są równe długości listy Formalne parametry?

+0

Dobrym początkiem może być albo pomoc w zrozumieniu 'forall f g r. FunctionArgs f g (CodeGenFunction r()) ' –

+0

Czy chciałbyś podzielić się doświadczeniem używania wiązania haskell LLVM? z której wersji korzystałeś? :) – Nybble

+0

@Wu: LLVM 2.9 z powiązaniem llvm z [commit 729514] (https://github.com/bos/llvm/commit/72951414d7b7b377ee1a040fae2b043b7747ceff). [Zobacz także] (http://stackoverflow.com/questions/6406067/haskell-llvm-binding-linker-error) –

Odpowiedz

6

Nie wiem, czy to możliwe, aby to zrobić tylko z EDSL z LLVM.Core (typy są rzeczywiście dość owłosione), ale jeśli spojrzeć na LLVM.FFI.Core znajdziesz funkcjonalność niższego poziomu do manipulating LLVM function types i creating LLVM functions . Prowadzi to do następnego planu działania:

  • Tworzenie TypeRef dla funkcji z functionType.
  • Dodaj tę funkcję do swojego modułu za pomocą addFunction.
  • Wypełnij go podstawowymi blokami, używając appendBasicBlock/insertBasicBlock. Użyj getParam, aby odwołać się do argumentów funkcji wewnątrz podstawowych bloków.

Powinna istnieć możliwość wykorzystania ładnej monadycznej składni EDSL do budowy podstawowych bloków. Ponadto spójrz na LLVM.Core.Util, zawiera pewne funkcje pomocnicze do pracy z warstwą FFI.

Powiązane problemy