Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

В файле LLVM git, на который вы ссылаетесь, есть примеры /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

который увеличивает указатель на список ints, p и уменьшает оставшуюся длину я в каждом вызове блока 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", который сдвигает список один раз влево. В этом репо также упоминается список рассылки: [email protected]

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