Module Voodoo
In: voodoo.rb
voodoo/parser.rb
voodoo/code_generator.rb
voodoo/compiler.rb
voodoo/config.rb
voodoo/validator.rb
voodoo/generators/common_code_generator.rb
voodoo/generators/mips_gas_generator.rb
voodoo/generators/i386_elf_generator.rb
voodoo/generators/command_postprocessor.rb
voodoo/generators/mips_elf_generator.rb
voodoo/generators/gas_elf_generator.rb
voodoo/generators/arm_elf_generator.rb
voodoo/generators/arm_gas_generator.rb
voodoo/generators/amd64_nasm_generator.rb
voodoo/generators/nasm_elf_generator.rb
voodoo/generators/amd64_elf_generator.rb
voodoo/generators/nasm_generator.rb
voodoo/generators/i386_nasm_generator.rb

Voodoo - Code Generation for Multiple Target Platforms

This module implements a compiler for the Voodoo programming language, a simple programming language designed to be a thin abstraction of the CPU‘s native instruction set.

The compiler consists of three parts:

  1. The parser (Voodoo::Parser), which reads Voodoo source code and turns it into Ruby objects.
  2. The code generator (a class that implements the methods of Voodoo::CommonCodeGenerator), which provides methods that generate code for the target platform.
  3. The compiler driver (Voodoo::Compiler), which reads from the parser and calls the appropriate methods of the code generator.

Both the parser and the code generators can be used on their own. For example, you could use the code generator to generate native code for your own programming language without first creating a Voodoo program.

Instead of instantiating a code generator directly, it is recommended that you use Voodoo::CodeGenerator.get_generator to obtain a suitable code generator for your target platform.

A few examples to clarify the usage of the module:

The following code compiles the source file test.voo to an ELF object file called test.o containing object code for i386:

  require 'voodoo'

  File.open('test.voo') do |infile|
    parser = Voodoo::Parser.new infile
    generator = Voodoo::CodeGenerator.get_generator :architecture => :i386,
                                                    :format => :elf
    File.open('test.o', 'w') do |outfile|
      compiler = Voodoo::Compiler.new parser, generator, outfile
      compiler.compile
    end
  end

The following code uses the code generator API to create an object file without the need to create a Voodoo program:

  require 'voodoo'

  generator = Voodoo::CodeGenerator.get_generator

  generator.add :functions, [:export, :fact], [:label, :fact]
  generator.add_function [:n],
    [:ifle, [:n, 1],
      # then
      [[:return, 1]],
      # else
      [[:let, :x, :sub, :n, 1],
       [:set, :x, :call, :fact, :x],
       [:return, :mul, :n, :x]]]

  File.open('fact.o', 'w') { |outfile| generator.write outfile }

Classes and Modules

Module Voodoo::CodeGenerator
Module Voodoo::CommandPostProcessor
Module Voodoo::Config
Module Voodoo::Validator
Class Voodoo::AMD64ELFGenerator
Class Voodoo::AMD64NasmGenerator
Class Voodoo::ARMELFGenerator
Class Voodoo::ARMGasGenerator
Class Voodoo::CommonCodeGenerator
Class Voodoo::Compiler
Class Voodoo::GasELFGenerator
Class Voodoo::I386ELFGenerator
Class Voodoo::I386NasmGenerator
Class Voodoo::MIPSELFGenerator
Class Voodoo::MIPSGasGenerator
Class Voodoo::NasmELFGenerator
Class Voodoo::NasmGenerator
Class Voodoo::Parser

[Validate]