Commit Graph

951 Commits

Author SHA1 Message Date
Alex Crichton
c3a5d6b130 std: Minimize size of panicking on wasm
This commit applies a few code size optimizations for the wasm target to
the standard library, namely around panics. We notably know that in most
configurations it's impossible for us to print anything in
wasm32-unknown-unknown so we can skip larger portions of panicking that
are otherwise simply informative. This allows us to get quite a nice
size reduction.

Finally we can also tweak where the allocation happens for the
`Box<Any>` that we panic with. By only allocating once unwinding starts
we can reduce the size of a panicking wasm module from 44k to 350 bytes.
2018-04-13 07:03:00 -07:00
Simon Sapin
1b895d8b88 Import the alloc crate as alloc_crate in std
… to make the name `alloc` available.
2018-04-12 22:52:47 +02:00
Simon Sapin
f87d4a15a8 Move Utf8Lossy decoder to libcore 2018-04-12 00:13:43 +02:00
varkor
7ab31f6556 Prevent EPIPE causing ICEs in rustc and rustdoc 2018-04-11 11:05:13 +01:00
Alex Crichton
323f808791 std: Inline some Termination-related methods
These were showing up in tests and in binaries but are trivially optimize-able
away, so add `#[inline]` attributes so LLVM has an opportunity to optimize them
out.
2018-04-05 11:07:19 -07:00
kennytm
a4f744d84e Rollup merge of #49637 - tmccombs:parent-id-stabilize, r=sfackler
Stabilize parent_id()

Fixes #46104
2018-04-05 02:17:00 +08:00
bors
5758c2dd14 Auto merge of #48575 - ishitatsuyuki:unix-no-thread, r=alexcrichton
rustc_driver: get rid of the extra thread

**Do not rollup**

We can alter the stack size afterwards on Unix.

Having a separate thread causes poor debugging experience when interrupting with signals. I have to get the backtrace of the all thread, as the main thread is waiting to join doing nothing else. This patch allows me to just run `bt` to get the desired backtrace.
2018-04-04 06:19:40 +00:00
Thayne McCombs
97ac479066 Stabilize parent_id()
Fixes #46104
2018-04-03 19:47:37 -06:00
Tatsuyuki Ishi
7db854b36f Fix imports 2018-04-03 12:42:36 +09:00
bors
d52c44ea8d Auto merge of #49460 - kennytm:rollup, r=kennytm
Rollup of 12 pull requests

- Successful merges: #49243, #49329, #49364, #49400, #49405, #49427, #49428, #49429, #49439, #49442, #49444, #49452
- Failed merges:
2018-03-28 22:18:13 +00:00
bors
e5277c1457 Auto merge of #49357 - frewsxcv:frewsxcv-termination-doc-examples, r=GuillaumeGomez
Remove hidden `foo` functions from doc examples; use `Termination` trait.

Fixes https://github.com/rust-lang/rust/issues/49233.

Easier to review with the white-space ignoring `?w=1` feature: https://github.com/rust-lang/rust/pull/49357/files?w=1
2018-03-28 18:11:44 +00:00
kennytm
010fb40b44 Rollup merge of #49400 - Diggsey:shrink-to, r=joshtriplett
Implement `shrink_to` method on collections

Fixes #49385
2018-03-28 17:55:09 +02:00
Corey Farwell
e9dcec070d Remove hidden foo functions from doc examples; use Termination trait.
Fixes https://github.com/rust-lang/rust/issues/49233.
2018-03-28 13:15:05 +02:00
Tatsuyuki Ishi
8ecbec1dba Use mprotect instead of mmap 2018-03-28 18:47:16 +09:00
Diggory Blake
04f6692aaf Implement shrink_to method on collections 2018-03-27 01:39:11 +01:00
Tatsuyuki Ishi
d39b02c2c9 Use a more conservative way to deinit stack guard 2018-03-25 16:08:03 +09:00
bors
482a913fb3 Auto merge of #49315 - TheDan64:smaller_unsafe_block, r=joshtriplett
Reduce scope of unsafe block in sun_path_offset

