Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit de018e3

Browse files
committedMar 14, 2025
Auto merge of rust-lang#138486 - jhpratt:rollup-765wijj, r=jhpratt
Rollup of 6 pull requests Successful merges: - rust-lang#134720 (Display valid crate types in error message for --crate-type flag) - rust-lang#137424 (uefi: helpers: Add DevicePathNode abstractions) - rust-lang#137736 (Don't attempt to export compiler-builtins symbols from rust dylibs) - rust-lang#138451 (Build GCC on CI with GCC, not Clang) - rust-lang#138454 (Improve post-merge workflow) - rust-lang#138477 (Deny impls for `BikeshedGuaranteedNoDrop`) r? `@ghost` `@rustbot` modify labels: rollup
2 parents f7b4354 + 98c85a3 commit de018e3

File tree

21 files changed

+447
-138
lines changed

21 files changed

+447
-138
lines changed
 

‎.github/workflows/post-merge.yml

+6-1
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,13 @@ jobs:
3535
3636
cd src/ci/citool
3737
38-
echo "Post-merge analysis result" > output.log
38+
printf "*This is an experimental post-merge analysis report. You can ignore it.*\n\n" > output.log
39+
printf "<details>\n<summary>Post-merge report</summary>\n\n" >> output.log
40+
3941
cargo run --release post-merge-report ${PARENT_COMMIT} ${{ github.sha }} >> output.log
42+
43+
printf "</details>\n" >> output.log
44+
4045
cat output.log
4146
4247
gh pr comment ${HEAD_PR} -F output.log

