Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 7 pull requests #131573

Merged
merged 14 commits into from
Oct 12, 2024
Merged

Rollup of 7 pull requests #131573

merged 14 commits into from
Oct 12, 2024

Commits on Sep 29, 2024

  1. Configuration menu
    Copy the full SHA
    1e30b5a View commit details
    Browse the repository at this point in the history

Commits on Sep 30, 2024

  1. Port sort-research-rs test suite Rust stdlib tests

    This commit is a followup to rust-lang#124032. It
    replaces the tests that test the various sort functions in the standard library
    with a test-suite developed as part of
    https://github.com/Voultapher/sort-research-rs. The current tests suffer a
    couple of problems:
    
    - They don't cover important real world patterns that the implementations take
      advantage of and execute special code for.
    - The input lengths tested miss out on code paths. For example, important safety
      property tests never reach the quicksort part of the implementation.
    - The miri side is often limited to `len <= 20` which means it very thoroughly
      tests the insertion sort, which accounts for 19 out of 1.5k LoC.
    - They are split into to core and alloc, causing code duplication and uneven
      coverage.
    - The randomness is not repeatable, as it
      relies on `std::hash::RandomState::new().build_hasher()`.
    
    Most of these issues existed before
    rust-lang#124032, but they are intensified by it.
    One thing that is new and requires additional testing, is that the new sort
    implementations specialize based on type properties. For example `Freeze` and
    non `Freeze` execute different code paths.
    
    Effectively there are three dimensions that matter:
    
    - Input type
    - Input length
    - Input pattern
    
    The ported test-suite tests various properties along all three dimensions,
    greatly improving test coverage. It side-steps the miri issue by preferring
    sampled approaches. For example the test that checks if after a panic the set of
    elements is still the original one, doesn't do so for every single possible
    panic opportunity but rather it picks one at random, and performs this test
    across a range of input length, which varies the panic point across them. This
    allows regular execution to easily test inputs of length 10k, and miri execution
    up to 100 which covers significantly more code. The randomness used is tied to a
    fixed - but random per process execution - seed. This allows for fully
    repeatable tests and fuzzer like exploration across multiple runs.
    
    Structure wise, the tests are previously found in the core integration tests for
    `sort_unstable` and alloc unit tests for `sort`. The new test-suite was
    developed to be a purely black-box approach, which makes integration testing the
    better place, because it can't accidentally rely on internal access. Because
    unwinding support is required the tests can't be in core, even if the
    implementation is, so they are now part of the alloc integration tests. Are
    there architectures that can only build and test core and not alloc? If so, do
    such platforms require sort testing? For what it's worth the current
    implementation state passes miri `--target mips64-unknown-linux-gnuabi64` which
    is big endian.
    
    The test-suite also contains tests for properties that were and are given by the
    current and previous implementations, and likely relied upon by users but
    weren't tested. For example `self_cmp` tests that the two parameters `a` and `b`
    passed into the comparison function are never references to the same object,
    which if the user is sorting for example a `&mut [Mutex<i32>]` could lead to a
    deadlock.
    
    Instead of using the hashed caller location as rand seed, it uses seconds since
    unix epoch / 10, which given timestamps in the CI should be reasonably easy to
    reproduce, but also allows fuzzer like space exploration.
    Voultapher committed Sep 30, 2024
    Configuration menu
    Copy the full SHA
    71bb0e7 View commit details
    Browse the repository at this point in the history

Commits on Oct 1, 2024

  1. Configuration menu
    Copy the full SHA
    2bc2304 View commit details
    Browse the repository at this point in the history

Commits on Oct 10, 2024

  1. Configuration menu
    Copy the full SHA
    00f9827 View commit details
    Browse the repository at this point in the history

