项目作者: llvm-hs

项目描述 :
Type Safe LLVM IR ( Experimental )
高级语言: Haskell
项目地址: git://github.com/llvm-hs/llvm-hs-typed.git
创建时间: 2017-04-24T16:17:33Z
项目社区:https://github.com/llvm-hs/llvm-hs-typed

开源协议:Other

下载


llvm-hs-typed

Build Status

An experimental branch of
llvm-hs-pure AST that
enforces the semantics of correct AST construction using the Haskell type system
to prevent malformed ASTs.

Usage

Typed AST

  1. {-# LANGUAGE DataKinds #-}
  2. {-# LANGUAGE PolyKinds #-}
  3. {-# LANGUAGE TypeFamilies #-}
  4. {-# LANGUAGE TypeOperators #-}
  5. {-# LANGUAGE ExplicitForAll #-}
  6. {-# LANGUAGE TypeApplications #-}
  7. {-# LANGUAGE FlexibleInstances #-}
  8. {-# LANGUAGE OverloadedStrings #-}
  9. {-# LANGUAGE ScopedTypeVariables #-}
  10. {-# LANGUAGE AllowAmbiguousTypes #-}
  11. {-# LANGUAGE UndecidableInstances #-}
  12. {-# LANGUAGE MultiParamTypeClasses #-}
  13. module Example where
  14. -- AST
  15. import GHC.TypeLits
  16. import LLVM.Prelude
  17. import LLVM.AST.Tagged
  18. import LLVM.AST.Constant
  19. import LLVM.AST.Tagged.Global
  20. import LLVM.AST.Tagged.Constant
  21. import LLVM.AST.Tagged.Tag
  22. import LLVM.AST.TypeLevel.Type
  23. import qualified LLVM.AST as AST
  24. import qualified LLVM.AST.Global as AST
  25. c0 :: Constant ::: IntegerType' 32
  26. c0 = int 42
  27. named :: forall (t :: Type'). ShortByteString -> Name ::: t
  28. named s = assertLLVMType $ AST.Name s
  29. type ArgTys = [(IntegerType' 32), (IntegerType' 32)]
  30. type RetTy = IntegerType' 32
  31. defAdd :: Global
  32. defAdd = function nm (params, False) [body, body]
  33. where
  34. nm :: Name ::: (PointerType' (FunctionType' (IntegerType' 32) ArgTys) ('AddrSpace' 0))
  35. nm = named "add"
  36. -- Types of subexpression are inferred from toplevel LLVM function signature
  37. {-p1 :: Parameter ::: (IntegerType' 32)-}
  38. p1 = parameter (named "a") []
  39. {-p2 :: Parameter ::: (IntegerType' 32)-}
  40. p2 = parameter (named "b") []
  41. {-body :: BasicBlock ::: IntegerType' 32-}
  42. body = basicBlock "entry" [] (ret (constantOperand c0) [])
  43. {-params :: Parameter :::* ArgTys-}
  44. params = p1 :* p2 :* tnil
  45. module_ :: AST.Module
  46. module_ = defaultModule
  47. { moduleName = "basic"
  48. , moduleDefinitions = [GlobalDefinition defAdd]
  49. }

Typed IRBuilder

  1. {-# LANGUAGE DataKinds #-}
  2. {-# LANGUAGE PolyKinds #-}
  3. {-# LANGUAGE RecursiveDo #-}
  4. {-# LANGUAGE TypeOperators #-}
  5. {-# LANGUAGE OverloadedStrings #-}
  6. module Example2 where
  7. import GHC.TypeLits
  8. import LLVM.Prelude
  9. import LLVM.AST.Constant
  10. import LLVM.AST.Tagged.Global
  11. import LLVM.AST.Tagged.Tag
  12. import LLVM.AST.TypeLevel.Type
  13. import qualified LLVM.AST as AST
  14. import qualified LLVM.AST.Type as AST
  15. import qualified LLVM.AST.Global as AST
  16. import qualified LLVM.AST.Tagged as AST
  17. import LLVM.AST.Tagged.IRBuilder as TBuilder
  18. import qualified LLVM.IRBuilder as Builder
  19. import Data.Coerce
  20. simple :: AST.Module
  21. simple = Builder.buildModule "exampleModule" $ do
  22. func
  23. where
  24. func :: Builder.ModuleBuilder (AST.Operand ::: IntegerType' 32)
  25. func =
  26. TBuilder.function "add" [(AST.i32, "a"), (AST.i32, "b")] $ \[a, b] -> do
  27. entry <- block `named` "entry"; do
  28. c <- add (coerce a) (coerce b)
  29. ret c

License

Copyright (c) 2017, Joachim Breitner