Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Experimental JIT compiler #3292

Closed
wants to merge 10 commits into from
Closed

Experimental JIT compiler #3292

wants to merge 10 commits into from

Conversation

z0w0
Copy link
Contributor

@z0w0 z0w0 commented Aug 28, 2012

This is my 3rd attempt to get this working over around 4 months. It's working pretty well compared to last attempts.

I've found that it runs perfectly (slow parsing/compiling times, fast executing times) with most tests running fine. Most benchmarks actually run faster than statically compiled executables! Of course, it's not perfect yet and there are some issues:

  • No crates are explicitly linked in yet - this is easy to do code-wise, the issue is llvm::sys::DynamicLibrary::LoadLibraryPermanently is segfaulting when I try and load crates. The code to do this (pretty simple) is commented out and ready to be fixed (I imagine the fix is something simple)
  • std and core are the only crates available because of above - they're only available because the JIT compiler uses dlsym to resolve symbols from the main program and any loaded crates - hence it loads the std and core crates used by rustc. This is not a good idea, as users may want to use specific versions of the core libraries, so it has to be fixed with above
  • Running some code/tests or using --test results in terminate called after throwing an instance of 'rust_task*' - I do not know enough to understand what's causing that
  • Minor/easy thing: You can't pass along arguments to the jitted program yet