Commits on Oct 11, 2024

  1. Configuration menu
    Copy the full SHA
    9357277 View commit details
    Browse the repository at this point in the history
  2. RustWrapper: adapt for rename of Intrinsic::getDeclaration

    llvm/llvm-project@fa789df renamed
    getDeclaration to getOrInsertDeclaration.
    
    @rustbot label: +llvm-main
    durin42 committed Oct 11, 2024
    Configuration menu
    Copy the full SHA
    19345d5 View commit details
    Browse the repository at this point in the history
  3. stabilize const_result

    RalfJung committed Oct 11, 2024
    Configuration menu
    Copy the full SHA
    92f6568 View commit details
    Browse the repository at this point in the history
  4. Rollup merge of rust-lang#130078 - its-the-shrimp:rustdoc-types-compr…

    …ess-ids, r=aDotInTheVoid
    
    rustdoc-json: change item ID's repr from a string to an int
    
    Following [this discussion on Zulip](https://rust-lang.zulipchat.com/#narrow/stream/266220-t-rustdoc/topic/Optimizing.20the.20.60Id.60.20type.20in.20.60rustdoc-types.60), I've changed the repr of `rustdoc_json_types::Id` from a String to a u32, by adding a `clean::ItemId` interner to `JsonRenderer`
    
    r? ``@aDotInTheVoid``
    tgross35 authored Oct 11, 2024
    Configuration menu
    Copy the full SHA
    05c0591 View commit details
    Browse the repository at this point in the history
  5. Rollup merge of rust-lang#131065 - Voultapher:port-sort-test-suite, r…

    …=thomcc
    
    Port sort-research-rs test suite to Rust stdlib tests
    
    This PR is a followup to rust-lang#124032. It replaces the tests that test the various sort functions in the standard library with a test-suite developed as part of https://github.com/Voultapher/sort-research-rs. The current tests suffer a couple of problems:
    
    - They don't cover important real world patterns that the implementations take advantage of and execute special code for.
    - The input lengths tested miss out on code paths. For example, important safety property tests never reach the quicksort part of the implementation.
    - The miri side is often limited to `len <= 20` which means it very thoroughly tests the insertion sort, which accounts for 19 out of 1.5k LoC.
    - They are split into to core and alloc, causing code duplication and uneven coverage.
    - ~~The randomness is tied to a caller location, wasting the space exploration capabilities of randomized testing.~~ The randomness is not repeatable, as it relies on `std::hash::RandomState::new().build_hasher()`.
    
    Most of these issues existed before rust-lang#124032, but they are intensified by it. One thing that is new and requires additional testing, is that the new sort implementations specialize based on type properties. For example `Freeze` and non `Freeze` execute different code paths.
    
    Effectively there are three dimensions that matter:
    
    - Input type
    - Input length
    - Input pattern
    
    The ported test-suite tests various properties along all three dimensions, greatly improving test coverage. It side-steps the miri issue by preferring sampled approaches. For example the test that checks if after a panic the set of elements is still the original one, doesn't do so for every single possible panic opportunity but rather it picks one at random, and performs this test across a range of input length, which varies the panic point across them. This allows regular execution to easily test inputs of length 10k, and miri execution up to 100 which covers significantly more code. The randomness used is tied to a fixed - but random per process execution - seed. This allows for fully repeatable tests and fuzzer like exploration across multiple runs.
    
    Structure wise, the tests are previously found in the core integration tests for `sort_unstable` and alloc unit tests for `sort`. The new test-suite was developed to be a purely black-box approach, which makes integration testing the better place, because it can't accidentally rely on internal access. Because unwinding support is required the tests can't be in core, even if the implementation is, so they are now part of the alloc integration tests. Are there architectures that can only build and test core and not alloc? If so, do such platforms require sort testing? For what it's worth the current implementation state passes miri `--target mips64-unknown-linux-gnuabi64` which is big endian.
    
    The test-suite also contains tests for properties that were and are given by the current and previous implementations, and likely relied upon by users but weren't tested. For example `self_cmp` tests that the two parameters `a` and `b` passed into the comparison function are never references to the same object, which if the user is sorting for example a `&mut [Mutex<i32>]` could lead to a deadlock.
    
    Instead of using the hashed caller location as rand seed, it uses seconds since unix epoch / 10, which given timestamps in the CI should be reasonably easy to reproduce, but also allows fuzzer like space exploration.
    
    ---
    
    Test run-time changes:
    
    Setup:
    
    ```
    Linux 6.10
    rustc 1.83.0-nightly (f79a912 2024-09-18)
    AMD Ryzen 9 5900X 12-Core Processor (Zen 3 micro-architecture)
    CPU boost enabled.
    ```
    
    master: e9df22f
    
    Before core integration tests:
    
    ```
    $ LD_LIBRARY_PATH=build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/ hyperfine build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/coretests-219cbd0308a49e2f
      Time (mean ± σ):     869.6 ms ±  21.1 ms    [User: 1327.6 ms, System: 95.1 ms]
      Range (min … max):   845.4 ms … 917.0 ms    10 runs
    
    # MIRIFLAGS="-Zmiri-disable-isolation" to get real time
    $ MIRIFLAGS="-Zmiri-disable-isolation" ./x.py miri library/core
      finished in 738.44s
    ```
    
    After core integration tests:
    
    ```
    $ LD_LIBRARY_PATH=build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/ hyperfine build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/coretests-219cbd0308a49e2f
      Time (mean ± σ):     865.1 ms ±  14.7 ms    [User: 1283.5 ms, System: 88.4 ms]
      Range (min … max):   836.2 ms … 885.7 ms    10 runs
    
    $ MIRIFLAGS="-Zmiri-disable-isolation" ./x.py miri library/core
      finished in 752.35s
    ```
    
    Before alloc unit tests:
    
    ```
    LD_LIBRARY_PATH=build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/ hyperfine build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/alloc-19c15e6e8565aa54
      Time (mean ± σ):     295.0 ms ±   9.9 ms    [User: 719.6 ms, System: 35.3 ms]
      Range (min … max):   284.9 ms … 319.3 ms    10 runs
    
    $ MIRIFLAGS="-Zmiri-disable-isolation" ./x.py miri library/alloc
      finished in 322.75s
    ```
    
    After alloc unit tests:
    
    ```
    LD_LIBRARY_PATH=build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/ hyperfine build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/alloc-19c15e6e8565aa54
      Time (mean ± σ):      97.4 ms ±   4.1 ms    [User: 297.7 ms, System: 28.6 ms]
      Range (min … max):    92.3 ms … 109.2 ms    27 runs
    
    $ MIRIFLAGS="-Zmiri-disable-isolation" ./x.py miri library/alloc
      finished in 309.18s
    ```
    
    Before alloc integration tests:
    
    ```
    $ LD_LIBRARY_PATH=build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/ hyperfine build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/alloctests-439e7300c61a8046
      Time (mean ± σ):     103.2 ms ±   1.7 ms    [User: 135.7 ms, System: 39.4 ms]
      Range (min … max):    99.7 ms … 107.3 ms    28 runs
    
    $ MIRIFLAGS="-Zmiri-disable-isolation" ./x.py miri library/alloc
      finished in 231.35s
    ```
    
    After alloc integration tests:
    
    ```
    $ LD_LIBRARY_PATH=build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/ hyperfine build/x86_64-unknown-linux-gnu/stage0-std/x86_64-unknown-linux-gnu/release/deps/alloctests-439e7300c61a8046
      Time (mean ± σ):     379.8 ms ±   4.7 ms    [User: 4620.5 ms, System: 1157.2 ms]
      Range (min … max):   373.6 ms … 386.9 ms    10 runs
    
    $ MIRIFLAGS="-Zmiri-disable-isolation" ./x.py miri library/alloc
      finished in 449.24s
    ```
    
    In my opinion the results don't change iterative library development or CI execution in meaningful ways. For example currently the library doc-tests take ~66s and incremental compilation takes 10+ seconds. However I only have limited knowledge of the various local development workflows that exist, and might be missing one that is significantly impacted by this change.
    tgross35 authored Oct 11, 2024
    Configuration menu
    Copy the full SHA
    f241d0a View commit details
    Browse the repository at this point in the history
  6. Rollup merge of rust-lang#131109 - tgross35:stabilize-debug_more_non_…

    …exhaustive, r=joboet
    
    Stabilize `debug_more_non_exhaustive`
    
    Fixes: rust-lang#127942
    tgross35 authored Oct 11, 2024
    Configuration menu
    Copy the full SHA
    8797cfe View commit details
    Browse the repository at this point in the history
  7. Rollup merge of rust-lang#131287 - RalfJung:const_result, r=tgross35

    stabilize const_result
    
    Waiting for FCP to complete in rust-lang#82814
    
    Fixes rust-lang#82814
    tgross35 authored Oct 11, 2024
    Configuration menu
    Copy the full SHA
    622fc5e View commit details
    Browse the repository at this point in the history
  8. Rollup merge of rust-lang#131463 - bjoernager:const-char-encode-utf8,…

    … r=RalfJung
    
    Stabilise `const_char_encode_utf8`.
    
    Closes: rust-lang#130512
    
    This PR stabilises the `const_char_encode_utf8` feature gate (i.e. support for `char::encode_utf8` in const scenarios).
    
    Note that the linked tracking issue is currently awaiting FCP.
    tgross35 authored Oct 11, 2024
    Configuration menu
    Copy the full SHA
    8ea41b9 View commit details
    Browse the repository at this point in the history
  9. Rollup merge of rust-lang#131543 - Zalathar:goodbye-llvm-17, r=petroc…

    …henkov
    
    coverage: Remove code related to LLVM 17
    
    In-tree LLVM is 19, and the minimum external LLVM was increased to 18 in rust-lang#130487.
    tgross35 authored Oct 11, 2024
    Configuration menu
    Copy the full SHA
    2c385ba View commit details
    Browse the repository at this point in the history
  10. Rollup merge of rust-lang#131552 - durin42:llvm-20-getOrInsertDeclara…

    …tion, r=cuviper
    
    RustWrapper: adapt for rename of Intrinsic::getDeclaration
    
    llvm/llvm-project@fa789df renamed getDeclaration to getOrInsertDeclaration.
    
    `@rustbot` label: +llvm-main
    tgross35 authored Oct 11, 2024
    Configuration menu
    Copy the full SHA
    6f76d6e View commit details
    Browse the repository at this point in the history