From 5cc020d3df393ff0ba3a209a3f791f8823abf5cf Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 14 May 2024 19:32:11 +0200 Subject: [PATCH 1/7] avoid using aligned_alloc; posix_memalign is better-behaved --- library/std/src/sys/pal/unix/alloc.rs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/library/std/src/sys/pal/unix/alloc.rs b/library/std/src/sys/pal/unix/alloc.rs index 9938c0bac25b0..d1e19329025e5 100644 --- a/library/std/src/sys/pal/unix/alloc.rs +++ b/library/std/src/sys/pal/unix/alloc.rs @@ -89,21 +89,18 @@ cfg_if::cfg_if! { // /memory/aligned_memory.cc libc::memalign(layout.align(), layout.size()) as *mut u8 } - } else if #[cfg(target_os = "wasi")] { - #[inline] - unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 { - // C11 aligned_alloc requires that the size be a multiple of the alignment. - // Layout already checks that the size rounded up doesn't overflow isize::MAX. - let align = layout.align(); - let size = layout.size().next_multiple_of(align); - libc::aligned_alloc(align, size) as *mut u8 - } } else { #[inline] unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 { let mut out = ptr::null_mut(); - // posix_memalign requires that the alignment be a multiple of `sizeof(void*)`. - // Since these are all powers of 2, we can just use max. + // We prefer posix_memalign over aligned_malloc since with aligned_malloc, + // implementations are making almost arbitrary choices for which alignments are + // "supported", making it hard to use. For instance, some implementations require the + // size to be a multiple of the alignment (wasi emmalloc), while others require the + // alignment to be at least the pointer size (Illumos, macOS) -- which may or may not be + // standards-compliant, but that does not help us. + // posix_memalign only has one, clear requirement: that the alignment be a multiple of + // `sizeof(void*)`. Since these are all powers of 2, we can just use max. let align = layout.align().max(crate::mem::size_of::()); let ret = libc::posix_memalign(&mut out, align, layout.size()); if ret != 0 { ptr::null_mut() } else { out as *mut u8 } From c87ae947ebdc868825f9ba23f45ec1a4878be996 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 15 May 2024 11:46:04 +0200 Subject: [PATCH 2/7] Add new `htmldocck` function to `run-make-support` --- src/tools/run-make-support/src/lib.rs | 6 ++++++ .../run-make/rustdoc-scrape-examples-ordering/rmake.rs | 10 ++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/tools/run-make-support/src/lib.rs b/src/tools/run-make-support/src/lib.rs index cc81d23a8ff01..5295388d02cab 100644 --- a/src/tools/run-make-support/src/lib.rs +++ b/src/tools/run-make-support/src/lib.rs @@ -59,6 +59,12 @@ pub fn python_command() -> Command { Command::new(python_path) } +pub fn htmldocck() -> Command { + let mut python = python_command(); + python.arg(source_path().join("/src/etc/htmldocck.py")); + python +} + pub fn source_path() -> PathBuf { std::env::var("S").expect("S variable does not exist").into() } diff --git a/tests/run-make/rustdoc-scrape-examples-ordering/rmake.rs b/tests/run-make/rustdoc-scrape-examples-ordering/rmake.rs index edcf3406d47f8..08ca9ce5de817 100644 --- a/tests/run-make/rustdoc-scrape-examples-ordering/rmake.rs +++ b/tests/run-make/rustdoc-scrape-examples-ordering/rmake.rs @@ -1,4 +1,4 @@ -use run_make_support::{python_command, rustc, rustdoc, source_path, tmp_dir}; +use run_make_support::{htmldocck, rustc, rustdoc, source_path, tmp_dir}; use std::fs::read_dir; use std::path::Path; @@ -45,11 +45,5 @@ fn main() { } rustdoc.run(); - python_command() - .arg(source_path().join("/src/etc/htmldocck.py")) - .arg(out_dir) - .arg("src/lib.rs") - .status() - .unwrap() - .success(); + htmldocck().arg(out_dir).arg("src/lib.rs").status().unwrap().success(); } From c765480efedc191736587b3b890c362b8faa7fa7 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 15 May 2024 11:46:25 +0200 Subject: [PATCH 3/7] Migrate `run-make/rustdoc-themes` to new rmake --- .../tidy/src/allowed_run_make_makefiles.txt | 1 - tests/run-make/rustdoc-themes/Makefile | 11 ------- tests/run-make/rustdoc-themes/rmake.rs | 31 +++++++++++++++++++ 3 files changed, 31 insertions(+), 12 deletions(-) delete mode 100644 tests/run-make/rustdoc-themes/Makefile create mode 100644 tests/run-make/rustdoc-themes/rmake.rs diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt index 5f68f779c4eb0..74aa8fe5949b8 100644 --- a/src/tools/tidy/src/allowed_run_make_makefiles.txt +++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt @@ -246,7 +246,6 @@ run-make/rustdoc-scrape-examples-multiple/Makefile run-make/rustdoc-scrape-examples-remap/Makefile run-make/rustdoc-scrape-examples-test/Makefile run-make/rustdoc-scrape-examples-whitespace/Makefile -run-make/rustdoc-themes/Makefile run-make/rustdoc-verify-output-files/Makefile run-make/rustdoc-with-out-dir-option/Makefile run-make/rustdoc-with-output-option/Makefile diff --git a/tests/run-make/rustdoc-themes/Makefile b/tests/run-make/rustdoc-themes/Makefile deleted file mode 100644 index a4980eb0b3e4d..0000000000000 --- a/tests/run-make/rustdoc-themes/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../tools.mk - -# Test that rustdoc will properly load in a theme file and display it in the theme selector. - -OUTPUT_DIR := "$(TMPDIR)/rustdoc-themes" - -all: - awk '/Begin theme: light/ {in_theme=1;next} /End theme:/ {in_theme=0} { if (in_theme) print }' \ - < '$(S)/src/librustdoc/html/static/css/noscript.css' > '$(TMPDIR)/test.css' - $(RUSTDOC) -o $(OUTPUT_DIR) foo.rs --theme $(TMPDIR)/test.css - $(HTMLDOCCK) $(OUTPUT_DIR) foo.rs diff --git a/tests/run-make/rustdoc-themes/rmake.rs b/tests/run-make/rustdoc-themes/rmake.rs new file mode 100644 index 0000000000000..1d7dfe6bb2a09 --- /dev/null +++ b/tests/run-make/rustdoc-themes/rmake.rs @@ -0,0 +1,31 @@ +// Test that rustdoc will properly load in a theme file and display it in the theme selector. + +use run_make_support::{htmldocck, rustdoc, source_path, tmp_dir}; + +fn main() { + let out_dir = tmp_dir().join("rustdoc-themes"); + let test_css = out_dir.join("test.css"); + + let no_script = + std::fs::read_to_string(source_path().join("src/librustdoc/html/static/css/noscript.css")) + .unwrap(); + + let mut test_content = String::new(); + let mut found_begin_light = false; + for line in no_script.split('\n') { + if line == "/* Begin theme: light */" { + found_begin_light = true; + } else if line == "/* End theme: light */" { + break; + } else if found_begin_light { + test_content.push_str(line); + test_content.push('\n'); + } + } + assert!(!test_content.is_empty()); + std::fs::create_dir_all(&out_dir).unwrap(); + std::fs::write(&test_css, test_content).unwrap(); + + rustdoc().output(&out_dir).input("foo.rs").arg("--theme").arg(&test_css).run(); + htmldocck().arg(out_dir).arg("foo.rs").status().unwrap().success(); +} From cae17ff42b711d0de6f5c70b90bd44b76c3d10c4 Mon Sep 17 00:00:00 2001 From: Oneirical Date: Wed, 15 May 2024 09:58:47 -0400 Subject: [PATCH 4/7] rewrite panic-impl-transitive --- src/tools/tidy/src/allowed_run_make_makefiles.txt | 1 - tests/run-make/panic-impl-transitive/Makefile | 7 ------- tests/run-make/panic-impl-transitive/rmake.rs | 14 ++++++++++++++ 3 files changed, 14 insertions(+), 8 deletions(-) delete mode 100644 tests/run-make/panic-impl-transitive/Makefile create mode 100644 tests/run-make/panic-impl-transitive/rmake.rs diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt index c2358eff61799..cf72a85218e1b 100644 --- a/src/tools/tidy/src/allowed_run_make_makefiles.txt +++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt @@ -192,7 +192,6 @@ run-make/output-with-hyphens/Makefile run-make/override-aliased-flags/Makefile run-make/overwrite-input/Makefile run-make/panic-abort-eh_frame/Makefile -run-make/panic-impl-transitive/Makefile run-make/pass-linker-flags-flavor/Makefile run-make/pass-linker-flags-from-dep/Makefile run-make/pass-linker-flags/Makefile diff --git a/tests/run-make/panic-impl-transitive/Makefile b/tests/run-make/panic-impl-transitive/Makefile deleted file mode 100644 index 9a271a22e10dd..0000000000000 --- a/tests/run-make/panic-impl-transitive/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -include ../tools.mk - -# NOTE we use --emit=llvm-ir to avoid running the linker (linking will fail because there's no main -# in this crate) -all: - $(RUSTC) panic-impl-provider.rs - $(RUSTC) panic-impl-consumer.rs -C panic=abort --emit=llvm-ir -L $(TMPDIR) diff --git a/tests/run-make/panic-impl-transitive/rmake.rs b/tests/run-make/panic-impl-transitive/rmake.rs new file mode 100644 index 0000000000000..4e25f2410e8cc --- /dev/null +++ b/tests/run-make/panic-impl-transitive/rmake.rs @@ -0,0 +1,14 @@ +// In Rust programs where the standard library is unavailable (#![no_std]), we may be interested +// in customizing how panics are handled. Here, the provider specifies that panics should be handled +// by entering an infinite loop. This test checks that this panic implementation can be transitively +// provided by an external crate. +// --emit=llvm-ir is used to avoid running the linker, as linking will fail due to the lack of main +// function in the crate. +// See https://github.com/rust-lang/rust/pull/50338 + +use run_make_support::{rustc, tmp_dir}; + +fn main() { + rustc().input("panic-impl-provider.rs").run(); + rustc().input("panic-impl-consumer.rs").panic("abort").emit("llvm-ir").library_search_path(tmp_dir()).run(); +} From a7484d2e49e8bec4e6b4c2442f07fdc77bf70966 Mon Sep 17 00:00:00 2001 From: Oneirical Date: Wed, 15 May 2024 10:09:19 -0400 Subject: [PATCH 5/7] fix tidy --- tests/run-make/panic-impl-transitive/rmake.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/run-make/panic-impl-transitive/rmake.rs b/tests/run-make/panic-impl-transitive/rmake.rs index 4e25f2410e8cc..86308f593b314 100644 --- a/tests/run-make/panic-impl-transitive/rmake.rs +++ b/tests/run-make/panic-impl-transitive/rmake.rs @@ -10,5 +10,10 @@ use run_make_support::{rustc, tmp_dir}; fn main() { rustc().input("panic-impl-provider.rs").run(); - rustc().input("panic-impl-consumer.rs").panic("abort").emit("llvm-ir").library_search_path(tmp_dir()).run(); + rustc() + .input("panic-impl-consumer.rs") + .panic("abort") + .emit("llvm-ir") + .library_search_path(tmp_dir()) + .run(); } From 72a48fc68c23afd94607a5c5eca3921116d0f434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Le=C3=B3n=20Orell=20Valerian=20Liehr?= Date: Wed, 15 May 2024 20:19:52 +0200 Subject: [PATCH 6/7] Allow unauthenticated users to modify `L-*`, `PG-*` and `-Z*` labels --- triagebot.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/triagebot.toml b/triagebot.toml index 499ba6e470cda..38f3db2be3f9e 100644 --- a/triagebot.toml +++ b/triagebot.toml @@ -9,11 +9,14 @@ allow-unauthenticated = [ "E-*", "F-*", "I-*", + "L-*", "NLL-*", "O-*", + "PG-*", "S-*", "T-*", "WG-*", + "-Z*", "beta-nominated", "const-hack", "llvm-*", From 257d222e4b7243b7555e0033e75b308ea85af7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kostrubiec?= Date: Tue, 14 May 2024 22:33:19 +0200 Subject: [PATCH 7/7] Improved the documentation of the FnAbi struct --- compiler/rustc_target/src/abi/call/mod.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs index 919fa2140d5be..fc79c9232d1bd 100644 --- a/compiler/rustc_target/src/abi/call/mod.rs +++ b/compiler/rustc_target/src/abi/call/mod.rs @@ -779,16 +779,21 @@ impl RiscvInterruptKind { /// Metadata describing how the arguments to a native function /// should be passed in order to respect the native ABI. /// +/// The signature represented by this type may not match the MIR function signature. +/// Certain attributes, like `#[track_caller]` can introduce additional arguments, which are present in [`FnAbi`], but not in `FnSig`. +/// While this difference is rarely relevant, it should still be kept in mind. +/// /// I will do my best to describe this structure, but these /// comments are reverse-engineered and may be inaccurate. -NDM #[derive(Clone, PartialEq, Eq, Hash, HashStable_Generic)] pub struct FnAbi<'a, Ty> { - /// The LLVM types of each argument. + /// The type, layout, and information about how each argument is passed. pub args: Box<[ArgAbi<'a, Ty>]>, - /// LLVM return type. + /// The layout, type, and the way a value is returned from this function. pub ret: ArgAbi<'a, Ty>, + /// Marks this function as variadic (accepting a variable number of arguments). pub c_variadic: bool, /// The count of non-variadic arguments. @@ -796,9 +801,9 @@ pub struct FnAbi<'a, Ty> { /// Should only be different from args.len() when c_variadic is true. /// This can be used to know whether an argument is variadic or not. pub fixed_count: u32, - + /// The calling convention of this function. pub conv: Conv, - + /// Indicates if an unwind may happen across a call to this function. pub can_unwind: bool, }