{"id":20128703,"url":"https://github.com/llvm-hs/llvm-hs-typed","last_synced_at":"2025-07-19T09:36:40.033Z","repository":{"id":79361998,"uuid":"89262009","full_name":"llvm-hs/llvm-hs-typed","owner":"llvm-hs","description":"Type Safe LLVM IR ( Experimental )","archived":false,"fork":false,"pushed_at":"2018-06-13T12:45:34.000Z","size":84,"stargazers_count":49,"open_issues_count":1,"forks_count":5,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-09T15:56:55.069Z","etag":null,"topics":["code-generation","llvm","llvm-hs","llvm-ir","type-safety"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/llvm-hs.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-04-24T16:17:33.000Z","updated_at":"2024-08-11T00:31:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"679223e7-4108-41df-a390-f1bd4f40c580","html_url":"https://github.com/llvm-hs/llvm-hs-typed","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/llvm-hs/llvm-hs-typed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llvm-hs%2Fllvm-hs-typed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llvm-hs%2Fllvm-hs-typed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llvm-hs%2Fllvm-hs-typed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llvm-hs%2Fllvm-hs-typed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/llvm-hs","download_url":"https://codeload.github.com/llvm-hs/llvm-hs-typed/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llvm-hs%2Fllvm-hs-typed/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265910161,"owners_count":23847517,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-generation","llvm","llvm-hs","llvm-ir","type-safety"],"created_at":"2024-11-13T20:28:51.537Z","updated_at":"2025-07-19T09:36:40.007Z","avatar_url":"https://github.com/llvm-hs.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"llvm-hs-typed\n=============\n\n[![Build Status](https://travis-ci.org/llvm-hs/llvm-hs-typed.svg?branch=master)](https://travis-ci.org/llvm-hs/llvm-hs-typed)\n\nAn experimental branch of\n[llvm-hs-pure](https://hackage.haskell.org/package/llvm-hs-pure) AST that\nenforces the semantics of correct AST construction using the Haskell type system\nto prevent malformed ASTs.\n\nUsage\n-----\n\n### Typed AST\n\n```haskell\n{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE PolyKinds #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE TypeOperators #-}\n{-# LANGUAGE ExplicitForAll #-}\n{-# LANGUAGE TypeApplications #-}\n{-# LANGUAGE FlexibleInstances #-}\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# LANGUAGE MultiParamTypeClasses #-}\n\nmodule Example where\n\n-- AST\nimport GHC.TypeLits\nimport LLVM.Prelude\nimport LLVM.AST.Tagged\nimport LLVM.AST.Constant\nimport LLVM.AST.Tagged.Global\nimport LLVM.AST.Tagged.Constant\nimport LLVM.AST.Tagged.Tag\nimport LLVM.AST.TypeLevel.Type\n\nimport qualified LLVM.AST as AST\nimport qualified LLVM.AST.Global as AST\n\nc0 :: Constant ::: IntegerType' 32\nc0 = int 42\n\nnamed :: forall (t :: Type'). ShortByteString -\u003e Name ::: t\nnamed s = assertLLVMType $ AST.Name s\n\ntype ArgTys = [(IntegerType' 32), (IntegerType' 32)]\ntype RetTy = IntegerType' 32\n\ndefAdd :: Global\ndefAdd = function nm (params, False) [body, body]\n  where\n    nm :: Name ::: (PointerType' (FunctionType' (IntegerType' 32) ArgTys) ('AddrSpace' 0))\n    nm = named \"add\"\n\n    -- Types of subexpression are inferred from toplevel LLVM function signature\n\n    {-p1 :: Parameter ::: (IntegerType' 32)-}\n    p1 = parameter (named \"a\") []\n\n    {-p2 :: Parameter ::: (IntegerType' 32)-}\n    p2 = parameter (named \"b\") []\n\n    {-body :: BasicBlock ::: IntegerType' 32-}\n    body = basicBlock \"entry\" [] (ret (constantOperand c0) [])\n\n    {-params :: Parameter :::* ArgTys-}\n    params = p1 :* p2 :* tnil\n\nmodule_ :: AST.Module\nmodule_ = defaultModule\n  { moduleName = \"basic\"\n  , moduleDefinitions = [GlobalDefinition defAdd]\n  }\n```\n\n### Typed IRBuilder\n\n```haskell\n{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE PolyKinds #-}\n{-# LANGUAGE RecursiveDo #-}\n{-# LANGUAGE TypeOperators #-}\n{-# LANGUAGE OverloadedStrings #-}\n\nmodule Example2 where\n\nimport GHC.TypeLits\nimport LLVM.Prelude\nimport LLVM.AST.Constant\nimport LLVM.AST.Tagged.Global\nimport LLVM.AST.Tagged.Tag\nimport LLVM.AST.TypeLevel.Type\nimport qualified LLVM.AST as AST\nimport qualified LLVM.AST.Type as AST\nimport qualified LLVM.AST.Global as AST\nimport qualified LLVM.AST.Tagged as AST\n\nimport LLVM.AST.Tagged.IRBuilder as TBuilder\nimport qualified LLVM.IRBuilder as Builder\n\nimport Data.Coerce\n\nsimple :: AST.Module\nsimple = Builder.buildModule \"exampleModule\" $ do\n    func\n  where\n  func :: Builder.ModuleBuilder (AST.Operand ::: IntegerType' 32)\n  func =\n    TBuilder.function \"add\" [(AST.i32, \"a\"), (AST.i32, \"b\")] $ \\[a, b] -\u003e do\n      entry \u003c- block `named` \"entry\"; do\n        c \u003c- add (coerce a) (coerce b)\n        ret c\n```\n\nLicense\n-------\n\nCopyright (c) 2017, Joachim Breitner\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllvm-hs%2Fllvm-hs-typed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fllvm-hs%2Fllvm-hs-typed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllvm-hs%2Fllvm-hs-typed/lists"}