‎compiler/rustc_codegen_ssa/src/back/linker.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1784,7 +1784,10 @@ fn exported_symbols_for_non_proc_macro(tcx: TyCtxt<'_>, crate_type: CrateType) -
17841784
let mut symbols = Vec::new();
17851785
let export_threshold = symbol_export::crates_export_threshold(&[crate_type]);
17861786
for_each_exported_symbols_include_dep(tcx, crate_type, |symbol, info, cnum| {
1787-
if info.level.is_below_threshold(export_threshold) {
1787+
// Do not export mangled symbols from cdylibs and don't attempt to export compiler-builtins
1788+
// from any cdylib. The latter doesn't work anyway as we use hidden visibility for
1789+
// compiler-builtins. Most linkers silently ignore it, but ld64 gives a warning.
1790+
if info.level.is_below_threshold(export_threshold) && !tcx.is_compiler_builtins(cnum) {
17881791
symbols.push(symbol_export::exporting_symbol_name_for_instance_in_crate(
17891792
tcx, symbol, cnum,
17901793
));

‎compiler/rustc_passes/messages.ftl

+2-2
Original file line numberDiff line numberDiff line change
@@ -811,8 +811,8 @@ passes_unused_duplicate =
811811
passes_unused_empty_lints_note =
812812
attribute `{$name}` with an empty list has no effect
813813
814-
passes_unused_linker_warnings_note =
815-
the `linker_warnings` lint can only be controlled at the root of a crate that needs to be linked
814+
passes_unused_linker_messages_note =
815+
the `linker_messages` lint can only be controlled at the root of a crate that needs to be linked
816816
817817
passes_unused_multiple =
818818
multiple `{$name}` attributes

‎compiler/rustc_passes/src/check_attr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2387,7 +2387,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
23872387
.iter()
23882388
.all(|kind| matches!(kind, CrateType::Rlib | CrateType::Staticlib));
23892389
if never_needs_link {
2390-
errors::UnusedNote::LinkerWarningsBinaryCrateOnly
2390+
errors::UnusedNote::LinkerMessagesBinaryCrateOnly
23912391
} else {
23922392
return;
23932393
}

‎compiler/rustc_passes/src/errors.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -770,8 +770,8 @@ pub(crate) enum UnusedNote {
770770
NoLints { name: Symbol },
771771
#[note(passes_unused_default_method_body_const_note)]
772772
DefaultMethodBodyConst,
773-
#[note(passes_unused_linker_warnings_note)]
774-
LinkerWarningsBinaryCrateOnly,
773+
#[note(passes_unused_linker_messages_note)]
774+
LinkerMessagesBinaryCrateOnly,
775775
}
776776

777777
#[derive(LintDiagnostic)]

‎compiler/rustc_session/src/config.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -2709,7 +2709,12 @@ pub fn parse_crate_types_from_list(list_list: Vec<String>) -> Result<Vec<CrateTy
27092709
"cdylib" => CrateType::Cdylib,
27102710
"bin" => CrateType::Executable,
27112711
"proc-macro" => CrateType::ProcMacro,
2712-
_ => return Err(format!("unknown crate type: `{part}`")),
2712+
_ => {
2713+
return Err(format!(
2714+
"unknown crate type: `{part}`, expected one of: \
2715+
`lib`, `rlib`, `staticlib`, `dylib`, `cdylib`, `bin`, `proc-macro`",
2716+
));
2717+
}
27132718
};
27142719
if !crate_types.contains(&new_part) {
27152720
crate_types.push(new_part)

‎library/core/src/marker.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -465,9 +465,13 @@ impl<T: ?Sized> Copy for &T {}
465465
/// Notably, this doesn't include all trivially-destructible types for semver
466466
/// reasons.
467467
///
468-
/// Bikeshed name for now.
468+
/// Bikeshed name for now. This trait does not do anything other than reflect the
469+
/// set of types that are allowed within unions for field validity.
469470
#[unstable(feature = "bikeshed_guaranteed_no_drop", issue = "none")]
470471
#[lang = "bikeshed_guaranteed_no_drop"]
472+
#[rustc_deny_explicit_impl]
473+
#[rustc_do_not_implement_via_object]
474+
#[doc(hidden)]
471475
pub trait BikeshedGuaranteedNoDrop {}
472476

473477
/// Types for which it is safe to share references between threads.

‎library/std/src/sys/pal/uefi/helpers.rs

+179
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,60 @@ pub(crate) fn device_path_to_text(path: NonNull<device_path::Protocol>) -> io::R
216216
Err(io::const_error!(io::ErrorKind::NotFound, "no device path to text protocol found"))
217217
}
218218

219+
fn device_node_to_text(path: NonNull<device_path::Protocol>) -> io::Result<OsString> {
220+
fn node_to_text(
221+
protocol: NonNull<device_path_to_text::Protocol>,
222+
path: NonNull<device_path::Protocol>,
223+
) -> io::Result<OsString> {
224+
let path_ptr: *mut r_efi::efi::Char16 = unsafe {
225+
((*protocol.as_ptr()).convert_device_node_to_text)(
226+
path.as_ptr(),
227+
// DisplayOnly
228+
r_efi::efi::Boolean::FALSE,
229+
// AllowShortcuts
230+
r_efi::efi::Boolean::FALSE,
231+
)
232+
};
233+
234+
let path = os_string_from_raw(path_ptr)
235+
.ok_or(io::const_error!(io::ErrorKind::InvalidData, "Invalid path"))?;
236+
237+
if let Some(boot_services) = crate::os::uefi::env::boot_services() {
238+
let boot_services: NonNull<r_efi::efi::BootServices> = boot_services.cast();
239+
unsafe {
240+
((*boot_services.as_ptr()).free_pool)(path_ptr.cast());
241+
}
242+
}
243+
244+
Ok(path)
245+
}
246+
247+
static LAST_VALID_HANDLE: AtomicPtr<crate::ffi::c_void> =
248+
AtomicPtr::new(crate::ptr::null_mut());
249+
250+
if let Some(handle) = NonNull::new(LAST_VALID_HANDLE.load(Ordering::Acquire)) {
251+
if let Ok(protocol) = open_protocol::<device_path_to_text::Protocol>(
252+
handle,
253+
device_path_to_text::PROTOCOL_GUID,
254+
) {
255+
return node_to_text(protocol, path);
256+
}
257+
}
258+
259+
let device_path_to_text_handles = locate_handles(device_path_to_text::PROTOCOL_GUID)?;
260+
for handle in device_path_to_text_handles {
261+
if let Ok(protocol) = open_protocol::<device_path_to_text::Protocol>(
262+
handle,
263+
device_path_to_text::PROTOCOL_GUID,
264+
) {
265+
LAST_VALID_HANDLE.store(handle.as_ptr(), Ordering::Release);
266+
return node_to_text(protocol, path);
267+
}
268+
}
269+
270+
Err(io::const_error!(io::ErrorKind::NotFound, "No device path to text protocol found"))
271+
}
272+
219273
/// Gets RuntimeServices.
220274
pub(crate) fn runtime_services() -> Option<NonNull<r_efi::efi::RuntimeServices>> {
221275
let system_table: NonNull<r_efi::efi::SystemTable> =
@@ -319,6 +373,11 @@ impl<'a> BorrowedDevicePath<'a> {
319373
pub(crate) fn to_text(&self) -> io::Result<OsString> {
320374
device_path_to_text(self.protocol)
321375
}
376+
377+
#[expect(dead_code)]
378+
pub(crate) const fn iter(&'a self) -> DevicePathIterator<'a> {
379+
DevicePathIterator::new(DevicePathNode::new(self.protocol))
380+
}
322381
}
323382

324383
impl<'a> crate::fmt::Debug for BorrowedDevicePath<'a> {
@@ -330,6 +389,126 @@ impl<'a> crate::fmt::Debug for BorrowedDevicePath<'a> {
330389
}
331390
}
332391

392+
pub(crate) struct DevicePathIterator<'a>(Option<DevicePathNode<'a>>);
393+
394+
impl<'a> DevicePathIterator<'a> {
395+
const fn new(node: DevicePathNode<'a>) -> Self {
396+
if node.is_end() { Self(None) } else { Self(Some(node)) }
397+
}
398+
}
399+
400+
impl<'a> Iterator for DevicePathIterator<'a> {
401+
type Item = DevicePathNode<'a>;
402+
403+
fn next(&mut self) -> Option<Self::Item> {
404+
let cur_node = self.0?;
405+
406+
let next_node = unsafe { cur_node.next_node() };
407+
self.0 = if next_node.is_end() { None } else { Some(next_node) };
408+
409+
Some(cur_node)
410+
}
411+
}
412+
413+
#[derive(Copy, Clone)]
414+
pub(crate) struct DevicePathNode<'a> {
415+
protocol: NonNull<r_efi::protocols::device_path::Protocol>,
416+
phantom: PhantomData<&'a r_efi::protocols::device_path::Protocol>,
417+
}
418+
419+
impl<'a> DevicePathNode<'a> {
420+
pub(crate) const fn new(protocol: NonNull<r_efi::protocols::device_path::Protocol>) -> Self {
421+
Self { protocol, phantom: PhantomData }
422+
}
423+
424+
pub(crate) const fn length(&self) -> u16 {
425+
let len = unsafe { (*self.protocol.as_ptr()).length };
426+
u16::from_le_bytes(len)
427+
}
428+
429+
pub(crate) const fn node_type(&self) -> u8 {
430+
unsafe { (*self.protocol.as_ptr()).r#type }
431+
}
432+
433+
pub(crate) const fn sub_type(&self) -> u8 {
434+
unsafe { (*self.protocol.as_ptr()).sub_type }
435+
}
436+
437+
pub(crate) fn data(&self) -> &[u8] {
438+
let length: usize = self.length().into();
439+
440+
// Some nodes do not have any special data
441+
if length > 4 {
442+
let raw_ptr: *const u8 = self.protocol.as_ptr().cast();
443+
let data = unsafe { raw_ptr.add(4) };
444+
unsafe { crate::slice::from_raw_parts(data, length - 4) }
445+
} else {
446+
&[]
447+
}
448+
}
449+
450+
pub(crate) const fn is_end(&self) -> bool {
451+
self.node_type() == r_efi::protocols::device_path::TYPE_END
452+
&& self.sub_type() == r_efi::protocols::device_path::End::SUBTYPE_ENTIRE
453+
}
454+
455+
#[expect(dead_code)]
456+
pub(crate) const fn is_end_instance(&self) -> bool {
457+
self.node_type() == r_efi::protocols::device_path::TYPE_END
458+
&& self.sub_type() == r_efi::protocols::device_path::End::SUBTYPE_INSTANCE
459+
}
460+
461+
pub(crate) unsafe fn next_node(&self) -> Self {
462+
let node = unsafe {
463+
self.protocol
464+
.cast::<u8>()
465+
.add(self.length().into())
466+
.cast::<r_efi::protocols::device_path::Protocol>()
467+
};
468+
Self::new(node)
469+
}
470+
471+
#[expect(dead_code)]
472+
pub(crate) fn to_path(&'a self) -> BorrowedDevicePath<'a> {
473+
BorrowedDevicePath::new(self.protocol)
474+
}
475+
476+
pub(crate) fn to_text(&self) -> io::Result<OsString> {
477+
device_node_to_text(self.protocol)
478+
}
479+
}
480+
481+
impl<'a> PartialEq for DevicePathNode<'a> {
482+
fn eq(&self, other: &Self) -> bool {
483+
let self_len = self.length();
484+
let other_len = other.length();
485+
486+
self_len == other_len
487+
&& unsafe {
488+
compiler_builtins::mem::memcmp(
489+
self.protocol.as_ptr().cast(),
490+
other.protocol.as_ptr().cast(),
491+
usize::from(self_len),
492+
) == 0
493+
}
494+
}
495+
}
496+
497+
impl<'a> crate::fmt::Debug for DevicePathNode<'a> {
498+
fn fmt(&self, f: &mut crate::fmt::Formatter<'_>) -> crate::fmt::Result {
499+
match self.to_text() {
500+
Ok(p) => p.fmt(f),
501+
Err(_) => f
502+
.debug_struct("DevicePathNode")
503+
.field("type", &self.node_type())
504+
.field("sub_type", &self.sub_type())
505+
.field("length", &self.length())
506+
.field("specific_device_path_data", &self.data())
507+
.finish(),
508+
}
509+
}
510+
}
511+
333512
pub(crate) struct OwnedProtocol<T> {
334513
guid: r_efi::efi::Guid,
335514
handle: NonNull<crate::ffi::c_void>,

‎src/bootstrap/src/core/build_steps/dist.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2481,7 +2481,7 @@ impl Step for Gcc {
24812481
fn run(self, builder: &Builder<'_>) -> Self::Output {
24822482
let tarball = Tarball::new(builder, "gcc", &self.target.triple);
24832483
let output = builder.ensure(super::gcc::Gcc { target: self.target });
2484-
tarball.add_file(output.libgccjit, ".", 0o644);
2484+
tarball.add_file(output.libgccjit, "lib", 0o644);
24852485
tarball.generate()
24862486
}
24872487
}

‎src/bootstrap/src/core/build_steps/gcc.rs

+24-14
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,23 @@ impl Step for Gcc {
6363
}
6464

6565
build_gcc(&metadata, builder, target);
66-
67-
let lib_alias = metadata.install_dir.join("lib/libgccjit.so.0");
68-
if !lib_alias.exists() {
69-
t!(builder.symlink_file(&libgccjit_path, lib_alias));
70-
}
66+
create_lib_alias(builder, &libgccjit_path);
7167

7268
t!(metadata.stamp.write());
7369

7470
GccOutput { libgccjit: libgccjit_path }
7571
}
7672
}
7773

74+
/// Creates a libgccjit.so.0 alias next to libgccjit.so if it does not
75+
/// already exist
76+
fn create_lib_alias(builder: &Builder<'_>, libgccjit: &PathBuf) {
77+
let lib_alias = libgccjit.parent().unwrap().join("libgccjit.so.0");
78+
if !lib_alias.exists() {
79+
t!(builder.symlink_file(libgccjit, lib_alias));
80+
}
81+
}
82+
7883
pub struct Meta {
7984
stamp: BuildStamp,
8085
out_dir: PathBuf,
@@ -109,8 +114,10 @@ fn try_download_gcc(builder: &Builder<'_>, target: TargetSelection) -> Option<Pa
109114
builder.config.download_ci_gcc(&sha, &root);
110115
t!(gcc_stamp.write());
111116
}
112-
// FIXME: put libgccjit.so into a lib directory in dist::Gcc
113-
Some(root.join("libgccjit.so"))
117+
118+
let libgccjit = root.join("lib").join("libgccjit.so");
119+
create_lib_alias(builder, &libgccjit);
120+
Some(libgccjit)
114121
}
115122

116123
#[cfg(test)]
@@ -177,6 +184,14 @@ fn libgccjit_built_path(install_dir: &Path) -> PathBuf {
177184
}
178185

179186
fn build_gcc(metadata: &Meta, builder: &Builder<'_>, target: TargetSelection) {
187+
if builder.build.cc_tool(target).is_like_clang()
188+
|| builder.build.cxx_tool(target).is_like_clang()
189+
{
190+
panic!(
191+
"Attempting to build GCC using Clang, which is known to misbehave. Please use GCC as the host C/C++ compiler. "
192+
);
193+
}
194+
180195
let Meta { stamp: _, out_dir, install_dir, root } = metadata;
181196

182197
t!(fs::create_dir_all(out_dir));
@@ -203,18 +218,13 @@ fn build_gcc(metadata: &Meta, builder: &Builder<'_>, target: TargetSelection) {
203218
let mut configure_cmd = command(src_dir.join("configure"));
204219
configure_cmd
205220
.current_dir(out_dir)
206-
// On CI, we compile GCC with Clang.
207-
// The -Wno-everything flag is needed to make GCC compile with Clang 19.
208-
// `-g -O2` are the default flags that are otherwise used by Make.
209-
// FIXME(kobzol): change the flags once we have [gcc] configuration in config.toml.
210-
.env("CXXFLAGS", "-Wno-everything -g -O2")
211-
.env("CFLAGS", "-Wno-everything -g -O2")
212221
.arg("--enable-host-shared")
213-
.arg("--enable-languages=jit")
222+
.arg("--enable-languages=c,jit,lto")
214223
.arg("--enable-checking=release")
215224
.arg("--disable-bootstrap")
216225
.arg("--disable-multilib")
217226
.arg(format!("--prefix={}", install_dir.display()));
227+
218228
let cc = builder.build.cc(target).display().to_string();
219229
let cc = builder
220230
.build

‎src/bootstrap/src/lib.rs

+11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use std::{env, fs, io, str};
2727

2828
use build_helper::ci::gha;
2929
use build_helper::exit;
30+
use cc::Tool;
3031
use termcolor::{ColorChoice, StandardStream, WriteColor};
3132
use utils::build_stamp::BuildStamp;
3233
use utils::channel::GitInfo;
@@ -1218,6 +1219,16 @@ Executed at: {executed_at}"#,
12181219
self.cc.borrow()[&target].path().into()
12191220
}
12201221

1222+
/// Returns the internal `cc::Tool` for the C compiler.
1223+
fn cc_tool(&self, target: TargetSelection) -> Tool {
1224+
self.cc.borrow()[&target].clone()
1225+
}
1226+
1227+
/// Returns the internal `cc::Tool` for the C++ compiler.
1228+
fn cxx_tool(&self, target: TargetSelection) -> Tool {
1229+
self.cxx.borrow()[&target].clone()
1230+
}
1231+
12211232
/// Returns C flags that `cc-rs` thinks should be enabled for the
12221233
/// specified target by default.
12231234
fn cc_handled_clags(&self, target: TargetSelection, c: CLang) -> Vec<String> {
There was a problem loading the remainder of the diff.

0 commit comments

Comments
 (0)
Failed to load comments.