llvm-hs-pretty: A pretty printer for LLVM IR.

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

A pretty printer for the LLVM AST types provided by llvm-hs.


[Skip to Readme]

Properties

Versions 0.1.0.0, 0.2.0.0, 0.2.1.0, 0.3.0.0, 0.4.0.0, 0.5.0.0, 0.5.0.0, 0.6.0.0, 0.6.1.0, 0.6.2.0, 0.9.0.0
Change log ChangeLog.md
Dependencies array (>=0.5), base (>=4.6 && <5.0), bytestring (>=0.10), llvm-hs-pure (>=6.2), prettyprinter (>=1.2), text (>=0.1) [details]
License MIT
Author Stephen Diehl
Maintainer stephen.m.diehl@gmail.com
Category Compilers
Home page https://github.com/llvm-hs/llvm-hs-pretty
Source repo head: git clone git@github.com:llvm-hs/llvm-hs-pretty.git
Uploaded by sdiehl at 2018-07-05T10:36:58Z

Modules

[Index]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Readme for llvm-hs-pretty-0.5.0.0

[back to package description]

llvm-hs-pretty

Build Status Hackage

A pretty printer for llvm-hs-pure. Goal is to be able to pretty print a sufficiently large subset of the LLVM AST from pure Haskell without having to go through the C++ API.

Usage

There is a single function ppllvm that maps a LLVM.AST.Module to a Text.

import LLVM.AST
import LLVM.Pretty (ppllvm)

ppllvm :: Module -> Text

Individual LLVM elements (constants, instructions) can be printed using the the polymorphic ppll function for any LLVM structure that implements the PP typeclass.

Tests

# This is only necessary for running the test suite
sudo apt-get install llvm-dev-5.0

The test suite currently consists of round tripping a LLVM IR from correct IR outputted by the llc toolchain, parsing into llvm-general AST and then printing it back out and comparing it with the original textual form to see if the pretty printer faithfully preserves the structure. The sample modules are in tests/.

Using stack:

$ stack build
$ stack test

Using cabal:

$ cabal run
$ cabal run -- tests/simple.ll

If you're using Nix then:

$ nix-shell
$ cabal run

Example

To try out the standalone example run:

$ stack repl
$ :load Example.hs
main

Consider the basic example LLVM module.

; ModuleID = 'example-llvm-module'

define i8 @f(i8 %x){
entry:
  ret i8 %x
}

Using the LLVM.AST we construct the type and feed it to the pretty printer.

module Standalone where

-- Pretty Printer
import LLVM.Pretty (ppllvm)

-- AST
import qualified LLVM.AST as AST
import qualified LLVM.AST.Linkage as Linkage
import qualified LLVM.AST.Visibility as Visibility
import qualified LLVM.AST.CallingConvention as Convention

import Data.Text.Lazy.IO as TIO

astModule :: AST.Module
astModule = AST.Module
    { AST.moduleName         = "example-llvm-module"
    , AST.moduleDataLayout   = Nothing
    , AST.moduleTargetTriple = Nothing
    , AST.moduleDefinitions  =
        [ AST.GlobalDefinition
            (AST.Function
                Linkage.External
                Visibility.Default
                Nothing
                Convention.C
                []
                (AST.IntegerType 8)
                (AST.Name "f")
                ([AST.Parameter (AST.IntegerType 8) (AST.Name "x") []], False)
                []
                Nothing
                Nothing
                0
                Nothing
                Nothing
                [ AST.BasicBlock
                    (AST.Name "entry")
                    []
                    (AST.Do
                        (AST.Ret
                            (Just
                                (AST.LocalReference
                                    (AST.IntegerType 8)
                                    (AST.Name "x")
                                )
                            )
                            []
                        )
                    )
                ]
            )
        ]
    }

main :: IO ()
main = TIO.putStrLn (ppllvm astModule)

License

Released under the MIT License.

Copyright (c) 2014-2018, Stephen Diehl Copyright (c) 2015 Cedric Shock