• Stars
    star
    543
  • Rank 81,848 (Top 2 %)
  • Language
    Rust
  • License
    Apache License 2.0
  • Created over 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Compiler from LLVM IR to Minecraft datapacks.

Langcraft

The LLVM target for Minecraft you've never wanted

Langcraft is a code generator targeting Minecraft Data Packs. It can currently run a fairly substantial set of bitcode files without issue. The project has a built-in command interpreter for debugging that supports breakpoints (ish) and inspecting register/memory values. All generated datapacks can be run in a real Minecraft Java Edition 1.16+ world in under 5 minutes.

(See also Wasmcraft2 for the spiritual successor to this project, which is faster and more reliable)

Usage

cargo run -- --arg1 --arg2 ./path/to/llvm/bitcode.bc

Valid arguments are:

  • --help: Display usage and available options
  • --out=path/to/dir/: Specify the directory the datapack files should be placed in (default is ./out)
  • --run: Run the command interpreter on the generated code
  • --trace-bbs: Insert a print command at the beginning of each LLVM basic block

To use the generated datapack in Minecraft:

  1. Copy the entire output folder (./out by default) to the datapacks/ directory of a Minecraft world (using a superflat void world is recommended)
  2. Run /function setup:setup. This only has to be done the first time a Langcraft datapack is used in a world.
  3. Run /function rust:run
  4. If the datapack is modified while the world is open, run /reload and then go back to step 3.

Rust code must be built as follows:

  • Release mode
  • panic=abort
  • #![no_std]
  • #![no_main]
  • Have a main function with #[no_mangle]
  • Use i686-unknown-linux

rust_interp is a Rust project already configured to generate the proper bitcode. The interpreter binary target as shown in the demo can be built with:

sh compile_rust.sh

And the file to use will be:

rust_interp/target/i686-unknown-linux-gnu/release/deps/interpreter-SOMEHEXSTRING.bc

Any other language capable of generating LLVM bitcode can be used, as long as it can be built for a bare-metal 32-bit target. For a clang example see compile_c.sh.

Note that the latest nightly versions of rustc now use LLVM 11, which Langcraft cannot parse (yet). You can set an earlier version to use for a directory with:

rustup override set nightly-2020-08-23

Demo

A video of a Langcraft-compiled interpreter can be seen here.

License

Licensed under either of

  • MIT License
  • Apache License, Version 2.0