Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/llvm-hs/llvm-hs
Haskell bindings for LLVM
https://github.com/llvm-hs/llvm-hs
code-generation haskell-bindings llvm llvm-hs llvm-ir
Last synced: 3 days ago
JSON representation
Haskell bindings for LLVM
- Host: GitHub
- URL: https://github.com/llvm-hs/llvm-hs
- Owner: llvm-hs
- Created: 2017-01-06T19:25:26.000Z (almost 8 years ago)
- Default Branch: llvm-12
- Last Pushed: 2024-07-18T16:19:06.000Z (5 months ago)
- Last Synced: 2024-12-12T03:02:28.749Z (10 days ago)
- Topics: code-generation, haskell-bindings, llvm, llvm-hs, llvm-ir
- Language: LLVM
- Homepage:
- Size: 25.9 MB
- Stars: 512
- Watchers: 22
- Forks: 121
- Open Issues: 62
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# llvm-hs - Haskell bindings for LLVM
[![Build Status](https://travis-ci.org/llvm-hs/llvm-hs.svg?branch=llvm-6)](https://travis-ci.org/llvm-hs/llvm-hs) [![Hackage](https://img.shields.io/hackage/v/llvm-hs.svg)](https://hackage.haskell.org/package/llvm-hs)
This project aims to provide a relatively complete set of bindings for
the LLVM API. If you find that anything is missing please open an
issue! We generally try to stay close to the LLVM C++-API so you can
consult the LLVM documentation and reuse existing resources.## Getting started
If you’ve worked with LLVM before, take a look at the examples in the
[llvm-hs-examples repo](https://github.com/llvm-hs/llvm-hs-examples).
If not, you can find a translation of the [official LLVM
tutorial](http://llvm.org/docs/tutorial/#kaleidoscope-implementing-a-language-with-llvm)
at https://github.com/llvm-hs/llvm-hs-kaleidoscope. There is also a
[blog series](https://blog.josephmorag.com/tags/llvm/) on writing a C
compiler with the library. In general, we try to stay very close to
the API and AST provided by LLVM itself, so the [LLVM language
reference](http://llvm.org/docs/LangRef.html) is also very useful.## LLVM API Interface
`llvm-hs` provides an LLVM binding at (roughly) the same level of abstraction
as the official LLVM C API. Because of this, anything you might do with the
LLVM C API, you should expect to be able to do with `llvm-hs`. In addition,
some things which are not handled in the LLVM C API are supported. For example,
the LLVM C API [does not provide any
support](https://llvm.org/doxygen/group__LLVMCSupportTypes.html) for working
with `AttributeSet` and `AttributeList` types, but `llvm-hs` does.However, the binding to LLVM is only half the story: a lot of advanced
pure-Haskell functionality is built on top of this basic interface in the
`llvm-hs-pure` module, most notably the monadic
[IRBuilder](https://hackage.haskell.org/package/llvm-hs-pure) and
[ModuleBuilder](https://hackage.haskell.org/package/llvm-hs-pure) interfaces
which greatly simplify the task of generating LLVM code from a higher level
abstract syntax. The
[llvm-hs-examples](https://github.com/llvm-hs/llvm-hs-examples/blob/master/irbuilder/Main.hs)
project contains example usage. These high level interfaces are ideal for
implementing the LLVM backend for your code generation project. A good example
is Google's [Dex](https://github.com/google-research/dex-lang) research
language.## LLVM API Coverage and Philosophy
The `llvm-hs` FFI layer in `LLVM/Internal/FFI` extends the upstream LLVM C API
*adding missing functionality* which upstream has not yet exposed from the C++
API. We also provide some *improved implementations* of buggy or otherwise
problematic functions in the LLVM C API. As the LLVM C API becomes more
complete, we retire our extensions and directly wrap the newly added C API
functions, ensuring our FFI layer is as small as possible.If you find you need to use some LLVM functionality which is available via the
C++ API but not via the C API or in `llvm-hs`, please open an issue and
include links to the relevant entities in the LLVM doxygen-generated
documentation.In general, if it is possible to implement something in Haskell using the LLVM
C API primitives, that is preferable to implementing things in the FFI layer
and merely exposing them to Haskell as wrapped C or C++ functions.## Contributing
We love all kinds of contributions so please feel free to open issues for
missing LLVM features, report & fix bugs or report API inconveniences.## Versioning
Trying to represent the version of LLVM in the version number but also
allowing for version bumps in the bindings themselves while respecting
the [PVP](http://pvp.haskell.org/) can be tricky. Luckily LLVM switched to a
[new versioning scheme](http://blog.llvm.org/2016/12/llvms-new-versioning-scheme.html)
of `major.0.patch` starting from version `4.0`. This means that we can
use the last two components for these bindings while the first
component indicates the version of LLVM. A special case are the
versions `3.major.minor` that represent bindings to LLVM 3.9. Bindings
to earlier versions are not provided.## How is this related to llvm-general?
This project is a fork of the venerable `llvm-general` that aims to improve the
public release story, and better provide the interfaces needed for any Haskell
project looking to leverage LLVM. Contributions are encouraged.