I reduced the scope of the unsafe block to the `uninitialized` call which is the only actual unsafe bit.
2018-03-25 05:26:58 +00:00
Tatsuyuki Ishi
9127990434 Fix build on non-Unix platforms 2018-03-24 13:49:08 +09:00
Daniel Kolsoi
fdde09c70c Reduce scope of unsafe block in sun_path_offset 2018-03-23 17:01:34 -04:00
Bryan Drewery
70559c54ce Command::env_saw_path() may be unused on platforms not using posix_spawn() 2018-03-22 09:49:20 -07:00
Tatsuyuki Ishi
2928c7a8a2 Refactor the stack addr aligning code into a function 2018-03-20 22:53:38 +09:00
Bryan Drewery
6212904dd8 Don't use posix_spawn() if PATH was modified in the environment.
The expected behavior is that the environment's PATH should be used
to find the process.  posix_spawn() could be used if we iterated
PATH to search for the binary to execute.  For now just skip
posix_spawn() if PATH is modified.
2018-03-19 15:40:09 -07:00
Bryan Drewery
00dac20e01 Merge branch 'update-beta-freebsd' into freebsd-posix-spawn 2018-03-19 13:11:55 -07:00
Tatsuyuki Ishi
a185b56b7c Address review comments 2018-03-19 11:41:28 +09:00
Alex Crichton
de3a63d663 Rollup merge of #48618 - scottmcm:elaborate-exitcode, r=alexcrichton
Better docs and associated SUCCESS/FAILURE for process::ExitCode

Follow-up to https://github.com/rust-lang/rust/pull/48497#discussion_r170676525, since that PR was the minimal thing to unblock https://github.com/rust-lang/rust/issues/48453#issuecomment-368155082.

r? @nikomatsakis
2018-03-06 23:38:06 -08:00
Scott McMurray
74c5c6e6cb Move process::ExitCode internals to sys
Now begins the saga of fixing compilation errors on other platforms...
2018-03-03 18:44:44 -08:00
Manish Goregaokar
8bf026df5b Rollup merge of #48328 - frewsxcv:frewsxcv-clarify-error-zero-duration, r=sfackler
Fixes #47311.
r? @nrc
2018-03-02 22:01:20 -08:00
Bryan Drewery
d740083fc8 Support posix_spawn() for Linux glibc 2.24+.
The relevant support was added in https://sourceware.org/bugzilla/show_bug.cgi?id=10354#c12
2018-03-02 13:08:04 -08:00
Bryan Drewery
5ba6b3a728 Move glibc version lookup handling to sys::os and add a simpler glibc_version() 2018-03-02 12:54:03 -08:00
Bryan Drewery
99b50efb6e Use _ 2018-03-02 08:50:37 -08:00
Bryan Drewery
ef73b3ae2e Add comment explaining when posix_spawn() can be supported. 2018-03-01 09:18:16 -08:00
Bryan Drewery
2e2d9260f9 posix_spawn() on OSX supports returning ENOENT. 2018-03-01 09:17:49 -08:00
Bryan Drewery
a9ea876960 posix_spawn() always returns its error rather than setting errno. 2018-02-28 22:16:35 -08:00
Bryan Drewery
85b82f254e Support posix_spawn() for FreeBSD.
spawn() is expected to return an error if the specified file could not be
executed.  FreeBSD's posix_spawn() supports returning ENOENT/ENOEXEC if
the exec() fails, which not all platforms support.  This brings a very
significant performance improvement for FreeBSD, involving heavy use of
Command in threads, due to fork() invoking jemalloc fork handlers and
causing lock contention.  FreeBSD's posix_spawn() avoids this problem
due to using vfork() internally.
2018-02-28 15:36:32 -08:00
Bryan Drewery
b3ecf5f57c Remove excess newline 2018-02-28 15:36:32 -08:00
Bryan Drewery
8e3fa0d3c4 Pass proper pointer for envp. 2018-02-28 15:36:32 -08:00
Bryan Drewery
94630e4ca5 No need to zero when an initializer for the object is already used. 2018-02-28 15:36:32 -08:00
Bryan Drewery
f4633865d3 Avoid error for unused variables 2018-02-28 15:36:31 -08:00
Alex Crichton
11696acd6d Support posix_spawn() when possible. 2018-02-28 15:35:59 -08:00
kennytm
1aa103511b Rollup merge of #48330 - frewsxcv:frewsxcv-tests-zero-duration, r=sfackler
Add tests ensuring zero-Duration timeouts result in errors; fix Redox issues.

