Skip to main content

Add your description here

Project description

WAQ - WebAssembly to QBE Compiler

WAQ is an ahead-of-time (AOT) compiler that translates WebAssembly binary modules into native machine code using QBE as the backend.

Features

  • WASM Binary Parsing: Parse WebAssembly binary modules
  • Stack-to-SSA Translation: Convert WebAssembly's stack-based model to QBE's SSA form
  • Control Flow Conversion: Transform structured control flow (blocks, loops, ifs) to basic blocks and jumps
  • Type Mapping: Map WASM types (i32, i64, f32, f64) to QBE types (w, l, s, d)
  • QBE Backend: Generate QBE intermediate language code

Installation

# Clone the repository
# (not yet) git clone https://github.com/abilian/waq.git
git clone https://git.sr.ht/~sfermigier/waq
cd waq

# Install dependencies using uv
uv sync

External Dependencies

WAQ requires the following external tools depending on output format:

Output Required Tools
--emit qbe None
--emit asm QBE
--emit obj QBE + assembler (clang/as)
--emit exe QBE + C compiler (clang/gcc)
.wat input wabt (wat2wasm)

Usage

Basic Compilation

# Compile a WASM file to QBE IL
waq input.wasm -o output.ssa

# Compile a WAT file (automatically converted via wat2wasm)
waq input.wat -o output.ssa

# Compile to assembly
waq input.wasm --emit asm -o output.s

# Compile to object file
waq input.wasm --emit obj -o output.o

# Compile to executable (requires exported wasm_main function)
waq input.wasm --emit exe -o program

# Specify a different entry function
waq input.wasm --emit exe --entry my_main -o program

# For void functions, use --no-print
waq input.wasm --emit exe --entry void_func --no-print -o program

# Target a specific architecture
waq input.wasm --emit exe -t arm64_apple -o program

Supported Targets

  • amd64_sysv - x86-64 Linux/BSD (default)
  • amd64_apple - x86-64 macOS
  • arm64 - ARM64 Linux
  • arm64_apple - ARM64 macOS (Apple Silicon)
  • rv64 - RISC-V 64-bit

Running Tests

# Run all tests
make test

# Run specific test types
uv run pytest -m unit              # Unit tests only
uv run pytest -m integration       # Integration tests only
uv run pytest -m e2e               # End-to-end tests only

Development Commands

# Format code
make format

# Lint and type check
make lint

# Run with coverage
make test-cov

# Multi-version testing via nox
nox -s tests              # Run tests on all Python versions
nox -s check              # Run linting/type checking

Project Structure

waq/
├── src/
│   └── waq/              # Main source code
│       ├── compiler/     # Compilation logic
│       ├── parser/       # WASM binary parsing
│       ├── runtime/      # Runtime support
│       └── cli.py        # Command-line interface
├── tests/                # Test suite
│   ├── a_unit/           # Unit tests
│   ├── b_integration/    # Integration tests
│   └── c_e2e/            # End-to-end tests
├── notes/                # Technical notes (no documentation yet)
└── runtime/              # Runtime components

Testing

The project follows a pyramid testing structure:

  • Unit Tests: Fast, isolated tests in tests/a_unit/
  • Integration Tests: Component interaction tests in tests/b_integration/
  • End-to-end Tests: Full workflow tests in tests/c_e2e/

Code Style

  • Targets Python 3.12+
  • Uses Ruff with ALL rules enabled
  • Multiple type checkers: ty, pyrefly, mypy
  • All files must have from __future__ import annotations

License

[Specify your license here - e.g., MIT, Apache 2.0, etc.]

Contributing

See CONTRIBUTING.md for contribution guidelines.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

waq-0.2.0.tar.gz (48.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

waq-0.2.0-py3-none-any.whl (60.1 kB view details)

Uploaded Python 3

File details

Details for the file waq-0.2.0.tar.gz.

File metadata

  • Download URL: waq-0.2.0.tar.gz
  • Upload date:
  • Size: 48.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for waq-0.2.0.tar.gz
Algorithm Hash digest
SHA256 58002a5fcf4c5d628d1d73edb4b1f6b4a0c1f3861ec156d0c8a27e042f45735c
MD5 80dfcbf306897a8c71ce991b3acafdb3
BLAKE2b-256 a5f1e1987d61261d0584c24b66d0ebedc19d598dd6a70d36b729d33b13f73abd

See more details on using hashes here.

File details

Details for the file waq-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: waq-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 60.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for waq-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 45e0fc18d978de8cd39e2efb353c290b7e27fcb97c2b59b08b5af9b8b6ada978
MD5 66ebd446601c8bd5a70c6a3c9906b342
BLAKE2b-256 7cff1407a1c6e7e311f2d538dc828b770a3e37cbd45fa13228cffd5c952849f8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page