Merge branch 'master' into epel7

This commit is contained in:
Josh Stone 2018-02-16 11:30:59 -08:00
commit 099c0af3b5
10 changed files with 700 additions and 32 deletions

8
.gitignore vendored
View File

@ -99,3 +99,11 @@
/rust-1.22.0-powerpc64-unknown-linux-gnu.tar.xz
/rust-1.22.0-s390x-unknown-linux-gnu.tar.xz
/rust-1.22.0-x86_64-unknown-linux-gnu.tar.xz
/rustc-1.24.0-src.tar.xz
/rust-1.23.0-aarch64-unknown-linux-gnu.tar.xz
/rust-1.23.0-armv7-unknown-linux-gnueabihf.tar.xz
/rust-1.23.0-i686-unknown-linux-gnu.tar.xz
/rust-1.23.0-powerpc64le-unknown-linux-gnu.tar.xz
/rust-1.23.0-powerpc64-unknown-linux-gnu.tar.xz
/rust-1.23.0-s390x-unknown-linux-gnu.tar.xz
/rust-1.23.0-x86_64-unknown-linux-gnu.tar.xz

View File

@ -0,0 +1,67 @@
From 8a1f3d066d9c6f97a55958f8d638ae98957e8962 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Tue, 30 Jan 2018 16:47:30 -0800
Subject: [PATCH 1/2] Enable stack-probe tests with system LLVM >= 5.0
---
src/test/codegen/stack-probes.rs | 2 +-
src/test/run-pass/stack-probes-lto.rs | 2 +-
src/test/run-pass/stack-probes.rs | 2 +-
src/tools/compiletest/src/header.rs | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/test/codegen/stack-probes.rs b/src/test/codegen/stack-probes.rs
index 5b26dade9aff..4a489f1edb3b 100644
--- a/src/test/codegen/stack-probes.rs
+++ b/src/test/codegen/stack-probes.rs
@@ -15,7 +15,7 @@
// ignore-wasm
// ignore-emscripten
// ignore-windows
-// no-system-llvm
+// min-system-llvm-version 5.0
// compile-flags: -C no-prepopulate-passes
#![crate_type = "lib"]
diff --git a/src/test/run-pass/stack-probes-lto.rs b/src/test/run-pass/stack-probes-lto.rs
index 78a1019578e3..33d4c63582e8 100644
--- a/src/test/run-pass/stack-probes-lto.rs
+++ b/src/test/run-pass/stack-probes-lto.rs
@@ -14,7 +14,7 @@
// ignore-emscripten no processes
// ignore-musl FIXME #31506
// ignore-pretty
-// no-system-llvm
+// min-system-llvm-version 5.0
// compile-flags: -C lto
// no-prefer-dynamic
diff --git a/src/test/run-pass/stack-probes.rs b/src/test/run-pass/stack-probes.rs
index bb9471e1b48b..6fbb85dda15a 100644
--- a/src/test/run-pass/stack-probes.rs
+++ b/src/test/run-pass/stack-probes.rs
@@ -13,7 +13,7 @@
// ignore-wasm
// ignore-emscripten no processes
// ignore-musl FIXME #31506
-// no-system-llvm
+// min-system-llvm-version 5.0
use std::mem;
use std::process::Command;
diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs
index 1f736e33c8b2..6908f3b5cf28 100644
--- a/src/tools/compiletest/src/header.rs
+++ b/src/tools/compiletest/src/header.rs
@@ -163,7 +163,7 @@ impl EarlyProps {
.expect("Malformed llvm version directive");
// Ignore if using system LLVM and actual version
// is smaller the minimum required version
- !(config.system_llvm && &actual_version[..] < min_version)
+ config.system_llvm && &actual_version[..] < min_version
} else {
false
}
--
2.14.3

View File