Part of #48311
2018-02-25 22:47:56 +08:00
Corey Farwell
0700bd12d0 Clarify "It is an error to..." wording for zero-duration behaviors.
Documentation fix side of https://github.com/rust-lang/rust/issues/48311.
2018-02-24 08:56:36 -05:00
Corey Farwell
d17d645ad7 Add tests ensuring zero-Duration timeouts result in errors.
Part of https://github.com/rust-lang/rust/issues/48311
2018-02-18 21:42:02 -05:00
Corey Farwell
472dcdb4ec Fix broken documentation link. 2018-02-17 20:57:00 -05:00
Josh Stone
55b54a999b Use a range to identify SIGSEGV in stack guards
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.
2018-01-31 11:41:29 -08:00
kennytm
4dbfc8ddbf Rollup merge of #47760 - little-dude:master, r=alexcrichton
implement Send for process::Command on unix

closes https://github.com/rust-lang/rust/issues/47751
2018-01-30 17:10:53 +08:00
Corentin Henry
9e6ed17c4f make Command.argv Send on unix platforms
Implementing Send for a specific field rather than the whole struct is
safer: if a field is changed/modified and becomes non-Send, we can catch
it.
2018-01-26 07:22:58 -08:00
John Kåre Alsaker
634f8cc06a Print inlined functions on Windows 2018-01-26 04:49:54 +01:00
Corentin Henry
831ff77570 implement Send for process::Command on unix
closes https://github.com/rust-lang/rust/issues/47751
2018-01-25 15:14:38 -08:00
Guillaume Gomez
ab54a9c73c Rollup merge of #47334 - etaoins:only-call-res-init-on-gnu-unix, r=alexcrichton
Only link res_init() on GNU/*nix

To workaround a bug in glibc <= 2.26 lookup_host() calls res_init() based on the glibc version detected at runtime. While this avoids calling res_init() on platforms where it's not required we will still end up linking against the symbol.

This causes an issue on macOS where res_init() is implemented in a separate library (libresolv.9.dylib) from the main libc. While this is harmless for standalone programs it becomes a problem if Rust code is statically linked against another program. If the linked program doesn't already specify -lresolv it will cause the link to fail. This is captured in issue #46797

Fix this by hooking in to the glibc workaround in `cvt_gai` and only activating it for the "gnu" environment on Unix This should include all glibc platforms while excluding musl, windows-gnu, macOS, FreeBSD, etc.

This has the side benefit of removing the #[cfg] in sys_common; only unix.rs has code related to the workaround now.

Before this commit:
```shell
> cat main.rs
use std::net::ToSocketAddrs;

#[no_mangle]
pub extern "C" fn resolve_test() -> () {
    let addr_list = ("google.com.au", 0).to_socket_addrs().unwrap();
    println!("{:?}", addr_list);
}
> rustc --crate-type=staticlib main.rs
> clang libmain.a test.c -o combined
Undefined symbols for architecture x86_64:
  "_res_9_init", referenced from:
      std::net::lookup_host::h93c17fe9ad38464a in libmain.a(std-826c8d3b356e180c.std0.rcgu.o)
ld: symbol(s) not found for architecture x86_64
clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)
```

Afterwards:
```shell
> rustc --crate-type=staticlib main.rs
> clang libmain.a test.c -o combined
> ./combined
IntoIter([V4(172.217.25.131:0)])
```

Fixes  #46797
2018-01-21 23:11:38 +01:00
Zack M. Davis
14982db2d6 in which the unused-parens lint comes to cover function and method args
Resolves #46137.
2018-01-18 08:33:58 -08:00