Unverified Commit d4f7c37a authored by Georg Koppen's avatar Georg Koppen
Browse files

Bug 30376: Use Rust 1.34 for Tor Browser 9

Use 1.34 for tor Rust support on nightly builds as well.
parent 0a8ab5b2
......@@ -59,11 +59,7 @@ cd /var/tmp/build/rustc-[% c('version') %]-src
# See: https://github.com/rust-lang/rust/issues/12859 for discussion about
# that and https://github.com/rust-lang/rust/pull/49633 for a newer attempt to
# fix this problem. We apply the patch from neersighted.
[% IF !c("input_file_var/unwind_128") %]
patch -p1 < $rootdir/unwind.patch
[% ELSE %]
patch -p1 < $rootdir/unwind_128.patch
[% END %]
patch -p1 < $rootdir/unwind.patch
[% END %]
[% IF c("var/android") %]
......@@ -78,15 +74,6 @@ mkdir build
cd build
../configure --prefix=$distdir [% c("var/configure_opt") %]
# We need to disable Thin LTO due to reproducibility issues on macOS and
# probably Linux. Alas, there is no direct option available in the config.toml
# in 1.26.1 yet, so we need to toggle this indirectly via `codegen-units`.
[% IF c("var/osx") || c("var/linux") %]
# It seems hard to pass the proper value via ./configure so we resort to our
# old friend `sed`.
sed -i 's/#codegen-units = 1/codegen-units = 1/' config.toml
[% END %]
make -j[% c("buildconf/num_procs") %]
make install
cd /var/tmp/dist
......
# vim: filetype=yaml sw=2
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
version: '[% c("input_file_var/rust_version") %]'
# those values can be changed from the input_files section of other
# projects. See projects/tor/config and bug 28260.
input_file_var:
rust_version: 1.26.1
prev_version: 1.25.0
version: 1.34.2
var:
prev_version: '[% c("input_file_var/prev_version") %]'
prev_version: 1.33.0
rust_arch: '[% c("arch") %]'
container:
use_container: 1
......@@ -55,6 +49,9 @@ targets:
#
# `--enable-extended` to build not only rustc but cargo as well
#
# `--enable-llvm-static-stdccp` to take a libstdc++ on Wheezy into account
# which is too old and if used gives undefined reference errors
#
# `--release-channel=stable` to just include stable features in the
# compiler
#
......@@ -72,7 +69,7 @@ targets:
# version mismatch. We avoid that with this configure option. We need to
# build our own GCC in the first place as 4.7.2 is too old to get all the
# Rust pieces compiled.
configure_opt: --enable-local-rust --enable-vendor --enable-extended --release-channel=stable --sysconfdir=etc --target=x86_64-unknown-linux-gnu,i686-unknown-linux-gnu --set=target.x86_64-unknown-linux-gnu.cc=gcc --set=target.i686-unknown-linux-gnu.cc=gcc
configure_opt: --enable-local-rust --enable-vendor --enable-extended --enable-llvm-static-stdcpp --release-channel=stable --sysconfdir=etc --target=x86_64-unknown-linux-gnu,i686-unknown-linux-gnu --set=target.x86_64-unknown-linux-gnu.cc=gcc --set=target.i686-unknown-linux-gnu.cc=gcc
osx-x86_64:
var:
......@@ -107,9 +104,7 @@ input_files:
file_gpg_id: 1
gpg_keyring: rust.gpg
- filename: unwind.patch
enable: '[% c("var/windows-i686") && !c("input_file_var/unwind_128") %]'
- filename: unwind_128.patch
enable: '[% c("input_file_var/unwind_128") %]'
enable: '[% c("var/windows-i686") %]'
- filename: replace_pagesize_in_mmap.patch
enable: '[% c("var/android") %]'
- filename: 0001-Make-sure-dl_iterate_phdr-is-undefined-on-Android.patch
......
From dd808373aefe6247975455006bbfb89aa6410ed9 Mon Sep 17 00:00:00 2001
From b3bea7008ece7a5bdf9b5a5dcc95e82febad1854 Mon Sep 17 00:00:00 2001
From: Bjorn Neergaard <bjorn@neersighted.com>
Date: Tue, 3 Apr 2018 19:01:07 -0600
Date: Sat, 9 Feb 2019 19:39:23 +0000
Subject: [PATCH] Fix cross-compiling i686-pc-windows-gnu from Linux
This is still very rough and serves as a proof-of-concept for fixing
......@@ -32,49 +32,49 @@ rethinking of how iOS is special-cased above, to avoid further
duplication. Input on how to best structure this file is requested.
diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs
index e6aa78fba5..624f2ccfbe 100644
index 249a183189..df08d6eb0c 100644
--- a/src/bootstrap/compile.rs
+++ b/src/bootstrap/compile.rs
@@ -146,6 +146,11 @@ pub fn std_cargo(build: &Builder,
cargo.env("MACOSX_DEPLOYMENT_TARGET", target);
}
+ // FIXME: Temporary detection of SJLJ MinGW compilers.
+ if build.build.build.contains("linux") && target == "i686-pc-windows-gnu" {
+ features.push_str(" sjlj_eh");
+ }
@@ -162,7 +162,12 @@ pub fn std_cargo(builder: &Builder<'_>,
.arg("--features")
.arg("compiler-builtins-mem");
} else {
- let features = builder.std_features();
+ let mut features = builder.std_features();
+
// When doing a local rebuild we tell cargo that we're stage1 rather than
// stage0. This works fine if the local rust and being-built rust have the
// same view of what the default allocator is, but fails otherwise. Since
+ // FIXME: Temporary detection of SJLJ MinGW compilers.
+ if builder.config.build.contains("linux") && target == "i686-pc-windows-gnu" {
+ features.push_str(" sjlj_eh");
+ }
if compiler.stage != 0 && builder.config.sanitizers {
// This variable is used by the sanitizer runtime crates, e.g.
diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml
index 1201759885..a06ef7e0e6 100644
index 7d60a17042..d876d0b89a 100644
--- a/src/libstd/Cargo.toml
+++ b/src/libstd/Cargo.toml
@@ -49,3 +49,4 @@ force_alloc_system = []
panic-unwind = ["panic_unwind"]
profiler = ["profiler_builtins"]
wasm_syscall = []
@@ -71,3 +71,4 @@ wasm-bindgen-threads = []
# https://github.com/rust-lang-nursery/stdsimd/blob/master/crates/std_detect/Cargo.toml
std_detect_file_io = []
std_detect_dlsym_getauxval = []
+sjlj_eh = ["unwind/sjlj_eh"]
diff --git a/src/libunwind/Cargo.toml b/src/libunwind/Cargo.toml
index fbd9789d2f..15a20d7ff4 100644
index 2378b0a315..0b5979ed62 100644
--- a/src/libunwind/Cargo.toml
+++ b/src/libunwind/Cargo.toml
@@ -14,3 +14,7 @@ doc = false
[dependencies]
@@ -16,3 +16,6 @@ doc = false
core = { path = "../libcore" }
libc = { path = "../rustc/libc_shim" }
libc = { version = "0.2.43", features = ['rustc-dep-of-std'], default-features = false }
compiler_builtins = "0.1.0"
+
+[features]
+sjlj_eh = []
+
diff --git a/src/libunwind/libunwind.rs b/src/libunwind/libunwind.rs
index aa73b11fb3..16c21be736 100644
index 339b554ed6..ec2f93ed60 100644
--- a/src/libunwind/libunwind.rs
+++ b/src/libunwind/libunwind.rs
@@ -10,11 +10,6 @@
#![allow(bad_style)]
@@ -1,10 +1,5 @@
#![allow(nonstandard_style)]
-macro_rules! cfg_if {
- ( $( if #[cfg( $meta:meta )] { $($it1:item)* } else { $($it2:item)* } )* ) =>
......@@ -84,15 +84,18 @@ index aa73b11fb3..16c21be736 100644
use libc::{c_int, c_void, uintptr_t};
#[repr(C)]
@@ -85,7 +80,6 @@ pub type _Unwind_Exception_Cleanup_Fn = extern "C" fn(unwind_code: _Unwind_Reaso
@@ -73,8 +68,8 @@ pub enum _Unwind_Context {}
pub type _Unwind_Exception_Cleanup_Fn = extern "C" fn(unwind_code: _Unwind_Reason_Code,
exception: *mut _Unwind_Exception);
extern "C" {
#[cfg_attr(stage0, unwind)]
#[cfg_attr(not(stage0), unwind(allowed))]
- #[unwind(allowed)]
- pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !;
+ #[cfg_attr(stage0, unwind)]
+ #[cfg_attr(not(stage0), unwind(allowed))]
pub fn _Unwind_DeleteException(exception: *mut _Unwind_Exception);
pub fn _Unwind_GetLanguageSpecificData(ctx: *mut _Unwind_Context) -> *mut c_void;
pub fn _Unwind_GetRegionStart(ctx: *mut _Unwind_Context) -> _Unwind_Ptr;
@@ -217,28 +211,52 @@ if #[cfg(all(any(target_os = "ios", not(target_arch = "arm"))))] {
@@ -206,26 +201,52 @@ if #[cfg(all(any(target_os = "ios", target_os = "netbsd", not(target_arch = "arm
pc
}
}
......@@ -104,17 +107,13 @@ index aa73b11fb3..16c21be736 100644
+if #[cfg(all(target_os = "ios", target_arch = "arm"))] {
+ // 32-bit iOS uses SjLj and does not provide _Unwind_Backtrace()
extern "C" {
#[cfg_attr(stage0, unwind)]
#[cfg_attr(not(stage0), unwind(allowed))]
- #[unwind(allowed)]
- pub fn _Unwind_RaiseException(exception: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
- pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
- trace_argument: *mut c_void)
- -> _Unwind_Reason_Code;
+ #[cfg_attr(stage0, unwind)]
+ #[cfg_attr(not(stage0), unwind(allowed))]
+ pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !;
+ pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
}
-} else {
- // 32-bit iOS uses SjLj and does not provide _Unwind_Backtrace()
+ }
+
+ #[inline]
+ pub unsafe fn _Unwind_RaiseException(exc: *mut _Unwind_Exception) -> _Unwind_Reason_Code {
......@@ -122,15 +121,20 @@ index aa73b11fb3..16c21be736 100644
+ }
+
+} else if #[cfg(feature = "sjlj_eh")] {
extern "C" {
#[cfg_attr(stage0, unwind)]
#[cfg_attr(not(stage0), unwind(allowed))]
+ extern "C" {
+ #[cfg_attr(stage0, unwind)]
+ #[cfg_attr(not(stage0), unwind(allowed))]
+ pub fn _Unwind_SjLj_Resume(e: *mut _Unwind_Exception) -> !;
pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
+ pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
+ trace_argument: *mut c_void)
+ -> _Unwind_Reason_Code;
+ }
+ pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
trace_argument: *mut c_void)
-> _Unwind_Reason_Code;
}
-} else {
- // 32-bit iOS uses SjLj and does not provide _Unwind_Backtrace()
- extern "C" {
- #[unwind(allowed)]
- pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
+
+ #[inline]
+ pub unsafe fn _Unwind_Resume(exc: *mut _Unwind_Exception) -> ! {
......@@ -154,5 +158,5 @@ index aa73b11fb3..16c21be736 100644
}
} // cfg_if!
--
2.17.1
2.23.0.rc0
From 0a186eafebf26ca01879827a4cc95cc274791334 Mon Sep 17 00:00:00 2001
From: Bjorn Neergaard <bjorn@neersighted.com>
Date: Sat, 9 Feb 2019 19:39:23 +0000
Subject: [PATCH] Fix cross-compiling i686-pc-windows-gnu from Linux
This is still very rough and serves as a proof-of-concept for fixing
Linux -> 32-bit MinGW cross compilation workflow. Currently, clang and
GCC's MinGW targets both only support DW2 (DWARF) or SJLJ (Set Jump Long
Jump) unwinding on 32-bit Windows.
The default for GCC (and the way it is shipped on every major distro) is
to use SJLJ on Windows, as DWARF cannot traverse non-DWARF frames. This
would work fine, except for the fact that libgcc (our C runtime on the
MinGW platform) exports symbols under a different name when configured
to use SJLJ-style unwinding, and uses a preprocessor macro internally to
alias them.
Because of this, we have to detect this scenario and link to the correct
symbols ourselves. Linking has been tested with a full bootstrap on both
x86_64-unknown-linux-gnu and i686-pc-windows-gnu, as well as
cross-compilation of some of my own projects.
Obviously, the detection is a bit unrefined. Right now we
unconditionally use SJLJ when compiling Linux -> MinGW. I'd like to add
feature detection using compiler build flags or autotools-style
compilation and object analysis. Input on the best way to proceed here
is welcome.
Also, currently there is copy-pasted/duplicated code in libunwind.
Ideally, this could be reduced, but this would likely require a
rethinking of how iOS is special-cased above, to avoid further
duplication. Input on how to best structure this file is requested.
diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs
index 11d9154ba6..bd8ff844f7 100644
--- a/src/bootstrap/compile.rs
+++ b/src/bootstrap/compile.rs
@@ -154,6 +154,11 @@ pub fn std_cargo(builder: &Builder,
} else {
let mut features = builder.std_features();
+ // FIXME: Temporary detection of SJLJ MinGW compilers.
+ if builder.config.build.contains("linux") && target == "i686-pc-windows-gnu" {
+ features.push_str(" sjlj_eh");
+ }
+
// When doing a local rebuild we tell cargo that we're stage1 rather than
// stage0. This works fine if the local rust and being-built rust have the
// same view of what the default allocator is, but fails otherwise. Since
diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml
index 5a2dce5930..e1c876f503 100644
--- a/src/libstd/Cargo.toml
+++ b/src/libstd/Cargo.toml
@@ -50,3 +50,4 @@ force_alloc_system = []
panic-unwind = ["panic_unwind"]
profiler = ["profiler_builtins"]
wasm_syscall = []
+sjlj_eh = ["unwind/sjlj_eh"]
diff --git a/src/libunwind/Cargo.toml b/src/libunwind/Cargo.toml
index 4760461df6..27c7303604 100644
--- a/src/libunwind/Cargo.toml
+++ b/src/libunwind/Cargo.toml
@@ -15,3 +15,6 @@ doc = false
core = { path = "../libcore" }
libc = { path = "../rustc/libc_shim" }
compiler_builtins = { path = "../rustc/compiler_builtins_shim" }
+
+[features]
+sjlj_eh = []
diff --git a/src/libunwind/libunwind.rs b/src/libunwind/libunwind.rs
index 73a259bd44..ff3404864f 100644
--- a/src/libunwind/libunwind.rs
+++ b/src/libunwind/libunwind.rs
@@ -10,11 +10,6 @@
#![allow(bad_style)]
-macro_rules! cfg_if {
- ( $( if #[cfg( $meta:meta )] { $($it1:item)* } else { $($it2:item)* } )* ) =>
- ( $( $( #[cfg($meta)] $it1)* $( #[cfg(not($meta))] $it2)* )* )
-}
-
use libc::{c_int, c_void, uintptr_t};
#[repr(C)]
@@ -83,8 +78,8 @@ pub enum _Unwind_Context {}
pub type _Unwind_Exception_Cleanup_Fn = extern "C" fn(unwind_code: _Unwind_Reason_Code,
exception: *mut _Unwind_Exception);
extern "C" {
- #[unwind(allowed)]
- pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !;
+ #[cfg_attr(stage0, unwind)]
+ #[cfg_attr(not(stage0), unwind(allowed))]
pub fn _Unwind_DeleteException(exception: *mut _Unwind_Exception);
pub fn _Unwind_GetLanguageSpecificData(ctx: *mut _Unwind_Context) -> *mut c_void;
pub fn _Unwind_GetRegionStart(ctx: *mut _Unwind_Context) -> _Unwind_Ptr;
@@ -216,26 +211,52 @@ if #[cfg(all(any(target_os = "ios", target_os = "netbsd", not(target_arch = "arm
pc
}
}
+} // cfg_if!
-if #[cfg(not(all(target_os = "ios", target_arch = "arm")))] {
- // Not 32-bit iOS
+cfg_if! {
+if #[cfg(all(target_os = "ios", target_arch = "arm"))] {
+ // 32-bit iOS uses SjLj and does not provide _Unwind_Backtrace()
extern "C" {
- #[unwind(allowed)]
- pub fn _Unwind_RaiseException(exception: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
+ #[cfg_attr(stage0, unwind)]
+ #[cfg_attr(not(stage0), unwind(allowed))]
+ pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !;
+ pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
+ }
+
+ #[inline]
+ pub unsafe fn _Unwind_RaiseException(exc: *mut _Unwind_Exception) -> _Unwind_Reason_Code {
+ _Unwind_SjLj_RaiseException(exc)
+ }
+
+} else if #[cfg(feature = "sjlj_eh")] {
+ extern "C" {
+ #[cfg_attr(stage0, unwind)]
+ #[cfg_attr(not(stage0), unwind(allowed))]
+ pub fn _Unwind_SjLj_Resume(e: *mut _Unwind_Exception) -> !;
+ pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
trace_argument: *mut c_void)
-> _Unwind_Reason_Code;
}
-} else {
- // 32-bit iOS uses SjLj and does not provide _Unwind_Backtrace()
- extern "C" {
- #[unwind(allowed)]
- pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
+
+ #[inline]
+ pub unsafe fn _Unwind_Resume(exc: *mut _Unwind_Exception) -> ! {
+ _Unwind_SjLj_Resume(exc)
}
#[inline]
pub unsafe fn _Unwind_RaiseException(exc: *mut _Unwind_Exception) -> _Unwind_Reason_Code {
_Unwind_SjLj_RaiseException(exc)
}
+} else {
+ extern "C" {
+ #[cfg_attr(stage0, unwind)]
+ #[cfg_attr(not(stage0), unwind(allowed))]
+ pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !;
+ pub fn _Unwind_RaiseException(exception: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
+ pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
+ trace_argument: *mut c_void)
+ -> _Unwind_Reason_Code;
+ }
}
} // cfg_if!
--
2.20.1
......@@ -59,10 +59,4 @@ input_files:
project: '[% c("var/compiler") %]'
- name: rust
project: rust
# Tor needs rust >= 1.28.0
# See bug 28260
input_file_var:
rust_version: 1.28.0
prev_version: 1.27.2
unwind_128: '[% c("var/windows-i686") %]'
enable: '[% !c("var/android") && c("var/nightly") %]'
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment