Ramon de C Valle [Tue, 22 Nov 2022 05:29:00 +0000 (21:29 -0800)]
Add LLVM KCFI support to the Rust compiler
This commit adds LLVM Kernel Control Flow Integrity (KCFI) support to
the Rust compiler. It initially provides forward-edge control flow
protection for operating systems kernels for Rust-compiled code only by
aggregating function pointers in groups identified by their return and
parameter types. (See llvm/llvm-project@cff5bef.)
Forward-edge control flow protection for C or C++ and Rust -compiled
code "mixed binaries" (i.e., for when C or C++ and Rust -compiled code
share the same virtual address space) will be provided in later work as
part of this project by identifying C char and integer type uses at the
time types are encoded (see Type metadata in the design document in the
tracking issue #89653).
Michael Howell [Fri, 9 Dec 2022 00:38:07 +0000 (17:38 -0700)]
rustdoc: remove no-op mobile CSS `#sidebar-toggle { text-align }`
Since 8b001b4da0716936e0ca32303cc0e3c5e53e42f8 make the sidebar toggle a
flex container, and already centers its content in desktop mode, this
rule doesn't do anything.
Arpad Borsos [Tue, 29 Nov 2022 22:17:08 +0000 (23:17 +0100)]
Fix Async Generator ABI
This change was missed when making async generators implement `Future` directly.
It did not cause any problems in codegen so far, as `GeneratorState<(), Output>`
happens to have the same ABI as `Poll<Output>`.
Dan Gohman [Thu, 8 Dec 2022 18:35:46 +0000 (10:35 -0800)]
Mangle "main" as "__main_void" on wasm32-wasi
On wasm, the age-old C trick of having a main function which can either have
no arguments or argc+argv doesn't work, because wasm requires caller and
callee signatures to match. WASI's current strategy is to have compilers
mangle main's name to indicate which signature they're using. Rust uses the
no-argument form, which should be mangled as `__main_void`.
Joshua Nelson [Thu, 8 Dec 2022 13:59:05 +0000 (07:59 -0600)]
Build rust-analyzer proc-macro server by default
This allows getting rid of some documentation and an extra step when building a custom toolchain: https://rustc-dev-guide.rust-lang.org/building/how-to-build-and-run.html#creating-a-rustup-toolchain
and it seems likely that people will want to do this if they want rustdoc (which is also built by default).
Matthias Krüger [Thu, 8 Dec 2022 11:57:33 +0000 (12:57 +0100)]
Rollup merge of #105434 - nbdd0121:lib, r=thomcc
Fix warning when libcore is compiled with no_fp_fmt_parse
Discovered when trying to compile Rust-for-Linux with Rust 1.66 beta.
It'll be helpful if this is backported to beta (should be trivial enough for backporting), so Rust-for-Linux's rust version bump wouldn't need to do `--cap-lints allow` for libcore.
Matthias Krüger [Thu, 8 Dec 2022 11:57:31 +0000 (12:57 +0100)]
Rollup merge of #105408 - cuviper:help-rpitirpit, r=compiler-errors
Add help for `#![feature(impl_trait_in_fn_trait_return)]`
This adds a new variant `ImplTraitContext::FeatureGated`, so we can
generalize the help for `return_position_impl_trait_in_trait` to also
work for `impl_trait_in_fn_trait_return`.
Matthias Krüger [Thu, 8 Dec 2022 11:57:30 +0000 (12:57 +0100)]
Rollup merge of #105405 - sunfishcode:sunfishcode/export-dynamic, r=TaKO8Ki
Stop passing -export-dynamic to wasm-ld.
-export-dynamic was a temporary hack added in the early days of the Rust wasm32 target when Rust didn't have a way to specify wasm exports in the source code. This flag causes all global symbols, and some compiler-internal symbols, to be exported, which is often more than needed.
Rust now does have a way to specify exports in the source code: `#[export_name = "..."]`.
So as the original comment suggests, -export-dynamic can now be removed, allowing users to have smaller binaries and better encapsulation in their wasm32-unknown-unknown modules.
It's possible that this change will require existing wasm32-unknown-unknown users will to add explicit `#[export_name = "..."]` directives to exporrt the symbols that their programs depend on having exported.
Matthias Krüger [Thu, 8 Dec 2022 11:57:30 +0000 (12:57 +0100)]
Rollup merge of #105317 - RalfJung:retag-rework, r=oli-obk
make retagging work even with 'unstable' places
This is based on top of https://github.com/rust-lang/rust/pull/105301. Only the last two commits are new.
While investigating https://github.com/rust-lang/unsafe-code-guidelines/issues/381 I realized that we would have caught this issue much earlier if the add_retag pass wouldn't bail out on assignments of the form `*ptr = ...`.
So this PR changes our retag strategy:
- When a new reference is created via `Rvalue::Ref` (or a raw ptr via `Rvalue::AddressOf`), we do the retagging as part of just executing that address-taking operation.
- For everything else, we still insert retags -- these retags basically serve to ensure that references stored in local variables (and their fields) are always freshly tagged, so skipping this for assignments like `*ptr = ...` is less egregious.
r? ```@oli-obk```
Matthias Krüger [Thu, 8 Dec 2022 11:57:29 +0000 (12:57 +0100)]
Rollup merge of #105120 - solid-rs:patch/kmc-solid/maintainance, r=thomcc
kmc-solid: `std::sys` code maintenance
Includes a set of changes to fix the [`*-kmc-solid_*`](https://doc.rust-lang.org/nightly/rustc/platform-support/kmc-solid.html) Tier 3 targets and make some other improvements.
- Address `fuzzy_provenance_casts` by using `expose_addr` and `from_exposed_addr` for pointer-integer casts
- Add a stub implementation of `is_terminal` (#98070)
- Address `unused_imports` and `unused_unsafe`
- Stop doing `Box::from_raw(&*(x: Box<T>) as *const T as *mut T)`
Michael Howell [Thu, 8 Dec 2022 04:59:54 +0000 (21:59 -0700)]
rustdoc: clean up docblock table CSS
* The rule `display: block` had no noticeable effect. Technically, because
markdown tables have a tbody and thead, they get wrapped in an [anonymous
table box] in the CSS tree, nested within the `<table>` element's block
layout box.
This rule was added in #87230 to make the table side-scrolling, but
this same issue was doubly fixed in #88742 by wrapping it in an explicit
`<div>` tag. Since accessibility advocates recommend the wrapper div over
marking the table as `display: block`, we'll stick with that.
bors [Thu, 8 Dec 2022 03:04:51 +0000 (03:04 +0000)]
Auto merge of #105425 - matthiaskrgr:rollup-3ngvxmt, r=matthiaskrgr
Rollup of 6 pull requests
Successful merges:
- #105267 (Don't ICE in ExprUseVisitor on FRU for non-existent struct)
- #105343 (Simplify attribute handling in rustc_ast_lowering)
- #105368 (Remove more `ref` patterns from the compiler)
- #105400 (normalize before handling simple checks for evaluatability of `ty::Const`)
- #105403 (rustdoc: simplify CSS selectors for item table `.stab`)
- #105418 (fix: remove hack from link.rs)
Gavin Li [Sun, 4 Dec 2022 05:54:38 +0000 (21:54 -0800)]
Avoid heap allocation when truncating thread names
Ensure that heap allocation does not occur in a thread until std::thread
is ready. This fixes issues with custom allocators that call
std::thread::current(), since doing so prematurely initializes
THREAD_INFO and causes the following thread_info::set() to fail.
Will Crichton [Sun, 27 Nov 2022 19:11:21 +0000 (13:11 -0600)]
Improve several aspects of the Rustdoc scrape-examples UI.
* Examples take up less screen height.
* Snippets from binary crates are prioritized.
* toggle-all-docs does not expand "More examples" sections.
Alex Brachet [Mon, 5 Dec 2022 06:37:21 +0000 (06:37 +0000)]
Don't internalize __llvm_profile_counter_bias
Currently, LLVM profiling runtime counter relocation cannot be
used by rust during LTO because symbols are being internalized
before all symbol information is known.
This mode makes LLVM emit a __llvm_profile_counter_bias symbol
which is referenced by the profiling initialization, which itself
is pulled in by the rust driver here [1].
It is enabled with -Cllvm-args=-runtime-counter-relocation for
platforms which are opt-in to this mode like Linux. On these
platforms there will be no link error, rather just surprising
behavior for a user which request runtime counter relocation.
The profiling runtime will not see that symbol go on as if it
were never there. On Fuchsia, the profiling runtime must have
this symbol which will cause a hard link error.
As an aside, I don't have enough context as to why rust's LTO
model is how it is. AFAICT, the internalize pass is only safe
to run at link time when all symbol information is actually
known, this being an example as to why. I think special casing
this symbol as a known one that LLVM can emit which should not
have it's visbility de-escalated should be fine given how
seldom this pattern of defining an undefined symbol to get
initilization code pulled in is. From a quick grep,
__llvm_profile_runtime is the only symbol that rustc does this
for.
Matthias Krüger [Wed, 7 Dec 2022 14:39:08 +0000 (15:39 +0100)]
Rollup merge of #105400 - BoxyUwU:braced_param_evaluatability, r=oli-obk
normalize before handling simple checks for evaluatability of `ty::Const`
`{{{{{{{ N }}}}}}}` is desugared into a `ConstKind::Unevaluated` for an anonymous `const` item so when calling `is_const_evaluatable` on it we skip the `ConstKind::Param(_) => Ok(())` arm which is incorrect.
Matthias Krüger [Wed, 7 Dec 2022 14:39:07 +0000 (15:39 +0100)]
Rollup merge of #105343 - nbdd0121:hir, r=fee1-dead
Simplify attribute handling in rustc_ast_lowering
Given that attributes is stored in a separate BTreeMap, it's not necessary to pass it in when constructing `hir::Expr`. We can just construct `hir::Expr` and then call `self.lower_attrs` later if it needs attributes.
As most desugaring code don't use attributes, this allows some code cleanup.
bors [Wed, 7 Dec 2022 13:52:52 +0000 (13:52 +0000)]
Auto merge of #103459 - ChrisDenton:propagate-nulls, r=thomcc
Pass on null handle values to child process
Fixes #101645
In Windows, stdio handles are (semantically speaking) `Option<Handle>` where `Handle` is a non-zero value. When spawning a process with `Stdio::Inherit`, Rust currently turns zero values into `-1` values. This has the unfortunate effect of breaking console subprocesses (which typically need stdio) that are spawned from gui applications (that lack stdio by default) because the console process won't be assigned handles from the newly created console (as they usually would in that situation). Worse, `-1` is actually [a valid handle](https://doc.rust-lang.org/std/os/windows/io/struct.OwnedHandle.html) which means "the current process". So if a console process, for example, waits on stdin and it has a `-1` value then the process will end up waiting on itself.
This PR fixes it by propagating the nulls instead of converting them to `-1`.
While I think the current behaviour is a mistake, changing it (however justified) is an API change so I think this PR should at least have some input from t-libs-api. So choosing at random...
bors [Wed, 7 Dec 2022 06:16:19 +0000 (06:16 +0000)]
Auto merge of #105395 - sunfishcode:sunfishcode/update-wasi, r=pietroalbini
Update the wasi toolchain.
Update the WASI build to LLVM 15.0 and the wasi-libc version from [wasi-sdk-17].
This will require a ci-mirrors.rust-lang.org file load. Specifically, we need [this LLVM release tarball] uploaded to be downloadable from [this URL].
The biggest change in wasi-sdk-17 is that user exports no longer automatically run constructor functions. More details at: https://github.com/WebAssembly/WASI/issues/493.
bors [Wed, 7 Dec 2022 03:52:19 +0000 (03:52 +0000)]
Auto merge of #105291 - nnethercote:remove-LintPassObjects, r=cjgillot
Remove `{Early,Late}LintPassObjects`.
`EarlyContextAndPass` wraps a single early lint pass. We aggregate multiple passes into that single pass by using `EarlyLintPassObjects`.
This commit removes `EarlyLintPassObjects` by changing `EarlyContextAndPass` into `EarlyContextAndPasses`. I.e. it just removes a level of indirection. This makes the code simpler and slightly faster.
Josh Stone [Wed, 7 Dec 2022 01:53:50 +0000 (17:53 -0800)]
Add help for `#![feature(impl_trait_in_fn_trait_return)]`
This adds a new variant `ImplTraitContext::FeatureGated`, so we can
generalize the help for `return_position_impl_trait_in_trait` to also
work for `impl_trait_in_fn_trait_return`.
Dan Gohman [Wed, 7 Dec 2022 00:50:29 +0000 (16:50 -0800)]
Stop passing -export-dynamic to wasm-ld.
-export-dynamic was a temporary hack added in the early days of the Rust
wasm32 target when Rust didn't have a way to specify wasm exports in the
source code. This flag causes all global symbols, and some compiler-internal
symbols, to be exported, which is often more than needed.
Rust now does have a way to specify exports in the source code:
`#[export_name = "..."]`.
So as the original comment suggests, -export-dynamic can now be removed,
allowing users to have smaller binaries and better encapsulation in
their wasm32-unknown-unknown modules.
It's possible that this change will require existing wasm32-unknown-unknown
users will to add explicit `#[export_name = "..."]` directives to
exporrt the symbols that their programs depend on having exported.
bors [Wed, 7 Dec 2022 00:32:57 +0000 (00:32 +0000)]
Auto merge of #105397 - matthiaskrgr:rollup-xv5imz8, r=matthiaskrgr
Rollup of 6 pull requests
Successful merges:
- #105298 (llvm-wrapper: adapt for an LLVM API change)
- #105358 (Add a test for #104260)
- #105380 (add const generics ping files things for me)
- #105382 (remove an excess `this`)
- #105388 (rustdoc: remove redundant CSS `.import-item .stab { font-size }`)
- #105390 (unstable-book: Add `ignore` to `abi_efiapi` example code)
Matthias Krüger [Tue, 6 Dec 2022 22:13:52 +0000 (23:13 +0100)]
Rollup merge of #105390 - nicholasbishop:bishop-example-ignore, r=ehuss
unstable-book: Add `ignore` to `abi_efiapi` example code
This example doesn't compile on targets that don't support UEFI, as reported here:
https://github.com/rust-lang/rust/pull/104793#issuecomment-1339783727
This sets the exact same font size that `.stab` has by default anyway. It used to be slightly different, but dd5ff428edbc7cd4fa600b81f27bbec28589704f made it identical.
Found via our experimental rust + llvm @ HEAD bot: https://buildkite.com/llvm-project/rust-llvm-integrate-prototype/builds/15404#0184d95d-5a68-4db6-ad32-51ddbc3ab543/202-571
Nicholas Bishop [Tue, 6 Dec 2022 19:22:56 +0000 (14:22 -0500)]
unstable-book: Add `ignore` to `abi_efiapi` example code
This example doesn't compile on targets that don't support UEFI, as
reported here:
https://github.com/rust-lang/rust/pull/104793#issuecomment-1339783727