diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2015-06-30 10:28:24 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2015-07-02 10:45:13 -0700 |
| commit | 3e26e56a79ae33dfc8f2f4d0123b5080fd0a7853 (patch) | |
| tree | 597c940aec7675d6a84159ec14fc2ac760184c94 /src/rt | |
| parent | 83ee47b054deb5939be20d7d6ce03ad33d005424 (diff) | |
| download | rust-3e26e56a79ae33dfc8f2f4d0123b5080fd0a7853.tar.gz rust-3e26e56a79ae33dfc8f2f4d0123b5080fd0a7853.zip | |
rustc_trans: Disable landing pads on 32-bit MSVC
This is currently quite buggy in LLVM from what I can tell, so just disable it entirely. This commit also adds preliminary support, however, to actually target 32-bit MSVC by making sure the `rust_try_msvc_32.ll` file exists and wiring up exceptions to `_except_handler3` instead of `__C_specific_handler` (which doesn't exist on 32-bit).
Diffstat (limited to 'src/rt')
| -rw-r--r-- | src/rt/rust_try_msvc_32.ll | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/rt/rust_try_msvc_32.ll b/src/rt/rust_try_msvc_32.ll new file mode 100644 index 00000000000..bdee53b136e --- /dev/null +++ b/src/rt/rust_try_msvc_32.ll @@ -0,0 +1,42 @@ +; Copyright 2015 The Rust Project Developers. See the COPYRIGHT +; file at the top-level directory of this distribution and at +; http://rust-lang.org/COPYRIGHT. +; +; Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +; http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +; <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +; option. This file may not be copied, modified, or distributed +; except according to those terms. + +; For more comments about what's going on here see rust_try_msvc_64.ll. The only +; difference between that and this file is the personality function used as it's +; different for 32-bit MSVC than it is for 64-bit. + +define i8* @rust_try(void (i8*)* %f, i8* %env) + personality i8* bitcast (i32 (...)* @_except_handler3 to i8*) +{ + invoke void %f(i8* %env) + to label %normal + unwind label %catch + +normal: + ret i8* null +catch: + %vals = landingpad { i8*, i32 } + catch i8* bitcast (i32 (i8*, i8*)* @__rust_try_filter to i8*) + %ehptr = extractvalue { i8*, i32 } %vals, 0 + %sel = extractvalue { i8*, i32 } %vals, 1 + %filter_sel = call i32 @llvm.eh.typeid.for(i8* bitcast (i32 (i8*, i8*)* @__rust_try_filter to i8*)) + %is_filter = icmp eq i32 %sel, %filter_sel + br i1 %is_filter, label %catch-return, label %catch-resume + +catch-return: + ret i8* %ehptr + +catch-resume: + resume { i8*, i32 } %vals +} + +declare i32 @_except_handler3(...) +declare i32 @__rust_try_filter(i8*, i8*) +declare i32 @llvm.eh.typeid.for(i8*) readnone nounwind |