@ -0,0 +1,57 @@
From 327c3d06258576cc9d9f2e5c0861abc72ebd10ef Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Fri, 2 Feb 2018 16:23:04 -0800
Subject: [PATCH] Fix -Wcatch-value from GCC 8
These instances may simply be caught by reference instead.
---
src/tools/asm2wasm.cpp | 2 +-
src/tools/s2wasm.cpp | 2 +-
src/wasm/wasm-s-parser.cpp | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp
index 75a2c4d15e2e..6d14067d240f 100644
--- a/src/tools/asm2wasm.cpp
+++ b/src/tools/asm2wasm.cpp
@@ -87,7 +87,7 @@ int main(int argc, const char *argv[]) {
[&trapMode](Options *o, const std::string &argument) {
try {
trapMode = trapModeFromString(argument);
- } catch (std::invalid_argument e) {
+ } catch (std::invalid_argument &e) {
std::cerr << "Error: " << e.what() << "\n";
exit(EXIT_FAILURE);
}
diff --git a/src/tools/s2wasm.cpp b/src/tools/s2wasm.cpp
index 32af57dba5bf..c5e1d52b8d96 100644
--- a/src/tools/s2wasm.cpp
+++ b/src/tools/s2wasm.cpp
@@ -92,7 +92,7 @@ int main(int argc, const char *argv[]) {
[&trapMode](Options *o, const std::string &argument) {
try {
trapMode = trapModeFromString(argument);
- } catch (std::invalid_argument e) {
+ } catch (std::invalid_argument &e) {
std::cerr << "Error: " << e.what() << "\n";
exit(EXIT_FAILURE);
}
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index 0de3edf3f6b4..78a150f8146c 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -1408,9 +1408,9 @@ Name SExpressionWasmBuilder::getLabel(Element& s) {
uint64_t offset;
try {
offset = std::stoll(s.c_str(), nullptr, 0);
- } catch (std::invalid_argument) {
+ } catch (std::invalid_argument&) {
throw ParseException("invalid break offset");
- } catch (std::out_of_range) {
+ } catch (std::out_of_range&) {
throw ParseException("out of range break offset");
}
if (offset > nameMapper.labelStack.size()) throw ParseException("invalid label", s.line, s.col);
--
2.14.3

View File

@ -0,0 +1,27 @@
From ebca82f1fc8103830727bda970468ca8eae55d82 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Tue, 30 Jan 2018 10:18:54 -0800
Subject: [PATCH] Ignore run-pass/sse2 when using system LLVM
This is a test of `target_feature`, which needs a rust-specific patch to
LLVM to add `MCSubtargetInfo::getFeatureTable()`.
---
src/test/run-pass/sse2.rs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/run-pass/sse2.rs b/src/test/run-pass/sse2.rs
index c27f83011cb1..858a53cb3836 100644
--- a/src/test/run-pass/sse2.rs
+++ b/src/test/run-pass/sse2.rs
@@ -7,7 +7,7 @@
// <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.
-// min-llvm-version 4.0
+// no-system-llvm -- needs MCSubtargetInfo::getFeatureTable()
#![feature(cfg_target_feature)]
--
2.14.3

View File

@ -0,0 +1,53 @@
From 7eb7d45c0b0a9dc0454c5f3a3c5e911c7900bbea Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Tue, 23 Jan 2018 13:53:01 -0800
Subject: [PATCH] Let LLVM 5 add DW_OP_deref to indirect args itself
We needed to manually added the `DW_OP_deref` ourselves in earlier LLVM,
but starting with [D31439] in LLVM 5, it appears that LLVM will always
handle this itself. When we were still adding this manually, the
resulting `.debug_loc` had too many derefs, and this failed test
`debuginfo/by-value-self-argument-in-trait-impl.rs`.
[D31439]: https://reviews.llvm.org/D31439
Fixes #47611.
cc @alexcrichton
r? @michaelwoerister
---
src/librustc_trans/mir/mod.rs | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/src/librustc_trans/mir/mod.rs b/src/librustc_trans/mir/mod.rs
index b367eb6548d0..da01592d9118 100644
--- a/src/librustc_trans/mir/mod.rs
+++ b/src/librustc_trans/mir/mod.rs
@@ -487,16 +487,18 @@ fn arg_local_refs<'a, 'tcx>(bx: &Builder<'a, 'tcx>,
// The Rust ABI passes indirect variables using a pointer and a manual copy, so we
// need to insert a deref here, but the C ABI uses a pointer and a copy using the
// byval attribute, for which LLVM does the deref itself, so we must not add it.
+ // Starting with D31439 in LLVM 5, it *always* does the deref itself.
let mut variable_access = VariableAccess::DirectVariable {
alloca: place.llval
};
-
- if let PassMode::Indirect(ref attrs) = arg.mode {
- if !attrs.contains(ArgAttribute::ByVal) {
- variable_access = VariableAccess::IndirectVariable {
- alloca: place.llval,
- address_operations: &deref_op,
- };
+ if unsafe { llvm::LLVMRustVersionMajor() < 5 } {
+ if let PassMode::Indirect(ref attrs) = arg.mode {
+ if !attrs.contains(ArgAttribute::ByVal) {
+ variable_access = VariableAccess::IndirectVariable {
+ alloca: place.llval,
+ address_operations: &deref_op,
+ };
+ }
}
}
--
2.14.3

View File

@ -0,0 +1,67 @@
From e2f6b280ea13e48bff86254549988e61eee37139 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Fri, 19 Jan 2018 21:43:53 -0800
Subject: [PATCH] Update DW_OP_plus to DW_OP_plus_uconst
LLVM <= 4.0 used a non-standard interpretation of `DW_OP_plus`. In the
DWARF standard, this adds two items on the expressions stack. LLVM's
behavior was more like DWARF's `DW_OP_plus_uconst` -- adding a constant
that follows the op. The patch series starting with [D33892] switched
to the standard DWARF interpretation, so we need to follow.
[D33892]: https://reviews.llvm.org/D33892
---
src/librustc_llvm/ffi.rs | 2 +-
src/librustc_trans/mir/mod.rs | 2 +-
src/rustllvm/RustWrapper.cpp | 9 ++++++++-
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/librustc_llvm/ffi.rs b/src/librustc_llvm/ffi.rs
index b97e37f4c8fb..f51e51a88b10 100644
--- a/src/librustc_llvm/ffi.rs
+++ b/src/librustc_llvm/ffi.rs
@@ -1546,7 +1546,7 @@ extern "C" {
InlinedAt: MetadataRef)
-> ValueRef;
pub fn LLVMRustDIBuilderCreateOpDeref() -> i64;
- pub fn LLVMRustDIBuilderCreateOpPlus() -> i64;
+ pub fn LLVMRustDIBuilderCreateOpPlusUconst() -> i64;
pub fn LLVMRustWriteTypeToString(Type: TypeRef, s: RustStringRef);
pub fn LLVMRustWriteValueToString(value_ref: ValueRef, s: RustStringRef);
diff --git a/src/librustc_trans/mir/mod.rs b/src/librustc_trans/mir/mod.rs
index 3064e2f7c7af..b367eb6548d0 100644
--- a/src/librustc_trans/mir/mod.rs
+++ b/src/librustc_trans/mir/mod.rs
@@ -547,7 +547,7 @@ fn arg_local_refs<'a, 'tcx>(bx: &Builder<'a, 'tcx>,
let ops = unsafe {
[llvm::LLVMRustDIBuilderCreateOpDeref(),
- llvm::LLVMRustDIBuilderCreateOpPlus(),
+ llvm::LLVMRustDIBuilderCreateOpPlusUconst(),
byte_offset_of_var_in_env as i64,
llvm::LLVMRustDIBuilderCreateOpDeref()]
};
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index 95130d596e16..0fe533d447bc 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -866,7 +866,14 @@ extern "C" int64_t LLVMRustDIBuilderCreateOpDeref() {
return dwarf::DW_OP_deref;
}
-extern "C" int64_t LLVMRustDIBuilderCreateOpPlus() { return dwarf::DW_OP_plus; }
+extern "C" int64_t LLVMRustDIBuilderCreateOpPlusUconst() {
+#if LLVM_VERSION_GE(5, 0)
+ return dwarf::DW_OP_plus_uconst;
+#else
+ // older LLVM used `plus` to behave like `plus_uconst`.
+ return dwarf::DW_OP_plus;
+#endif
+}
extern "C" void LLVMRustWriteTypeToString(LLVMTypeRef Ty, RustStringRef Str) {
RawRustStringOstream OS(Str);
--
2.14.3

View File

@ -0,0 +1,341 @@
From 36fcfd117373283de7c052cf361a705d611d47fa Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Wed, 31 Jan 2018 11:41:29 -0800
Subject: [PATCH 2/2] Use a range to identify SIGSEGV in stack guards
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Previously, the `guard::init()` and `guard::current()` functions were
returning a `usize` address representing the top of the stack guard,
respectively for the main thread and for spawned threads. The `SIGSEGV`
handler on `unix` targets checked if a fault was within one page below
that address, if so reporting it as a stack overflow.
Now `unix` targets report a `Range<usize>` representing the guard
memory, so it can cover arbitrary guard sizes. Non-`unix` targets which
always return `None` for guards now do so with `Option<!>`, so they
don't pay any overhead.
For `linux-gnu` in particular, the previous guard upper-bound was
`stackaddr + guardsize`, as the protected memory was *inside* the stack.
This was a glibc bug, and starting from 2.27 they are moving the guard
*past* the end of the stack. However, there's no simple way for us to
know where the guard page actually lies, so now we declare it as the
whole range of `stackaddr ± guardsize`, and any fault therein will be
called a stack overflow. This fixes #47863.
---
src/libstd/sys/redox/thread.rs | 5 +-
src/libstd/sys/unix/stack_overflow.rs | 9 +--
src/libstd/sys/unix/thread.rs | 115 +++++++++++++++++++++-------------
src/libstd/sys/wasm/thread.rs | 5 +-
src/libstd/sys/windows/thread.rs | 5 +-
src/libstd/sys_common/thread_info.rs | 9 +--
6 files changed, 86 insertions(+), 62 deletions(-)
diff --git a/src/libstd/sys/redox/thread.rs b/src/libstd/sys/redox/thread.rs
index c4aad8d86f8b..c4719a94c7e9 100644
--- a/src/libstd/sys/redox/thread.rs
+++ b/src/libstd/sys/redox/thread.rs
@@ -88,6 +88,7 @@ impl Thread {
}
pub mod guard {
- pub unsafe fn current() -> Option<usize> { None }
- pub unsafe fn init() -> Option<usize> { None }
+ pub type Guard = !;
+ pub unsafe fn current() -> Option<Guard> { None }
+ pub unsafe fn init() -> Option<Guard> { None }
}
diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs
index 51adbc24ae04..40453f9b8a15 100644
--- a/src/libstd/sys/unix/stack_overflow.rs
+++ b/src/libstd/sys/unix/stack_overflow.rs
@@ -57,9 +57,6 @@ mod imp {
use sys_common::thread_info;
- // This is initialized in init() and only read from after
- static mut PAGE_SIZE: usize = 0;
-
#[cfg(any(target_os = "linux", target_os = "android"))]
unsafe fn siginfo_si_addr(info: *mut libc::siginfo_t) -> usize {
#[repr(C)]
@@ -102,12 +99,12 @@ mod imp {
_data: *mut libc::c_void) {
use sys_common::util::report_overflow;
- let guard = thread_info::stack_guard().unwrap_or(0);
+ let guard = thread_info::stack_guard().unwrap_or(0..0);
let addr = siginfo_si_addr(info);
// If the faulting address is within the guard page, then we print a
// message saying so and abort.
- if guard != 0 && guard - PAGE_SIZE <= addr && addr < guard {
+ if guard.start <= addr && addr < guard.end {
report_overflow();
rtabort!("stack overflow");
} else {
@@ -123,8 +120,6 @@ mod imp {
static mut MAIN_ALTSTACK: *mut libc::c_void = ptr::null_mut();
pub unsafe fn init() {
- PAGE_SIZE = ::sys::os::page_size();
-
let mut action: sigaction = mem::zeroed();
action.sa_flags = SA_SIGINFO | SA_ONSTACK;
action.sa_sigaction = signal_handler as sighandler_t;
diff --git a/src/libstd/sys/unix/thread.rs b/src/libstd/sys/unix/thread.rs
index cb249af42540..72cdb9440b8e 100644
--- a/src/libstd/sys/unix/thread.rs
+++ b/src/libstd/sys/unix/thread.rs
@@ -205,8 +205,10 @@ impl Drop for Thread {
not(target_os = "solaris")))]
#[cfg_attr(test, allow(dead_code))]
pub mod guard {
- pub unsafe fn current() -> Option<usize> { None }
- pub unsafe fn init() -> Option<usize> { None }
+ use ops::Range;
+ pub type Guard = Range<usize>;
+ pub unsafe fn current() -> Option<Guard> { None }
+ pub unsafe fn init() -> Option<Guard> { None }
}
@@ -222,14 +224,43 @@ pub mod guard {
use libc;
use libc::mmap;
use libc::{PROT_NONE, MAP_PRIVATE, MAP_ANON, MAP_FAILED, MAP_FIXED};
+ use ops::Range;
use sys::os;
- #[cfg(any(target_os = "macos",
- target_os = "bitrig",
- target_os = "openbsd",
- target_os = "solaris"))]
+ // This is initialized in init() and only read from after
+ static mut PAGE_SIZE: usize = 0;
+
+ pub type Guard = Range<usize>;
+
+ #[cfg(target_os = "solaris")]
+ unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
+ let mut current_stack: libc::stack_t = ::mem::zeroed();
+ assert_eq!(libc::stack_getbounds(&mut current_stack), 0);
+ Some(current_stack.ss_sp)
+ }
+
+ #[cfg(target_os = "macos")]
unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
- current().map(|s| s as *mut libc::c_void)
+ let stackaddr = libc::pthread_get_stackaddr_np(libc::pthread_self()) as usize -
+ libc::pthread_get_stacksize_np(libc::pthread_self());
+ Some(stackaddr as *mut libc::c_void)
+ }
+
+ #[cfg(any(target_os = "openbsd", target_os = "bitrig"))]
+ unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
+ let mut current_stack: libc::stack_t = ::mem::zeroed();
+ assert_eq!(libc::pthread_stackseg_np(libc::pthread_self(),
+ &mut current_stack), 0);
+
+ let extra = if cfg!(target_os = "bitrig") {3} else {1} * PAGE_SIZE;
+ let stackaddr = if libc::pthread_main_np() == 1 {
+ // main thread
+ current_stack.ss_sp as usize - current_stack.ss_size + extra
+ } else {
+ // new thread
+ current_stack.ss_sp as usize - current_stack.ss_size
+ };
+ Some(stackaddr as *mut libc::c_void)
}
#[cfg(any(target_os = "android", target_os = "freebsd",
@@ -253,8 +284,9 @@ pub mod guard {
ret
}
- pub unsafe fn init() -> Option<usize> {
- let psize = os::page_size();
+ pub unsafe fn init() -> Option<Guard> {
+ PAGE_SIZE = os::page_size();
+
let mut stackaddr = get_stack_start()?;
// Ensure stackaddr is page aligned! A parent process might
@@ -263,9 +295,9 @@ pub mod guard {
// stackaddr < stackaddr + stacksize, so if stackaddr is not
// page-aligned, calculate the fix such that stackaddr <
// new_page_aligned_stackaddr < stackaddr + stacksize
- let remainder = (stackaddr as usize) % psize;
+ let remainder = (stackaddr as usize) % PAGE_SIZE;
if remainder != 0 {
- stackaddr = ((stackaddr as usize) + psize - remainder)
+ stackaddr = ((stackaddr as usize) + PAGE_SIZE - remainder)
as *mut libc::c_void;
}
@@ -280,60 +312,42 @@ pub mod guard {
// Instead, we'll just note where we expect rlimit to start
// faulting, so our handler can report "stack overflow", and
// trust that the kernel's own stack guard will work.
- Some(stackaddr as usize)
+ let stackaddr = stackaddr as usize;
+ Some(stackaddr - PAGE_SIZE..stackaddr)
} else {
// Reallocate the last page of the stack.
// This ensures SIGBUS will be raised on
// stack overflow.
- let result = mmap(stackaddr, psize, PROT_NONE,
+ let result = mmap(stackaddr, PAGE_SIZE, PROT_NONE,
MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
if result != stackaddr || result == MAP_FAILED {
panic!("failed to allocate a guard page");
}
+ let guardaddr = stackaddr as usize;
let offset = if cfg!(target_os = "freebsd") {
2
} else {
1
};
- Some(stackaddr as usize + offset * psize)
+ Some(guardaddr..guardaddr + offset * PAGE_SIZE)
}
}
- #[cfg(target_os = "solaris")]
- pub unsafe fn current() -> Option<usize> {
- let mut current_stack: libc::stack_t = ::mem::zeroed();
- assert_eq!(libc::stack_getbounds(&mut current_stack), 0);
- Some(current_stack.ss_sp as usize)
- }
-
- #[cfg(target_os = "macos")]
- pub unsafe fn current() -> Option<usize> {
- Some((libc::pthread_get_stackaddr_np(libc::pthread_self()) as usize -
- libc::pthread_get_stacksize_np(libc::pthread_self())))
- }
-
- #[cfg(any(target_os = "openbsd", target_os = "bitrig"))]
- pub unsafe fn current() -> Option<usize> {
- let mut current_stack: libc::stack_t = ::mem::zeroed();
- assert_eq!(libc::pthread_stackseg_np(libc::pthread_self(),
- &mut current_stack), 0);
-
- let extra = if cfg!(target_os = "bitrig") {3} else {1} * os::page_size();
- Some(if libc::pthread_main_np() == 1 {
- // main thread
- current_stack.ss_sp as usize - current_stack.ss_size + extra
- } else {
- // new thread
- current_stack.ss_sp as usize - current_stack.ss_size
- })
+ #[cfg(any(target_os = "macos",
+ target_os = "bitrig",
+ target_os = "openbsd",
+ target_os = "solaris"))]
+ pub unsafe fn current() -> Option<Guard> {
+ let stackaddr = get_stack_start()? as usize;
+ Some(stackaddr - PAGE_SIZE..stackaddr)
}
#[cfg(any(target_os = "android", target_os = "freebsd",
target_os = "linux", target_os = "netbsd", target_os = "l4re"))]
- pub unsafe fn current() -> Option<usize> {
+ pub unsafe fn current() -> Option<Guard> {
let mut ret = None;
let mut attr: libc::pthread_attr_t = ::mem::zeroed();
assert_eq!(libc::pthread_attr_init(&mut attr), 0);
@@ -352,12 +366,23 @@ pub mod guard {
assert_eq!(libc::pthread_attr_getstack(&attr, &mut stackaddr,
&mut size), 0);
+ let stackaddr = stackaddr as usize;
ret = if cfg!(target_os = "freebsd") {
- Some(stackaddr as usize - guardsize)
+ // FIXME does freebsd really fault *below* the guard addr?
+ let guardaddr = stackaddr - guardsize;
+ Some(guardaddr - PAGE_SIZE..guardaddr)
} else if cfg!(target_os = "netbsd") {
- Some(stackaddr as usize)
+ Some(stackaddr - guardsize..stackaddr)
+ } else if cfg!(all(target_os = "linux", target_env = "gnu")) {
+ // glibc used to include the guard area within the stack, as noted in the BUGS
+ // section of `man pthread_attr_getguardsize`. This has been corrected starting
+ // with glibc 2.27, and in some distro backports, so the guard is now placed at the
+ // end (below) the stack. There's no easy way for us to know which we have at
+ // runtime, so we'll just match any fault in the range right above or below the
+ // stack base to call that fault a stack overflow.
+ Some(stackaddr - guardsize..stackaddr + guardsize)
} else {
- Some(stackaddr as usize + guardsize)
+ Some(stackaddr..stackaddr + guardsize)
};
}
assert_eq!(libc::pthread_attr_destroy(&mut attr), 0);
diff --git a/src/libstd/sys/wasm/thread.rs b/src/libstd/sys/wasm/thread.rs
index 13980e0cc19d..6a066509b492 100644
--- a/src/libstd/sys/wasm/thread.rs
+++ b/src/libstd/sys/wasm/thread.rs
@@ -43,6 +43,7 @@ impl Thread {
}
pub mod guard {
- pub unsafe fn current() -> Option<usize> { None }
- pub unsafe fn init() -> Option<usize> { None }
+ pub type Guard = !;
+ pub unsafe fn current() -> Option<Guard> { None }
+ pub unsafe fn init() -> Option<Guard> { None }
}
diff --git a/src/libstd/sys/windows/thread.rs b/src/libstd/sys/windows/thread.rs
index 74786d092855..43abfbb1f645 100644
--- a/src/libstd/sys/windows/thread.rs
+++ b/src/libstd/sys/windows/thread.rs
@@ -93,6 +93,7 @@ impl Thread {
#[cfg_attr(test, allow(dead_code))]
pub mod guard {
- pub unsafe fn current() -> Option<usize> { None }
- pub unsafe fn init() -> Option<usize> { None }
+ pub type Guard = !;
+ pub unsafe fn current() -> Option<Guard> { None }
+ pub unsafe fn init() -> Option<Guard> { None }
}
diff --git a/src/libstd/sys_common/thread_info.rs b/src/libstd/sys_common/thread_info.rs
index 7970042b1d67..6a2b6742367a 100644
--- a/src/libstd/sys_common/thread_info.rs
+++ b/src/libstd/sys_common/thread_info.rs
@@ -11,10 +11,11 @@
#![allow(dead_code)] // stack_guard isn't used right now on all platforms
use cell::RefCell;
+use sys::thread::guard::Guard;
use thread::Thread;
struct ThreadInfo {
- stack_guard: Option<usize>,
+ stack_guard: Option<Guard>,
thread: Thread,
}
@@ -38,11 +39,11 @@ pub fn current_thread() -> Option<Thread> {
ThreadInfo::with(|info| info.thread.clone())
}
-pub fn stack_guard() -> Option<usize> {
- ThreadInfo::with(|info| info.stack_guard).and_then(|o| o)
+pub fn stack_guard() -> Option<Guard> {
+ ThreadInfo::with(|info| info.stack_guard.clone()).and_then(|o| o)
}
-pub fn set(stack_guard: Option<usize>, thread: Thread) {
+pub fn set(stack_guard: Option<Guard>, thread: Thread) {
THREAD_INFO.with(|c| assert!(c.borrow().is_none()));
THREAD_INFO.with(move |c| *c.borrow_mut() = Some(ThreadInfo{
stack_guard,
--
2.14.3

View File

@ -8,10 +8,10 @@
# To bootstrap from scratch, set the channel and date from src/stage0.txt
# e.g. 1.10.0 wants rustc: 1.9.0-2016-05-24
# or nightly wants some beta-YYYY-MM-DD
%global bootstrap_rust 1.22.0
%global bootstrap_cargo 0.23.0
%global bootstrap_rust 1.23.0
%global bootstrap_cargo 0.24.0
%global bootstrap_channel %{bootstrap_rust}
%global bootstrap_date 2017-11-22
%global bootstrap_date 2018-01-04
# Only the specified arches will use bootstrap binaries.
#global bootstrap_arches %%{rust_arches}
@ -25,7 +25,7 @@
%bcond_with llvm_static
# We can also choose to just use Rust's bundled LLVM, in case the system LLVM
# is insufficient. Rust currently requires LLVM 3.7+.
# is insufficient. Rust currently requires LLVM 3.9+.
%if 0%{?rhel} && !0%{?epel}
%bcond_without bundled_llvm
%else
@ -47,7 +47,7 @@
Name: rust
Version: 1.23.0
Version: 1.24.0
Release: 1%{?dist}
Summary: The Rust Programming Language
License: (ASL 2.0 or MIT) and (BSD and ISC and MIT)
@ -62,7 +62,23 @@ ExclusiveArch: %{rust_arches}
%endif
Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.xz
Patch1: binaryen-cmake-aarch64.patch
# https://github.com/WebAssembly/binaryen/pull/1400
Patch1: 0001-Fix-Wcatch-value-from-GCC-8.patch
# https://github.com/rust-lang/rust/pull/47610
Patch2: 0001-Update-DW_OP_plus-to-DW_OP_plus_uconst.patch
# https://github.com/rust-lang/rust/pull/47688
Patch3: 0001-Let-LLVM-5-add-DW_OP_deref-to-indirect-args-itself.patch
# https://github.com/rust-lang/rust/pull/47884
Patch4: 0001-Ignore-run-pass-sse2-when-using-system-LLVM.patch
# https://github.com/rust-lang/rust/pull/47912
Patch5: 0001-Enable-stack-probe-tests-with-system-LLVM-5.0.patch
Patch6: 0002-Use-a-range-to-identify-SIGSEGV-in-stack-guards.patch
Patch100: binaryen-cmake-aarch64.patch
# Get the Rust triple for any arch.
%{lua: function rust_triple(arch)
@ -117,19 +133,22 @@ BuildRequires: gcc
BuildRequires: gcc-c++
BuildRequires: ncurses-devel
BuildRequires: zlib-devel
BuildRequires: python2
BuildRequires: curl
%if 0%{?rhel} && 0%{?rhel} <= 7
%global python python2
%else
%global python python3
%endif
BuildRequires: %{python}
%if %with bundled_llvm
BuildRequires: cmake3 >= 3.4.3
Provides: bundled(llvm) = 4.0
%else
BuildRequires: cmake >= 2.8.7
%if 0%{?epel}
%global llvm llvm3.9
%endif
%if 0%{?fedora} >= 27
%global llvm llvm4.0
%if 0%{?epel} || 0%{?fedora} >= 28
%global llvm llvm5.0
%endif
%if %defined llvm
%global llvm_root %{_libdir}/%{llvm}
@ -154,10 +173,10 @@ BuildRequires: procps-ng
BuildRequires: gdb
# TODO: work on unbundling these!
Provides: bundled(hoedown) = 3.0.5
Provides: bundled(hoedown) = 3.0.7
Provides: bundled(jquery) = 2.1.4
Provides: bundled(libbacktrace) = 6.1.0
Provides: bundled(miniz) = 1.14
Provides: bundled(miniz) = 1.16~beta+r1
# Virtual provides for folks who attempt "dnf install rustc"
Provides: rustc = %{version}-%{release}
@ -241,7 +260,7 @@ Summary: LLDB pretty printers for Rust
#BuildArch: noarch
Requires: lldb
Requires: python-lldb
Requires: python2-lldb
Requires: %{name}-debugger-common = %{version}-%{release}
%description lldb
@ -285,9 +304,20 @@ test -f '%{local_rust_root}/bin/rustc'
%setup -q -n %{rustc_package}
pushd src/binaryen
%patch1 -p1 -b.aarch64
%patch1 -p1 -b .catch-value
%patch100 -p1 -b .aarch64
popd
%patch2 -p1 -b .DW_OP_plus_uconst
%patch3 -p1 -b .DW_OP_deref
%patch4 -p1 -b .sse2
%patch5 -p1 -b .out-of-stack
%patch6 -p1 -b .out-of-stack
%if "%{python}" == "python3"
sed -i.try-py3 -e '/try python2.7/i try python3 "$@"' ./configure
%endif
# We're disabling jemalloc, but rust-src still wants it.
# rm -rf src/jemalloc/
@ -344,6 +374,10 @@ find src/vendor -name .cargo-checksum.json \
%define enable_debuginfo --enable-debuginfo --disable-debuginfo-only-std --disable-debuginfo-lines
%endif
# NB: full bootstrap is needed because of a bug in local_rebuild:
# https://github.com/rust-lang/rust/issues/47469
# (should be fixed in rust-1.25)
%configure --disable-option-checking \
--libdir=%{common_libdir} \
--build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \
@ -354,10 +388,11 @@ find src/vendor -name .cargo-checksum.json \
--disable-rpath \
%{enable_debuginfo} \
--enable-vendor \
--enable-full-bootstrap \
--release-channel=%{channel}
./x.py build
./x.py doc
%{python} ./x.py build
%{python} ./x.py doc
%install
@ -365,8 +400,8 @@ find src/vendor -name .cargo-checksum.json \
%{?library_path:export LIBRARY_PATH="%{library_path}"}
%{?rustflags:export RUSTFLAGS="%{rustflags}"}
DESTDIR=%{buildroot} ./x.py install
DESTDIR=%{buildroot} ./x.py install src
DESTDIR=%{buildroot} %{python} ./x.py install
DESTDIR=%{buildroot} %{python} ./x.py install src
# Make sure the shared libraries are in the proper libdir
@ -415,11 +450,10 @@ rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py*
%{?rustflags:export RUSTFLAGS="%{rustflags}"}
# The results are not stable on koji, so mask errors and just log it.
./x.py test --no-fail-fast || :
%{python} ./x.py test --no-fail-fast || :
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%ldconfig_scriptlets
%files
@ -481,6 +515,20 @@ rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py*
%changelog
* Thu Feb 15 2018 Josh Stone <jistone@redhat.com> - 1.24.0-1
- Update to 1.24.0.
* Mon Feb 12 2018 Iryna Shcherbina <ishcherb@redhat.com> - 1.23.0-4
- Update Python 2 dependency declarations to new packaging standards
(See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3)
* Tue Feb 06 2018 Josh Stone <jistone@redhat.com> - 1.23.0-3
- Use full-bootstrap to work around a rebuild issue.
- Patch binaryen for GCC 8
* Thu Feb 01 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.23.0-2
- Switch to %%ldconfig_scriptlets
* Mon Jan 08 2018 Josh Stone <jistone@redhat.com> - 1.23.0-1
- Update to 1.23.0.

View File

@ -1 +1 @@
SHA512 (rustc-1.23.0-src.tar.xz) = 2e605121dd5152c1a898b263d634b0ac55c7ea79c7fbc9f72c432e68fb397618a267283f3dfb0f77d5e189720d788b1937e8114a1f71bdb10ddd4cbaae92fa80
SHA512 (rustc-1.24.0-src.tar.xz) = 211d9651fecb2772e626eba8fe91f9b05d1f3b732f01d00fb752016dac5f92da7abd3a98212bb439386de55c37873d2d2773f4ecfa071f46e45745f4b69f9eac

View File

@ -1,8 +1,8 @@
SHA512 (rustc-1.23.0-src.tar.xz) = 2e605121dd5152c1a898b263d634b0ac55c7ea79c7fbc9f72c432e68fb397618a267283f3dfb0f77d5e189720d788b1937e8114a1f71bdb10ddd4cbaae92fa80
SHA512 (rust-1.22.0-aarch64-unknown-linux-gnu.tar.xz) = 9fbf60153e375746d665e23a273ea3bd9c0fc5f3116bb40dcfb385d8d519f67a07712f0b28371854b2d00f4bcd8e174f6182d3c3fbfd88c9901fff4d59f117b5
SHA512 (rust-1.22.0-armv7-unknown-linux-gnueabihf.tar.xz) = 2deeca2cc96506b270c54395c2f4a9f649c06d1042f51947fab1048092f746c6f9aa5025a5d322f5a1591675d21438496de72ea389270e89c7f3e98a11b14dae
SHA512 (rust-1.22.0-i686-unknown-linux-gnu.tar.xz) = 76aa4dbbfd4c1a9efe84c2cb062462747d41caed505aebad3e51cd8ce9fa4470a06640fc202a6d46dc17c31e7f2b396442b15c3ae5462d6de19dd65a5d544603
SHA512 (rust-1.22.0-powerpc64le-unknown-linux-gnu.tar.xz) = 9bce8585933a843b3703bd2f3fe7420ec81730b38d8d0d2418178eed7c6bf51d15979ddbd21f598615ac54cc73d3a943a535b6bf5d62627027c8edbe04c1d1d7
SHA512 (rust-1.22.0-powerpc64-unknown-linux-gnu.tar.xz) = a11261081626d87b5cdf6b7c6fdce4ebadcfa42550dfcf6fe149a3af2e6f99b81aa71de46096a3744f9dd96e0d1c33c0b8c89384b41f059e556b4880b74f3618
SHA512 (rust-1.22.0-s390x-unknown-linux-gnu.tar.xz) = a61bf086fbdec4c444420e0562969ed37bc0fa00e864ac5eccb13fc13e3dd9a36da3ac6a036143f4e1f3b04dcdab22f971558cfa23327fc789e31f9bb69e062b
SHA512 (rust-1.22.0-x86_64-unknown-linux-gnu.tar.xz) = d3be6fbed7e421a454b819ae14b1ab1de0930f00bea510f78f080cfd0ae12e5675c874d89d699a9af7f1a4cc0859c43a84a072d03d40204d6e3c43ea284276b7
SHA512 (rustc-1.24.0-src.tar.xz) = 211d9651fecb2772e626eba8fe91f9b05d1f3b732f01d00fb752016dac5f92da7abd3a98212bb439386de55c37873d2d2773f4ecfa071f46e45745f4b69f9eac
SHA512 (rust-1.23.0-aarch64-unknown-linux-gnu.tar.xz) = 1d0fbf800a5ede9101570507d6cca4ef79445f2df3ace194ce74702eb507d7de5fe7f4a30dd5e5561faa2bfa205c237dee98eca6eefc8b652d21c0c373099ca6
SHA512 (rust-1.23.0-armv7-unknown-linux-gnueabihf.tar.xz) = 2ef07187d78060005e99676cf1f168e7a8861e9f104c95056cfe8784a7fa35b14f0b69ba4adc8be4173ef8d4ce7554f92487385a09602343ab65fcf749fbe35c
SHA512 (rust-1.23.0-i686-unknown-linux-gnu.tar.xz) = 6863a512100ae0369d0a5c4242d45fda9b83a2ad6c3e6691f4f0d1e071dca7003c55873cc03a9d09305adae24667e654bda66a8ad3246f4df2d7a2fc0fc4d7a7
SHA512 (rust-1.23.0-powerpc64le-unknown-linux-gnu.tar.xz) = d17acdbed5d7007fade8d85492d1f6f3d46bb63f98d76e0313967175d6be0752d4643a26d8e3a1319e7f7782117ccbb76c6c891f9bb3cf3e6e2ab0f61d63574d
SHA512 (rust-1.23.0-powerpc64-unknown-linux-gnu.tar.xz) = 19b7e734741fbe1318fffbd3698d3d208fbe978698d8f8e8b9f136d4f954821e94bec0979d4d3871e49acd589c67c0457f9320ac69fabea70a6839c2928c8d2a
SHA512 (rust-1.23.0-s390x-unknown-linux-gnu.tar.xz) = c47e4750b02ffd7ffc423db12e8974d16384187938f5ab263a23cedb17f4b27a08acbc927365a1a23b4ee1b12e3ce2f15fdc059b6fe3932ef61798747cb9ddf7
SHA512 (rust-1.23.0-x86_64-unknown-linux-gnu.tar.xz) = a5a3aa11d04e81305d33ed50fe657dcebb8c3a1f71a0a2b54372439ff6b1b4b7d2abd9c579b27950be67921cbb41586346824faf71495fb4f3f505ed8a48ccc9