harpy: Runtime code generation for x86 machine code

[ bsd3, code-generation, library ] [ Propose Tags ]

The package contains the following components:

  • An x86 assembler. We provide both low-level code generation in module Harpy.X86CodeGen as well as a (slightly) higher-level implementation in module Harpy.X86Assembler, which figures out addressing modes based on an instruction's operand types.

  • An x86 disassembler which knows most of the opcodes available on modern x86 processors and can display its output both in the style used in Intel documents an in AT&T style, like the GNU tools. The disassembler can be found in module Harpy.X86Disassembler. The disassembler is re-exported from the disassembler package for compatibility with earlier Harpy releases.

  • Some abstractions over the abovementioned code generation modules, such as automatic label management and code generation combinators (for if-then-else statements, while-loops, functions) (module Harpy.X86CGCombinators).

  • All the above modules use the code generation monad defined in module Harpy.CodeGenMonad.

  • The Darcs repo and two tutorials on using Harpy can be found at Harpy's homepage: http://uebb.cs.tu-berlin.de/harpy/


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.2, 0.4, 0.4.1, 0.4.2, 0.4.3.0, 0.5.0.0, 0.6.0.0, 0.6.0.1, 0.6.0.2
Change log NEWS
Dependencies array (>=0.3 && <1), base (>=4 && <5), containers (>=0.3 && <1), disassembler (>=0.1.0.1), mtl (>=1 && <2), parsec (>=1 && <3), pretty (>=1 && <2), template-haskell (>=2 && <3) [details]
License LicenseRef-GPL
Author Dirk Kleeblatt <klee@cs.tu-berlin.de> Martin Grabmueller <martin.grabmueller@eleven.de>
Maintainer klee@cs.tu-berlin.de, martin.grabmueller@eleven.de
Category Code Generation
Home page http://uebb.cs.tu-berlin.de/harpy/
Uploaded by MartinGrabmueller at 2010-12-01T20:45:58Z
Distributions
Reverse Dependencies 1 direct, 0 indirect [details]
Downloads 6616 total (17 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for harpy-0.4.3.0

[back to package description]
                                                              -*-outline-*-
* README file for the Harpy Haskell Run-time Code Generator

Codename: Harpy - Haskell Assembler at Run-time produces Y...
  Harpy [myth.]	f: die Harpyie
  http://en.wikipedia.org/wiki/Harpy

** Introduction

Harpy is a library for run-time code generation in Haskell programs.

Harpy requires several Haskell extensions and GHC-specific features
(the Haskell FFI, Template Haskell, multi-parameter type classes and
monad transformers).

** Features

The following modules are included in this package:

Harpy.CodeGenMonad: This module defines the code generator monad,
  which is a combined state/reader/exception monad.  It contains
  all the necessary details for allocating and managing code buffers.

Harpy.X86CodeGen: This module contains all the functions for generating
  native x86 machine code.  The functions are very simple, and it is
  necessary to specify all addressing modes etc. when emitting an
  instruction.

Harpy.X86Assembler: A type class based layer on top of X86CodeGen
  which determines the addressing modes from the types of the
  operands.

Harpy.X86CGCombinators: Code generation combinators for conditionals,
  loops, function entry/exit code etc.

Harpy.X86Disassembler: A disassembler for x86 machine code.

Harpy.Call: Exports functions for invoking the generated code.

** Notes about the implementation

*** X86CodeGen.lhs

The file X86CodeGen.lhs is based on a header file called x86-codegen.h
from the Mono distribution, which defines macros for emitting x86
machine code directly into a memory buffer.  The Haskell module is a
nearly one-to-one mapping from the original macros to Haskell
functions.  The main differences are:

- Instead of emitting the data directly into a buffer, it uses the
  CodeGen monad from file CodeGenMonad.lhs.

- The functions are strongly typed.

Several things should be kept in mind when using this file:

- Buffer overflow checks have to be done manually with checkBufferSize or
  ensureBufferSize

- MMX, SSE, SSE2 and SSE3 instructions and registers are not supported.

- 64-bit mode is not supported.

- The disassembler supports (in principle) 64-bit mode and SSE
  instructions, but this has not been tested.