1. 19 7月, 2020 13 次提交
    • M
      Do not clobber RUSTDOCFLAGS · be43319b
      Mark Rousskov 提交于
      We were setting these in both Builder::cargo and here, which ended up only
      setting the first of the two.
      be43319b
    • B
      Auto merge of #74091 - richkadel:llvm-coverage-map-gen-4, r=tmandry · 47ea6d90
      bors 提交于
      Generating the coverage map
      
      @tmandry @wesleywiser
      
      rustc now generates the coverage map and can support (limited)
      coverage report generation, at the function level.
      
      Example commands to generate a coverage report:
      ```shell
      $ BUILD=$HOME/rust/build/x86_64-unknown-linux-gnu
      $ $BUILD/stage1/bin/rustc -Zinstrument-coverage \
      $HOME/rust/src/test/run-make-fulldeps/instrument-coverage/main.rs
      $ LLVM_PROFILE_FILE="main.profraw" ./main
      called
      $ $BUILD/llvm/bin/llvm-profdata merge -sparse main.profraw -o main.profdata
      $ $BUILD/llvm/bin/llvm-cov show --instr-profile=main.profdata main
      ```
      ![rust coverage report only 20200706](https://user-images.githubusercontent.com/3827298/86697299-1cbe8f80-bfc3-11ea-8955-451b48626991.png)
      
      r? @wesleywiser
      
      Rust compiler MCP rust-lang/compiler-team#278
      Relevant issue: #34701 - Implement support for LLVMs code coverage instrumentation
      47ea6d90
    • B
      Auto merge of #74493 - Manishearth:rollup-ust7yr4, r=Manishearth · 0701419e
      bors 提交于
      Rollup of 7 pull requests
      
      Successful merges:
      
       - #70817 (Add core::task::ready! macro)
       - #73762 (Document the trait keyword)
       - #74021 (impl Index<RangeFrom> for CStr)
       - #74071 (rustc_metadata: Make crate loading fully speculative)
       - #74445 (add test for #62878)
       - #74459 (Make unreachable_unchecked a const fn)
       - #74478 (Revert "Use an UTF-8 locale for the linker.")
      
      Failed merges:
      
      r? @ghost
      0701419e
    • M
      Rollup merge of #74478 - rust-lang:revert-74416-linker-locale-utf8, r=Mark-Simulacrum · a83e294f
      Manish Goregaokar 提交于
      Revert "Use an UTF-8 locale for the linker."
      
      Reverts rust-lang/rust#74416
      
      This is suspected to have caused significant compile time regressions: https://perf.rust-lang.org/compare.html?start=39d5a61f2e4e237123837f5162cc275c2fd7e625&end=d3df8512d2c2afc6d2e7d8b5b951dd7f2ad77b02&stat=instructions:u
      a83e294f
    • M
      Rollup merge of #74459 - canova:const-unreachable-unchecked, r=oli-obk · 2fad3963
      Manish Goregaokar 提交于
      Make unreachable_unchecked a const fn
      
      This PR makes `std::hint::unreachable_unchecked` a const fn so we can use it inside a const function.
      r? @RalfJung
      Fixes #53188.
      2fad3963
    • M
      Rollup merge of #74445 - lcnr:const-generic-ty-decl, r=Dylan-DPC · 1a54b61e
      Manish Goregaokar 提交于
      add test for #62878
      
      forgot to push this as part of #74159
      
      r? @Dylan-DPC
      1a54b61e
    • M
      Rollup merge of #74071 - petrochenkov:cload3, r=matthewjasper · 43ba8409
      Manish Goregaokar 提交于
      rustc_metadata: Make crate loading fully speculative
      
      Instead of reporting `span_err`s on the spot crate loading errors are now wrapped into the `CrateError` enum and returned, so they are reported only at the top level `resolve_crate` call, and not reported at all if we are resolving speculatively with `maybe_resolve_crate`.
      
      As a result we can attempt loading crates for error recovery (e.g. import suggestions) without any risk of producing extra errors.
      Also, this means better separation between error reporting and actual logic.
      
      Fixes https://github.com/rust-lang/rust/issues/55103
      Fixes https://github.com/rust-lang/rust/issues/56590
      43ba8409
    • M
      Rollup merge of #74021 - 1011X:master, r=dtolnay · f305b200
      Manish Goregaokar 提交于
      impl Index<RangeFrom> for CStr
      
      This change implements (partial) slicing for `CStr`.
      
      Since a `CStr` must end in a null byte, it's not possible to trim from the right and still have a valid `CStr`. But, it *is* possible to trim from the left. This lets us be a bit more flexible and treat them more like strings.
      
      ```rust
      let string = CStr::from_bytes_with_nul(b"Hello World!\0");
      let result = CStr::from_bytes_with_nul(b"World!\0");
      assert_eq!(&string[6..], result);
      ```
      f305b200
    • M
      Rollup merge of #73762 - poliorcetics:trait-keyword, r=KodrAus · a6266e2d
      Manish Goregaokar 提交于
      Document the trait keyword
      
      Partial fix of #34601.
      
      This document the trait keyword. To avoid doing too much and forcing more updates as functionalities evolve, I put two links to the reference, especially for trait objects. This mainly documents the "big" parts, not so much the small details that might trip someone experimenting.
      
      @rustbot modify labels: T-doc,C-enhancement
      a6266e2d
    • M
      Rollup merge of #70817 - yoshuawuyts:task-ready, r=dtolnay · 479c8ad1
      Manish Goregaokar 提交于
      Add core::task::ready! macro
      
      This PR adds `ready!` as a top-level macro to `libcore` following the implementation of `futures_core::ready`, tracking issue https://github.com/rust-lang/rust/issues/70922. This macro is commonly used when implementing `Future`, `AsyncRead`, `AsyncWrite` and `Stream`. And being only 5 lines, it seems like a useful and straight forward addition to std.
      
      ## Example
      
      ```rust
      use core::task::{Context, Poll};
      use core::future::Future;
      use core::pin::Pin;
      
      async fn get_num() -> usize {
          42
      }
      
      pub fn do_poll(cx: &mut Context<'_>) -> Poll<()> {
          let mut f = get_num();
          let f = unsafe { Pin::new_unchecked(&mut f) };
      
          let num = ready!(f.poll(cx));
          // ... use num
      
          Poll::Ready(())
      }
      ```
      
      ## Naming
      
      In `async-std` we chose to nest the macro under the `task` module instead of having the macro at the top-level. This is a pattern that currently does not occur in std, mostly due to this not being possible prior to Rust 2018.
      
      This PR proposes to add the `ready` macro as `core::ready`. But another option would be to introduce it as `core::task::ready` since it's really only useful when used in conjunction with `task::{Context, Poll}`.
      
      ## Implementation questions
      
      I tried rendering the documentation locally but the macro didn't show up under `core`. I'm not sure if I quite got this right. I used the [`todo!` macro PR](https://github.com/rust-lang/rust/pull/56348/files) as a reference, and our approaches look similar.
      
      ## References
      
      - [`futures::ready`](https://docs.rs/futures/0.3.4/futures/macro.ready.html)
      - [`async_std::task::ready`](https://docs.rs/async-std/1.5.0/async_std/task/index.html)
      - [`futures_core::ready`](https://docs.rs/futures-core/0.3.4/futures_core/macro.ready.html)
      479c8ad1
    • D
      Update stability attribute for CStr indexing · 30b8835d
      David Tolnay 提交于
      30b8835d
    • 1
      impl Index<RangeFrom<usize>> for CStr · f08aae6a
      1011X 提交于
      f08aae6a
    • B
      Auto merge of #73441 - alexcrichton:backtrace-gimli, r=Mark-Simulacrum · 1fa54ad9
      bors 提交于
      std: Switch from libbacktrace to gimli
      
      This commit is a proof-of-concept for switching the standard library's
      backtrace symbolication mechanism on most platforms from libbacktrace to
      gimli. The standard library's support for `RUST_BACKTRACE=1` requires
      in-process parsing of object files and DWARF debug information to
      interpret it and print the filename/line number of stack frames as part
      of a backtrace.
      
      Historically this support in the standard library has come from a
      library called "libbacktrace". The libbacktrace library seems to have
      been extracted from gcc at some point and is written in C. We've had a
      lot of issues with libbacktrace over time, unfortunately, though. The
      library does not appear to be actively maintained since we've had
      patches sit for months-to-years without comments. We have discovered a
      good number of soundness issues with the library itself, both when
      parsing valid DWARF as well as invalid DWARF. This is enough of an issue
      that the libs team has previously decided that we cannot feed untrusted
      inputs to libbacktrace. This also doesn't take into account the
      portability of libbacktrace which has been difficult to manage and
      maintain over time. While possible there are lots of exceptions and it's
      the main C dependency of the standard library right now.
      
      For years it's been the desire to switch over to a Rust-based solution
      for symbolicating backtraces. It's been assumed that we'll be using the
      Gimli family of crates for this purpose, which are targeted at safely
      and efficiently parsing DWARF debug information. I've been working
      recently to shore up the Gimli support in the `backtrace` crate. As of a
      few weeks ago the `backtrace` crate, by default, uses Gimli when loaded
      from crates.io. This transition has gone well enough that I figured it
      was time to start talking seriously about this change to the standard
      library.
      
      This commit is a preview of what's probably the best way to integrate
      the `backtrace` crate into the standard library with the Gimli feature
      turned on. While today it's used as a crates.io dependency, this commit
      switches the `backtrace` crate to a submodule of this repository which
      will need to be updated manually. This is not done lightly, but is
      thought to be the best solution. The primary reason for this is that the
      `backtrace` crate needs to do some pretty nontrivial filesystem
      interactions to locate debug information. Working without `std::fs` is
      not an option, and while it might be possible to do some sort of
      trait-based solution when prototyped it was found to be too unergonomic.
      Using a submodule allows the `backtrace` crate to build as a submodule
      of the `std` crate itself, enabling it to use `std::fs` and such.
      
      Otherwise this adds new dependencies to the standard library. This step
      requires extra attention because this means that these crates are now
      going to be included with all Rust programs by default. It's important
      to note, however, that we're already shipping libbacktrace with all Rust
      programs by default and it has a bunch of C code implementing all of
      this internally anyway, so we're basically already switching
      already-shipping functionality to Rust from C.
      
      * `object` - this crate is used to parse object file headers and
        contents. Very low-level support is used from this crate and almost
        all of it is disabled. Largely we're just using struct definitions as
        well as convenience methods internally to read bytes and such.
      
      * `addr2line` - this is the main meat of the implementation for
        symbolication. This crate depends on `gimli` for DWARF parsing and
        then provides interfaces needed by the `backtrace` crate to turn an
        address into a filename / line number. This crate is actually pretty
        small (fits in a single file almost!) and mirrors most of what
        `dwarf.c` does for libbacktrace.
      
      * `miniz_oxide` - the libbacktrace crate transparently handles
        compressed debug information which is compressed with zlib. This crate
        is used to decompress compressed debug sections.
      
      * `gimli` - not actually used directly, but a dependency of `addr2line`.
      
      * `adler32`- not used directly either, but a dependency of
        `miniz_oxide`.
      
      The goal of this change is to improve the safety of backtrace
      symbolication in the standard library, especially in the face of
      possibly malformed DWARF debug information. Even to this day we're still
      seeing segfaults in libbacktrace which could possibly become security
      vulnerabilities. This change should almost entirely eliminate this
      possibility whilc also paving the way forward to adding more features
      like split debug information.
      
      Some references for those interested are:
      
      * Original addition of libbacktrace - #12602
      * OOM with libbacktrace - #24231
      * Backtrace failure due to use of uninitialized value - #28447
      * Possibility to feed untrusted data to libbacktrace - #21889
      * Soundness fix for libbacktrace - #33729
      * Crash in libbacktrace - #39468
      * Support for macOS, never merged - ianlancetaylor/libbacktrace#2
      * Performance issues with libbacktrace - #29293, #37477
      * Update procedure is quite complicated due to how many patches we
        need to carry - #50955
      * Libbacktrace doesn't work on MinGW with dynamic libs - #71060
      * Segfault in libbacktrace on macOS - #71397
      
      Switching to Rust will not make us immune to all of these issues. The
      crashes are expected to go away, but correctness and performance may
      still have bugs arise. The gimli and `backtrace` crates, however, are
      actively maintained unlike libbacktrace, so this should enable us to at
      least efficiently apply fixes as situations come up.
      
      ---
      
      I want to note that my purpose for creating a PR here is to start a conversation about this. I think that all the various pieces are in place that this is compelling enough that I think this transition should be talked about seriously. There are a number of items which still need to be addressed before actually merging this PR, however:
      
      * [ ] `gimli` needs to be published to crates.io
      * [ ] `addr2line` needs a publish
      * [ ] `miniz_oxide` needs a publish
      * [ ] Tests probably shouldn't recommend the `gimli` crate's traits for implementing
      * [ ] The `backtrace` crate's branch changes need to be merged to the master branch (https://github.com/rust-lang/backtrace-rs/pull/349)
      * [ ] The support for `libbacktrace` on some platforms needs to be audited to see if we should support more strategies in the gimli implementation - https://github.com/rust-lang/backtrace-rs/issues/325, https://github.com/rust-lang/backtrace-rs/issues/326, https://github.com/rust-lang/backtrace-rs/issues/350, https://github.com/rust-lang/backtrace-rs/issues/351
      
      Most of the merging/publishing I'm not actively pushing on right now. It's a bit wonky for crates to support libstd so I'm holding off on pulling the trigger everywhere until there's a bit more discussion about how to go through with this. Namely https://github.com/rust-lang/backtrace-rs/pull/349 I'm going to hold off merging until we decide to go through with the submodule strategy.
      
      In any case this is a pretty major change, so I suspect that the compiler team is likely going to be interested in this. I don't mean to force changes by dumping a bunch of code by any means. Integration of external crates into the standard library is so difficult I wanted to have a proof-of-concept to review while talking about whether to do this at all (hence the PR), but I'm more than happy to follow any processes needed to merge this. I must admit though that I'm not entirely sure myself at this time what the process would be to decide to merge this, so I'm hoping others can help me figure that out!
      1fa54ad9
  2. 18 7月, 2020 27 次提交
    • J
      Revert "Use an UTF-8 locale for the linker." · 09240a4b
      Jonas Schievink 提交于
      09240a4b
    • B
      Auto merge of #74468 - Manishearth:rollup-5nhvz80, r=Manishearth · 7d31ffc1
      bors 提交于
      Rollup of 11 pull requests
      
      Successful merges:
      
       - #72414 ( Add lazy initialization primitives to std)
       - #74069 (Compare tagged/niche-filling layout and pick the best one)
       - #74418 (ci: Set `shell: bash` as a default, remove duplicates)
       - #74441 (bootstrap.py: patch RPATH on NixOS to handle the new zlib dependency.)
       - #74444 (Add regression test for #69414)
       - #74448 (improper_ctypes_definitions: allow `Box`)
       - #74449 (Test codegen of compare_exchange operations)
       - #74450 (Fix `Safety` docs for `from_raw_parts_mut`)
       - #74453 (Use intra-doc links in `str` and `BTreeSet`)
       - #74457 (rustbuild: drop tool::should_install)
       - #74464 (Use pathdiff crate)
      
      Failed merges:
      
      r? @ghost
      7d31ffc1
    • V
      0a4217d0
    • V
    • V
      rustc_metadata: Remove some extra diagnostics for legacy plugins · 926ac5a2
      Vadim Petrochenkov 提交于
      They are deprecated so doing extra work for error recovery doesn't make sense
      926ac5a2
    • V
      de03a126
    • M
      Rollup merge of #74464 - FedericoPonzi:fix-#67108, r=Manishearth · cae9c503
      Manish Goregaokar 提交于
      Use pathdiff crate
      
      I wanted to tackle a simple issue, and stumbled upon #67108: this pr removes the function which was exported to the external crate as required in the todo/issue.
      I've tested it with:
      ```
      ./x.py build --stage 1 --keep-stage 1 src/librustc_codegen_ssa
      ```
      And it looks like it's compiling
      cae9c503
    • M
      Rollup merge of #74457 - Keruspe:install, r=Mark-Simulacrum · 5f762403
      Manish Goregaokar 提交于
      rustbuild: drop tool::should_install
      
      Always install when the build succeeds
      
      Fixes #74431
      5f762403
    • M
      Rollup merge of #74453 - Manishearth:intra-doc-std, r=jyn514 · 0d669a97
      Manish Goregaokar 提交于
      Use intra-doc links in `str` and `BTreeSet`
      
      Fixes #32129, fixes  #32130
      
      A _slight_ degradation in quality is that the `#method.foo` links would previously link to the same page on `String`'s documentation, and now they will navigate to `str`. Not a big deal IMO, and we can also try to improve that.
      0d669a97
    • M
      Rollup merge of #74450 - aticu:master, r=jonas-schievink · 95977441
      Manish Goregaokar 提交于
      Fix `Safety` docs for `from_raw_parts_mut`
      
      This aligns the wording more with the documentation of e.g. `drop_in_place`, `replace`, `swap` and `swap_nonoverlapping` from `core::ptr`.
      
      Also if the pointer were really only valid for writes, it would be trivial to introduce UB from safe code, after calling `core::slice::from_raw_parts_mut`.
      95977441
    • M
      Rollup merge of #74449 - tmiasko:cmpxchg-test, r=nikomatsakis · 18e80893
      Manish Goregaokar 提交于
      Test codegen of compare_exchange operations
      
      Add a codegen test for compare_exchange to verify that rustc emits expected LLVM IR.
      18e80893
    • M
      Rollup merge of #74448 - davidtwco:improper-ctypes-definitions-boxes, r=davidtwco · f276dd4f
      Manish Goregaokar 提交于
      improper_ctypes_definitions: allow `Box`
      
      Addresses https://github.com/rust-lang/rust/pull/72700#issuecomment-659449386.
      
      This PR stops linting against `Box` in `extern "C" fn`s for the `improper_ctypes_definitions` lint - boxes are documented to be FFI-safe.
      
      cc @alexcrichton @CryZe
      f276dd4f
    • M
      Rollup merge of #74444 - Alexendoo:test-69414, r=nikomatsakis · 378f46d1
      Manish Goregaokar 提交于
      Add regression test for #69414
      
      Closes #69414 (no longer ICEs after #74159)
      378f46d1
    • M
      Rollup merge of #74441 - eddyb:zlib-on-nixos, r=nagisa · 8d1bb0e7
      Manish Goregaokar 提交于
      bootstrap.py: patch RPATH on NixOS to handle the new zlib dependency.
      
      This is a stop-gap until #74420 is resolved (assuming we'll patch beta to statically link zlib).
      
      However, I've been meaning to rewrite the NixOS support we have in `bootstrap.py` for a while now, and had to in order to cleanly add zlib as a dependency (the second commit is a relatively small delta in functionality, compared to the first).
      
      Previously, we would extract the `ld-linux.so` path from the output of `ldd /run/current-system/sw/bin/sh`, which assumes a lot. On top of that we didn't use any symlinks, which meant if the user ran  GC (`nix-collect-garbage`), e.g. after updating their system, their `stage0` binaries would suddenly be broken (i.e. referring to files that no longer exist).
      We were also using `patchelf` directly, assuming it can be found in `$PATH` (which is not necessarily true).
      
      My new approach relies on using `nix-build` to get the following "derivations" (packages, more or less):
      * `stdenv.cc.bintools`, which has a `nix-support/dynamic-linker` file containing the path to `ld-linux.so`
        * reading this file is [the canonical way to run `patchelf --set-interpreter`](https://github.com/NixOS/nixpkgs/search?l=Nix&q=%22--set-interpreter+%24%28cat+%24NIX_CC%2Fnix-support%2Fdynamic-linker%29%22)
      * `patchelf` (so that the user doesn't need to have it installed)
      * `zlib`, for the `libz.so` dependency of `libLLVM-*.so` (until #74420 is resolved, presumably)
      
      This is closer to how software is built on Nix, but I've tried to keep it as simple as possible (and not add e.g. a `stage0.nix` file).
      Symlinks to each of those dependencies are kept in `stage0/.nix-deps`, which prevents GC from invalidating `stage0` binaries.
      
      r? @nagisa cc @Mark-Simulacrum @oli-obk @davidtwco
      8d1bb0e7
    • M
      Rollup merge of #74418 - rye:gha-dedup-shell-setting, r=pietroalbini · 7b66c667
      Manish Goregaokar 提交于
      ci: Set `shell: bash` as a default, remove duplicates
      
      A follow-up to #74406, this commit merely removes the `shell: bash` lines where they were added in favor of setting defaults for *all* "run" steps in the jobs that run the tests.
      
      The changes in #74406 were needed because of an upstream change to the `windows-2019` GitHub Actions image. Previously, the configuration worked fine without specifying `shell: bash`, but for some reason this broke with a new change that was deployed today. The preceding PR was a hotfix to get CI passing, but there was a slightly less duplicative way to specify the default shell for the jobs, which was to set the `defaults.run` option.
      
      This change applies to the `pr`, `try`, `auto`, and `auto-fallible` jobs, which are derived from the YAML-anchor `base-ci-job`.  I did not apply these changes to the `master`, `try-success`, `try-failure`, `auto-success`, or `auto-failure` jobs because they have only a few steps.
      
      cc/r? @Mark-Simulacrum
      7b66c667
    • M
      Rollup merge of #74069 - erikdesjardins:bad-niche, r=nikomatsakis · e775b4db
      Manish Goregaokar 提交于
      Compare tagged/niche-filling layout and pick the best one
      
      Finishes up #71045, and so fixes #63866.
      
      cc @EddyB
      r? @nikomatsakis (since @EddyB wrote the first commit)
      e775b4db
    • M
      Rollup merge of #72414 - KodrAus:feat/stdlazy, r=Mark-Simulacrum · 01418bd1
      Manish Goregaokar 提交于
       Add lazy initialization primitives to std
      
      Follow-up to #68198
      
      Current RFC: https://github.com/rust-lang/rfcs/pull/2788
      
      Rebased and fixed up a few of the dangling comments. Some notes carried over from the previous PR:
      
      - [ ] Naming. I'm ok to just roll with the `Sync` prefix like `SyncLazy` for now, but [have a personal preference for `Atomic`](https://github.com/rust-lang/rfcs/pull/2788#issuecomment-574466983) like `AtomicLazy`.
      - [x] [Poisoning](https://github.com/rust-lang/rfcs/pull/2788#discussion_r366725768). It seems like there's [some regret around poisoning in other `std::sync` types that we might want to just avoid upfront for `std::lazy`, especially if that would align with a future `std::mutex` that doesn't poison](https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/parking_lot.3A.3AMutex.20in.20std/near/190331199). Personally, if we're adding these types to `std::lazy` instead of `std::sync`, I'd be on-board with not worrying about poisoning in `std::lazy`, and potentially deprecating `std::sync::Once` and `lazy_static` in favour of `std::lazy` down the track if it's possible, rather than attempting to replicate their behavior. cc @Amanieu @sfackler.
      - [ ] [Consider making`SyncOnceCell::get` blocking](https://github.com/matklad/once_cell/pull/92). There doesn't seem to be consensus in the linked PR on whether or not that's strictly better than the non-blocking variant.
      
      In general, none of these seem to be really blocking an initial unstable merge, so we could possibly kick off a FCP if y'all are happy?
      
      cc @matklad @pitdicker have I missed anything, or were there any other considerations that have come up since we last looked at this?
      01418bd1
    • M
      Run fmt · c41db4cc
      Manish Goregaokar 提交于
      c41db4cc
    • N
      6cd164f4
    • A
      link once_cell feature to #74465 · fe639057
      Ashley Mannix 提交于
      fe639057
    • F
      Allows pathdiff package · 5702ce89
      Federico Ponzi 提交于
      5702ce89
    • F
      fixes #67108 by using the external crate · 4b6a0278
      Federico Ponzi 提交于
      4b6a0278
    • A
      std: Switch from libbacktrace to gimli · 13db3cc1
      Alex Crichton 提交于
      This commit is a proof-of-concept for switching the standard library's
      backtrace symbolication mechanism on most platforms from libbacktrace to
      gimli. The standard library's support for `RUST_BACKTRACE=1` requires
      in-process parsing of object files and DWARF debug information to
      interpret it and print the filename/line number of stack frames as part
      of a backtrace.
      
      Historically this support in the standard library has come from a
      library called "libbacktrace". The libbacktrace library seems to have
      been extracted from gcc at some point and is written in C. We've had a
      lot of issues with libbacktrace over time, unfortunately, though. The
      library does not appear to be actively maintained since we've had
      patches sit for months-to-years without comments. We have discovered a
      good number of soundness issues with the library itself, both when
      parsing valid DWARF as well as invalid DWARF. This is enough of an issue
      that the libs team has previously decided that we cannot feed untrusted
      inputs to libbacktrace. This also doesn't take into account the
      portability of libbacktrace which has been difficult to manage and
      maintain over time. While possible there are lots of exceptions and it's
      the main C dependency of the standard library right now.
      
      For years it's been the desire to switch over to a Rust-based solution
      for symbolicating backtraces. It's been assumed that we'll be using the
      Gimli family of crates for this purpose, which are targeted at safely
      and efficiently parsing DWARF debug information. I've been working
      recently to shore up the Gimli support in the `backtrace` crate. As of a
      few weeks ago the `backtrace` crate, by default, uses Gimli when loaded
      from crates.io. This transition has gone well enough that I figured it
      was time to start talking seriously about this change to the standard
      library.
      
      This commit is a preview of what's probably the best way to integrate
      the `backtrace` crate into the standard library with the Gimli feature
      turned on. While today it's used as a crates.io dependency, this commit
      switches the `backtrace` crate to a submodule of this repository which
      will need to be updated manually. This is not done lightly, but is
      thought to be the best solution. The primary reason for this is that the
      `backtrace` crate needs to do some pretty nontrivial filesystem
      interactions to locate debug information. Working without `std::fs` is
      not an option, and while it might be possible to do some sort of
      trait-based solution when prototyped it was found to be too unergonomic.
      Using a submodule allows the `backtrace` crate to build as a submodule
      of the `std` crate itself, enabling it to use `std::fs` and such.
      
      Otherwise this adds new dependencies to the standard library. This step
      requires extra attention because this means that these crates are now
      going to be included with all Rust programs by default. It's important
      to note, however, that we're already shipping libbacktrace with all Rust
      programs by default and it has a bunch of C code implementing all of
      this internally anyway, so we're basically already switching
      already-shipping functionality to Rust from C.
      
      * `object` - this crate is used to parse object file headers and
        contents. Very low-level support is used from this crate and almost
        all of it is disabled. Largely we're just using struct definitions as
        well as convenience methods internally to read bytes and such.
      
      * `addr2line` - this is the main meat of the implementation for
        symbolication. This crate depends on `gimli` for DWARF parsing and
        then provides interfaces needed by the `backtrace` crate to turn an
        address into a filename / line number. This crate is actually pretty
        small (fits in a single file almost!) and mirrors most of what
        `dwarf.c` does for libbacktrace.
      
      * `miniz_oxide` - the libbacktrace crate transparently handles
        compressed debug information which is compressed with zlib. This crate
        is used to decompress compressed debug sections.
      
      * `gimli` - not actually used directly, but a dependency of `addr2line`.
      
      * `adler32`- not used directly either, but a dependency of
        `miniz_oxide`.
      
      The goal of this change is to improve the safety of backtrace
      symbolication in the standard library, especially in the face of
      possibly malformed DWARF debug information. Even to this day we're still
      seeing segfaults in libbacktrace which could possibly become security
      vulnerabilities. This change should almost entirely eliminate this
      possibility whilc also paving the way forward to adding more features
      like split debug information.
      
      Some references for those interested are:
      
      * Original addition of libbacktrace - #12602
      * OOM with libbacktrace - #24231
      * Backtrace failure due to use of uninitialized value - #28447
      * Possibility to feed untrusted data to libbacktrace - #21889
      * Soundness fix for libbacktrace - #33729
      * Crash in libbacktrace - #39468
      * Support for macOS, never merged - ianlancetaylor/libbacktrace#2
      * Performance issues with libbacktrace - #29293, #37477
      * Update procedure is quite complicated due to how many patches we
        need to carry - #50955
      * Libbacktrace doesn't work on MinGW with dynamic libs - #71060
      * Segfault in libbacktrace on macOS - #71397
      
      Switching to Rust will not make us immune to all of these issues. The
      crashes are expected to go away, but correctness and performance may
      still have bugs arise. The gimli and `backtrace` crates, however, are
      actively maintained unlike libbacktrace, so this should enable us to at
      least efficiently apply fixes as situations come up.
      13db3cc1
    • M
      Use intra doc links in std::str · 748634e1
      Manish Goregaokar 提交于
      748634e1
    • B
      Auto merge of #74461 - Manishearth:rollup-xadbh00, r=Manishearth · d3df8512
      bors 提交于
      Rollup of 18 pull requests
      
      Successful merges:
      
       - #71670 (Enforce even more the code blocks attributes check through rustdoc)
       - #73930 (Make some Option methods const)
       - #74009 (Fix MinGW `run-make-fulldeps` tests)
       - #74056 (Add Arguments::as_str().)
       - #74169 (Stop processing unreachable blocks when solving dataflow)
       - #74251 (Teach bootstrap about target files vs target triples)
       - #74288 (Fix src/test/run-make/static-pie/test-aslr.rs)
       - #74300 (Use intra-doc links in core::iter module)
       - #74364 (add lazy normalization regression tests)
       - #74368 (Add CSS tidy check)
       - #74394 (Remove leftover from emscripten fastcomp support)
       - #74411 (Don't assign `()` to `!` MIR locals)
       - #74416 (Use an UTF-8 locale for the linker.)
       - #74424 (Move hir::Place to librustc_middle/hir)
       - #74428 (docs: better demonstrate that None values are skipped as many times a…)
       - #74438 (warn about uninitialized multi-variant enums)
       - #74440 (Fix Arc::as_ptr docs)
       - #74452 (intra-doc links: resolve modules in the type namespace)
      
      Failed merges:
      
      r? @ghost
      d3df8512
    • M
      Rollup merge of #74452 - Manishearth:module-type-ns, r=jyn514 · c587386f
      Manish Goregaokar 提交于
      intra-doc links: resolve modules in the type namespace
      
      Fixes https://github.com/rust-lang/rust/issues/62830
      
      Modules actually live in the type namespace, not all three, and it's not possible to clash a type with a module.
      c587386f
    • M
      Rollup merge of #74440 - Abendstolz:patch-1, r=hanna-kruppe · ff1c53f8
      Manish Goregaokar 提交于
      Fix Arc::as_ptr docs
      
      As a non-native speaker I stumbled upon this, looked it up and couldn't find a phrase, so I made my own assumption that "in any way" was meant (which is the meaning I would've deduced anyway)
      ff1c53f8