Связывание FFI и DSL - PullRequest
       0

Связывание FFI и DSL

54 голосов
/ 26 января 2012

В Haskell LLVM-привязках я пытаюсь определить функцию с переменным числом аргументов (на самом деле я имею в виду постоянное число, которое не известно во время компиляции). Я нашел этот вопрос и пытаюсь найти ответ.

Я не хочу полностью отступать от использования FFI для генерации LLVM, я хочу использовать DSL столько, сколько мог, и использовать FFI только для того, что я не могу делать через DSL.

Мне удалось определить тип через functionType, я все еще не могу добавить функцию в модуль, созданный путем вызова defineModule. Я также думаю, что следующим шагом будет добавление базовых блоков в функцию через FFI.appendBasicBlock, что, на мой взгляд, легко, но как мне получить аргументы через FFI.getParam внутри блока do в монаде CodeGenFunction. 1013 *

1 Ответ

2 голосов
/ 21 декабря 2012

Если размер списка аргументов неизвестен до времени выполнения, вам все равно придется преобразовать функцию во что-то, работающее со списком.Обратите внимание, что тип (IORef [Word32]) означает, что действие ввода-вывода будет читать / записывать (изменяемый) список Word32 во время выполнения программы.Программы на Haskell должны только сказать как , чтобы изменить / прочитать / записать список - отсюда и монада IO ().

В файле git проекта LLVM есть файл examples / List.hs, который выссылки.Он создает подпрограмму сборки LLVM "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

, которая увеличивает указатель на список целых чисел p и уменьшает оставшуюся длину i при каждом вызове блока body.Этот блок неоднократно вызывает 'loopBody' и сохраняет результат в 'vars', который в конечном итоге возвращается (нетронутым в нуле) в 's' внутри функции mList:

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)

Все дополнительные вещи о nelem /NextListElement используется внутри их примера для loopBody, который смещает список один раз влево.В этом репозитории также упоминается список рассылки: haskell-llvm@projects.haskellorg.

GHC7 может компилироваться с использованием LLVM, но я полагаю, что это не поможет в программе на Haskell, интерпретирующей язык, если GHC также не выполняет JIT-компиляцию - кто-нибудьзнаете, так ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...