Функция main не найдена в модуле при использовании привязок llvm с Haskell - PullRequest
3 голосов
/ 24 февраля 2012

Я пытаюсь использовать привязки LLVM на Haskell для создания очень простого автономного приложения «Привет, мир».Идея заключается в том, что когда я запускаю свое приложение на Haskell, оно выдает некоторый байт-код, который, в свою очередь, может быть запущен и выдает «hello world!»

-- hellofunc prints out "hello world"
hellofunc :: CodeGenModule (Function (IO ()))


_main :: (Function (IO ())) -> CodeGenModule (Function (IO ()))
_main func = createNamedFunction ExternalLinkage "main" $ do
        call func
        ret ()

main = writeCodeGenModule "hello.bc" (liftA _main hellofunc)

Когда я запускаю это, я вижу следующую ошибку:

'main' function not found in module.

Я явно создаю функцию main, используя createNamedFunction.Чего мне не хватает?

1 Ответ

3 голосов
/ 24 февраля 2012

Проблема заключается в использовании liftA или fmap вместо =<<.Это становится более очевидным (разрыв сборки) при использовании сигнатур типов._main не оценивается в CodeGenModule в случае liftA, поэтому он не отображается в выходном файле.

Может быть разумно изменить writeCodeGenModule, чтобы принять CodeGenModule () вместо CodeGenModule a.Это немного усложняет жизнь пользователям JL LLVM, но поможет предотвратить такие ошибки, как эта.

import Control.Applicative
import LLVM.Core
import LLVM.ExecutionEngine
import LLVM.Util.File

--
-- hellofunc prints out "hello world"
hellofunc :: CodeGenModule (Function (IO ()))
hellofunc = createNamedFunction ExternalLinkage "hello" $ do
  ret ()

_main :: (Function (IO ())) -> CodeGenModule (Function (IO ()))
_main func = createNamedFunction ExternalLinkage "main" $ do
  call func
  ret ()

generateModuleBind :: CodeGenModule (Function (IO ()))
generateModuleBind = _main =<< hellofunc

-- Couldn't match expected type `Function (IO ())'
--             with actual type `CodeGenModule (Function (IO ()))'
--
-- this is the desired type:
-- generateModuleLiftA :: CodeGenModule (Function (IO ()))
--
-- but this is the actual type:
generateModuleLiftA :: CodeGenModule (CodeGenModule (Function (IO ())))
generateModuleLiftA = liftA _main hellofunc

main :: IO ()
main = writeCodeGenModule "hello.bc" generateModuleBind
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...