Giter VIP home page Giter VIP logo

mrustc's Introduction

Mutabah's Rust Compiler

In-progress alternative rust compiler. Capable of building a fully-working copy of rustc, but not suitable for everyday use (due to terrible error messages).

Build Status: windows Build Status: Linux/OSX

Intro

This project is an attempt at creating a "simple" rust compiler in C++, with the ultimate goal of being a separate re-implementation.

mrustc's primary goal is bootstrapping rustc, and as such it tends to assume that the code it's compiling is valid (and any errors in the generated code are mrustc bugs). Code generation is done by emitting a high-level assembly (currently very ugly C, but LLVM/cretone/GIMPLE/... could work) and getting an external tool (i.e. gcc) to do the heavy-lifting of optimising and machine code generation.

Progress

  • Supported Targets:
    • x86-64 linux (fully bootstrap tested)
    • (incomplete) x86 windows
    • x86-64 windows (runnable executables, no bootstrap yet)
  • Builds working copies of rustc and cargo from a release source tarball
    • Supports (and can bootstrap) rustc 1.19.0, 1.29.0, and 1.39.0
  • rustc bootstrap tested and validated (1.19.0 validated once, 1.29.0 is repeatable)
    • See the script TestRustcBootstrap.sh for how this was done.

Getting Started

Dependencies

  • C++14-compatible compiler (tested with gcc 5.4 and gcc 6, and MSVC 2015)
  • C11 compatible C compiler (for output, see above)
  • make (for the mrustc makefiles)
  • patch (For doing minor edits to the rustc source)
  • libz-dev (used to reduce size of bytecode files, linux only - windows uses vcpkg to download it)
  • curl (for downloading the rust source, linux only)
  • cmake (at least 3.4.3, required for building llvm in rustc)

Linux

  • make RUSTCSRC - Downloads the rustc source tarball (1.29.0 by default)
  • make -f minicargo.mk - Builds mrustc and minicargo, then builds libstd, libtest, finally rustc and cargo
  • make -C run_rustc - Build libstd and a "hello, world" using the above-built rustc

BSD

Similar to Linux, but you might need to

  • specify the rustc default target explicitly
  • specify the compiler
  • use gmake to run GNU make

e.g. gmake CC=cc RUSTC_TARGET=x86_64-unknown-freebsd -f minicargo.mk

Windows

(Tested with VS2015)

  • Download and extract rustc-1.29.0-src.tar.gz to the repository root (such that the rustc-1.29.0-src directory is present)
    • NOTE: I am open to suggestions for how to automate that step
  • Open vsproject/mrustc.sln and build minicargo
  • Run vsproject/run_hello.cmd to build libstd and "hello, world", and run it
    • There are other similar scripts for building cargo and rustc. Cargo works, but rustc hasn't fully been tested (building LLVM on windows has been a challenge)

Building non-rustc code

To build your own code with mrustc, first you need to build at least libcore (and probably the full standard library). This can be done on linux by running make -f minicargo.mk LIBS, or on windows with build_std.cmd.

Next, run

  • minicargo -L <path_to_libstd> <crate_path> to build a cargo project.
  • or, mrustc -L <path_to_libstd> --out-dir <output_directory> <path_to_main.rs> to directly invoke mrustc.

For additional options, both programs have a --help option.

Diagnosing Issues and Reporting Bugs

Debugging

Both the makefiles and minicargo write the compiler's stdout to a file in the output directory, e.g. when building output/libcore.hir it'll save to output/libcore.hir_dbg.txt. To get full debug output for a compilation run, set the environment variable MRUSTC_DEBUG to a : separated list of the passes you want to debug (pass names are printed in every log line). E.g. MRUSTC_DEBUG=Expand:Parse make -f minicargo.mk

Bug Reports

Please try to include the following when submitting a bug report:

  • What you're trying to build
  • Your host system version (e.g. Ubuntu 17.10)
  • C/C++ compiler version
  • Revision of the mrustc repo that you're running

Support and Discussion

For problems that don't warrant opening an issue, join the IRC channel - irc.freenode.net#mrustc

Current Features

  • Full compilation chain including HIR and MIR stages (outputting to C)
  • MIR optimisations (to take some load off the C compiler)
  • Optional exhaustive MIR validation (set the MRUSTC_FULL_VALIDATE environment variable)
  • Functional cargo clone (minicargo)
    • Includes build script support
  • Procedural macros (custom derive)
  • Custom target specifications
    • See docs/target.md

Plans

Short-term

  • Fix currently-failing tests (mostly in type inference)
  • Fix all known TODOs in MIR generation (still some possible leaks)

Medium-term

  • Propagate lifetime annotations so that MIR can include a borrow checker
  • Emit C code that is (more) human readable (uses names from the original source, reduced/no gotos)
  • Add alternate backends (e.g. LLVM IR, cretonne, ...)

Note: All progress is against the source of rustc 1.19.0, rustc 1.29.0, AND rustc 1.39.0

mrustc's People

Contributors

thepowersgang avatar arlosi avatar jirutka avatar est31 avatar valpackett avatar stikonas avatar equal-l2 avatar aristarh2704 avatar elichai avatar arlied-google avatar ubsan avatar dkm avatar glaubitz avatar justanotherstrange avatar spacekookie avatar reitermarkus avatar coypoop avatar notriddle avatar barbeque avatar artoria2e5 avatar oli-obk avatar sanxiyn avatar kaniini avatar donbright avatar concatime avatar ip1981 avatar guillaumegomez avatar emosenkis avatar eddyp avatar e5ten avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.