These issues can easily be fixed in patches (I'll investigate the first two issues) but I'm not sure about the 3rd one. #rust were pretty keen to see this pulled upstream and I think it's ready for that.

Also important to mention is I based the memory manager source code on LLVM's lli tool (most of the original comments remain) because it worked well with what was needed and it had fixed issues that I knew were going to be hit (also it was the only good example of JIT memory managers that I could find - MCJIT managers require them in order to run). Not sure what sort of things need to be done there in terms of licensing / credits / etc.

@brson
Copy link
Contributor

brson commented Aug 28, 2012

This looks great. Linking rustllvm to morestack turns out to be problematic because morestack expects two symbols from the Rust runtime to exist. Apparently this isn't a problem on linux, but on mac it doesn't link.

See the errors on mac here: http://bot.rust-lang.org/logs/2012/07/28/2012-08-28T18:37:31Z-f5a3db41-389e-47f0-ab45-e35d9374bac0.html

We can possibly work around this further by linking rustllvm to rustrt.

@brson
Copy link
Contributor

brson commented Aug 28, 2012

For the licensing issue, probably what we should do is add a comment near the code saying where it is copied from, then in LICENSE.txt add some text like 'Portions of the code for integrating LLVM, under src/rustllvm, is derived from the LLVM codebase, under the following license.' then list the whole license.

@brson
Copy link
Contributor

brson commented Aug 28, 2012

Here's a patch that makes the address of __morestack available through the 'morestack_addr' intrinsic. It looks to me like it works correctly. You could use from within rustc to grab the correct address and pass to rustllvm.

brson@b74e625

@brson
Copy link
Contributor

brson commented Aug 29, 2012

This commit adds JIT testing support to the main test harness:

brson@64dc43c

Use it with make check-stage2-rpass TESTARGS=--jit. These are my results for the run-pass tests: '785 passed; 58 failed; 60 ignored'. Pretty amazing!

@brson
Copy link
Contributor

brson commented Aug 29, 2012

OK, this commit runs the run-fail tests through the JIT as well, and they all fail with the 'terminate called after throwing ...' error.

brson@25a0f74

@brson
Copy link
Contributor

brson commented Aug 29, 2012

We're going to need to think a bit about what it is that the JIT should actually do. What we're doing here effictively starts an entirely new runtime by calling "main". This will have some subtle consequences, partly because the Rust runtime isn't entirely threadsafe when there are multiple instances, and also because the TLS usage of the second runtime will, in some cases, end up clobbering the TLS of the original runtime.

More importantly though, what we really want is to run the JIT, then get the address of the Rust main function, then begin executing that function from within the Rust stack.

This is all for later though.

@z0w0
Copy link
Contributor Author

z0w0 commented Aug 29, 2012

I understand, I didn't think about how there would be two instances of the runtime. Do you think starting two runtimes could have something to do with the terminate error? WRT spawning it inside the compiler's runtime, I don't know how to do that, so if you want to do it / point me to the correct way I'll be happy to. Also can you explain the significance of the intrinsic commit? I don't know what it does or has to be done to make the symbol available.

EDIT: I think I understand. The intrinsic is a custom ABI that I can use to pass the address to rustllvm.

@brson
Copy link
Contributor

brson commented Aug 29, 2012

"rust-intrinsic" is a special ABI for native functions that refers to a few built-in functions that the compiler can emit on demand. It's mostly for very low-level stuff like getting the alignment of types. The 'morestack_addr' intrinsic tells rustc to create a function that just returns the address of __morestack. Intrinsic extern modules may be declared anywhere. The attached test case illustrates how to use it though it may need to get reinterpret_casted to some other pointer type. Fixing this is the minimum we need to do to get this building everywhere and merged.

I do think that the extra runtime could be related to the terminate error, though I haven't imagined exactly how.

It looks to me that the Rust ABI main function is called "_rust_main", so instead of asking for the address of "main", then executing it inside of rustllvm, we should be able to ask for "_rust_main", return it to rustc, then rustc can use it to synthesize a closure without an environment and call it.

This commit has an example of synthesizing a closure: 6e20ffe

@z0w0
Copy link
Contributor Author

z0w0 commented Aug 30, 2012

Seems to be working fine! If someone can test this fixed the build issues on OSX, that would be great. I'm trying to get crate loading working and then everything should be good.

EDIT: The error message is /usr/local/lib/rustc/i686-unknown-linux-gnu/lib/libcore-c3ca5d77d81b46c1-0.3.so: cannot read file data when I try to load the crate. However, when I try to do this in a plain C program it runs fine. It's very strange. I've tried Googling around, really can't find anything on what that error message is implying.

@brson
Copy link
Contributor

brson commented Aug 31, 2012

I ran your latest revision through the try branch on the bots and they were mostly happy. The windows bot failed but I suspect it's unrelated to your changes. Unfortunately I've been busy with other things and won't be able to merge this until tomorrow.

@brson
Copy link
Contributor

brson commented Aug 31, 2012

Pushed to incoming.

@brson brson closed this Aug 31, 2012
RalfJung pushed a commit to RalfJung/rust that referenced this pull request Feb 17, 2024
jaisnan pushed a commit to jaisnan/rust-dev that referenced this pull request Jul 29, 2024
Update Rust toolchain from nightly-2024-06-24 to nightly-2024-06-25
without any other source changes.
This is an automatically generated pull request. If any of the CI checks
fail, manual intervention is required. In such a case, review the
changes at https://github.com/rust-lang/rust from
rust-lang@bcf94de
up to
rust-lang@6b0f4b5.
The log for this commit range is:
rust-lang@6b0f4b5ec3 Auto merge of
rust-lang#126914 - compiler-errors:rollup-zx0hchm, r=compiler-errors
rust-lang@16bd6e25e1 Rollup merge of
rust-lang#126911 - oli-obk:do_not_count_errors, r=compiler-errors
rust-lang@59c258f51f Rollup merge of
rust-lang#126909 - onur-ozkan:add-kobzol, r=matthiaskrgr
rust-lang@85eb835a14 Rollup merge of
rust-lang#126904 - GrigorenkoPV:nonzero-fixme, r=joboet
rust-lang@a7721a0373 Rollup merge of
rust-lang#126899 - GrigorenkoPV:suggest-const-block, r=davidtwco
rust-lang@9ce2a070b3 Rollup merge of
rust-lang#126682 - Zalathar:coverage-attr, r=lcnr
rust-lang@49bdf460a2 Rollup merge of
rust-lang#126673 - oli-obk:dont_rely_on_err_reporting, r=compiler-errors
rust-lang@46e43984d1 Rollup merge of
rust-lang#126413 - matthiaskrgr:crshmsg, r=oli-obk
rust-lang@ed460d2eaa Rollup merge of
rust-lang#125575 - dingxiangfei2009:derive-smart-ptr, r=davidtwco
rust-lang@c77dc28f87 Rollup merge of
rust-lang#125082 - kpreid:const-uninit, r=dtolnay
rust-lang@faa28be2f1 Rollup merge of
rust-lang#124712 - Enselic:deprecate-inline-threshold, r=pnkfelix
rust-lang@00e5f5886a Rollup merge of
rust-lang#124460 - long-long-float:show-notice-about-enum-with-debug, r=pnkfelix
rust-lang@d8d5732456 Auto merge of
rust-lang#126784 - scottmcm:smaller-terminator, r=compiler-errors
rust-lang@13fca73f49 Replace
`MaybeUninit::uninit_array()` with array repeat expression.
rust-lang@5a3e2a4e92 Auto merge of
rust-lang#126523 - joboet:the_great_big_tls_refactor, r=Mark-Simulacrum
rust-lang@45261ff2ec add @Kobzol to
bootstrap team for triagebot
rust-lang@84474a25a4 Small fixme in core
now that NonZero is generic
rust-lang@50a02ed789 std: fix wasm builds
rust-lang@8fc6b3de19 Separate the mir
body lifetime from the other lifetimes
rust-lang@1c4d0ced58 Separate the
lifetimes of the `BorrowckInferCtxt` from the other borrowed items
rust-lang@d371d17496 Auto merge of
rust-lang#126900 - matthiaskrgr:rollup-24ah97b, r=matthiaskrgr
rust-lang@8ffb5f936a compiletest: make
the crash test error message abit more informative
rust-lang@a80ee9159b Rollup merge of
rust-lang#126882 - estebank:multiline-order, r=WaffleLapkin
rust-lang@8bfde609e2 Rollup merge of
rust-lang#126414 - ChrisDenton:target-known, r=Nilstrieb
rust-lang@94b9ea417d Rollup merge of
rust-lang#126213 - zachs18:atomicbool-u8-i8-from-ptr-alignment, r=Nilstrieb
rust-lang@9d24ecc37b Rollup merge of
rust-lang#125241 - Veykril:tool-rust-analyzer, r=davidtwco
rust-lang@ba5ec1fc5c Suggest inline const
blocks for array initialization
rust-lang@06c072f158 Auto merge of
rust-lang#126788 - GuillaumeGomez:migrate-rustdoc-tests-syntax, r=fmease,oli-obk
rust-lang@1852141219 coverage: Bless
coverage attribute tests
rust-lang@b7c057c9b2 coverage: Always
error on `#[coverage(..)]` in unexpected places
rust-lang@a000fa8b54 coverage: Tighten
validation of `#[coverage(off)]` and `#[coverage(on)]`
rust-lang@b5dfeba0e1 coverage: Forbid
multiple `#[coverage(..)]` attributes
rust-lang@6909feab8e Allow numbers in
rustdoc tests commands
rust-lang@4e258bb4c3 Fix tidy issue for
rustdoc tests commands
rust-lang@51fedf65ff Remove commands
duplication between `compiletest` and `tests/rustdoc`
rust-lang@1b67035579 Update
`tests/rustdoc` to new test syntax
rust-lang@d3ec92e16e Move `tests/rustdoc`
testsuite to `//@` syntax
rust-lang@2c243d9570 Auto merge of
rust-lang#126891 - matthiaskrgr:rollup-p6dl1gk, r=matthiaskrgr
rust-lang@b94d2754b5 Rollup merge of
rust-lang#126888 - compiler-errors:oops-debug-printing, r=dtolnay
rust-lang@9892b3e9fe Rollup merge of
rust-lang#126854 - devnexen:std_unix_os_fallback_upd, r=Mark-Simulacrum
rust-lang@3108dfaced Rollup merge of
rust-lang#126849 - workingjubilee:correctly-classify-arm-low-dregs, r=Amanieu
rust-lang@dcace866f0 Rollup merge of
rust-lang#126845 - rust-lang:cargo_update, r=Mark-Simulacrum
rust-lang@21850f5bd8 Rollup merge of
rust-lang#126807 - devnexen:copy_file_macos_simpl, r=Mark-Simulacrum
rust-lang@b24e3df0df Rollup merge of
rust-lang#126754 - compiler-errors:use-rustfmt, r=calebcartwright
rust-lang@ad0531ae0d Rollup merge of
rust-lang#126455 - surechen:fix_126222, r=estebank
rust-lang@7babf99ea9 Rollup merge of
rust-lang#126298 - heiher:loongarch64-musl-ci, r=Mark-Simulacrum
rust-lang@9a591ea1ce Rollup merge of
rust-lang#126177 - carbotaniuman:unsafe_attr_errors, r=jieyouxu
rust-lang@25446c25fc Remove stray println
from rustfmt
rust-lang@d49994b060 Auto merge of
rust-lang#126023 - amandasystems:you-dropped-this-again, r=nikomatsakis
rust-lang@a23917cfd0 Add hard error and
migration lint for unsafe attrs
rust-lang@284437d434 Special case when a
code line only has multiline span starts
rust-lang@f1be59fa72 SmartPointer
derive-macro
rust-lang@a426d6fdf0 Implement use<>
formatting in rustfmt
rust-lang@16fef40896 Promote
loongarch64-unknown-linux-musl to Tier 2 with host tools
rust-lang@03d73fa6ba ci: Add support for
dist-loongarch64-musl
rust-lang@fc50acae90 fix build
rust-lang@bd9ce3e074
std::unix::os::home_dir: fallback's optimisation.
rust-lang@0d8f734172 compiler: Fix arm32
asm issues by hierarchically sorting reg classes
rust-lang@e8b5ba1111 For [E0308]:
mismatched types, when expr is in an arm's body, not add semicolon ';'
at the end of it.
rust-lang@990535723d cargo update
rust-lang@b28efb11af Save 2 pointers in
`TerminatorKind` (96 → 80 bytes)
rust-lang@65530ba100 std::unix::fs: copy
simplification for apple.
rust-lang@339015920d Add `rust_analyzer`
as a predefined tool
rust-lang@3f2f8438b4 Ensure we don't
accidentally succeed when we want to report an error
rust-lang@32f9b8bf76 std: rename module
for clarity
rust-lang@35f050b8da std: update TLS
module documentation
rust-lang@b2f29edc81 std: use the `c_int`
from `core::ffi` instead of `libc`
rust-lang@d70f071392 std: simplify
`#[cfg]`s for TLS
rust-lang@d630f5da7a Show notice about
"never used" for enum
rust-lang@f3facf1175 std: refactor the
TLS implementation
rust-lang@f5f067bf9d Deprecate no-op
codegen option `-Cinline-threshold=...`
rust-lang@651ff643ae Fix typo in
`-Cno-stack-check` deprecation warning
rust-lang@3af624272a rustc_codegen_ssa:
Remove unused ModuleConfig::inline_threshold
rust-lang@34e6ea1446 Tier 2 std support
must always be known
rust-lang@2d4cb7aa5a Update docs for
AtomicU8/I8.
rust-lang@7885c7b7b2 Update safety docs
for AtomicBool::from_ptr.
rust-lang@7b5b7a7010 Remove confusing
`use_polonius` flag and do less cloning

Co-authored-by: tautschnig <1144736+tautschnig@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants