Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions bootstrap.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,13 @@
# FIXME(#61117): Some tests fail when this option is enabled.
#rust.debuginfo-level-tests = 0

# Compress debuginfo of Rust and C/C++ code.
# Valid options:
# - "off" or false: disable compression
# - true: compress debuginfo with the default compression method (currently zlib)
# - "zlib": compress debuginfo with zlib
#rust.compress-debuginfo = "off"

# Should rustc and the standard library be built with split debuginfo? Default
# is platform dependent.
#
Expand Down Expand Up @@ -1019,6 +1026,13 @@
# and enabling it causes issues.
#split-debuginfo = if linux || windows-gnu { off } else if windows-msvc { packed } else if apple { unpacked }

# Compress debuginfo for Rust and C/C++ code of this target.
# Valid options:
# - "off" or false: disable compression
# - true: compress debuginfo with the default compression method (currently zlib)
# - "zlib": compress debuginfo with zlib
#compress-debuginfo = "off"

# Path to the `llvm-config` binary of the installation of a custom LLVM to link
# against. Note that if this is specified we don't compile LLVM at all for this
# target.
Expand Down
6 changes: 4 additions & 2 deletions compiler/rustc_arena/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -542,11 +542,12 @@ impl DroplessArena {

#[inline]
pub fn alloc_from_iter<T, I: IntoIterator<Item = T>>(&self, iter: I) -> &mut [T] {
assert!(!mem::needs_drop::<T>());
assert!(size_of::<T>() != 0);

// Warning: this function is reentrant: `iter` could hold a reference to `&self` and
// allocate additional elements while we're iterating.
let iter = iter.into_iter();
assert!(size_of::<T>() != 0);
assert!(!mem::needs_drop::<T>());

let size_hint = iter.size_hint();

Expand Down Expand Up @@ -577,6 +578,7 @@ impl DroplessArena {
) -> Result<&mut [T], E> {
// Despite the similarity with `alloc_from_iter`, we cannot reuse their fast case, as we
// cannot know the minimum length of the iterator in this case.
assert!(!mem::needs_drop::<T>());
assert!(size_of::<T>() != 0);

// Takes care of reentrancy.
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_expand/src/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1199,7 +1199,7 @@ pub trait LintStoreExpand {

type LintStoreExpandDyn<'a> = Option<&'a (dyn LintStoreExpand + 'a)>;

#[derive(Debug, Clone, Default)]
#[derive(Debug, Default)]
pub struct ModuleData {
/// Path to the module starting from the crate name, like `my_crate::foo::bar`.
pub mod_path: Vec<Ident>,
Expand Down
5 changes: 2 additions & 3 deletions compiler/rustc_hir_analysis/src/check/check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -839,9 +839,8 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
tcx.ensure_ok().associated_items(def_id);
if of_trait {
let impl_trait_header = tcx.impl_trait_header(def_id);
res = res.and(tcx.ensure_result().coherent_trait(
impl_trait_header.trait_ref.instantiate_identity().skip_norm_wip().def_id,
));
res = res
.and(tcx.ensure_result().coherent_trait(impl_trait_header.trait_ref.def_id()));

if res.is_ok() {
// Checking this only makes sense if the all trait impls satisfy basic
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_transform/src/check_call_recursion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ impl<'tcx> MirLint<'tcx> for CheckDropRecursion {
if let DefKind::AssocFn = tcx.def_kind(def_id)
&& let Some(impl_id) = tcx.trait_impl_of_assoc(def_id.to_def_id())
&& let trait_ref = tcx.impl_trait_ref(impl_id)
&& tcx.is_lang_item(trait_ref.instantiate_identity().skip_norm_wip().def_id, LangItem::Drop)
&& tcx.is_lang_item(trait_ref.def_id(), LangItem::Drop)
// avoid erroneous `Drop` impls from causing ICEs below
&& let sig = tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip()
&& sig.inputs().skip_binder().len() == 1
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_resolve/src/error_helper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ impl TypoSuggestion {
}

/// A free importable items suggested in case of resolution failure.
#[derive(Debug, Clone)]
#[derive(Debug)]
pub(crate) struct ImportSuggestion {
pub did: Option<DefId>,
pub descr: &'static str,
Expand Down
9 changes: 4 additions & 5 deletions compiler/rustc_resolve/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ impl<'ra> PendingDecl<'ra> {
}

/// Contains data for specific kinds of imports.
#[derive(Clone)]
pub(crate) enum ImportKind<'ra> {
Single {
/// `source` in `use prefix::source as target`.
Expand Down Expand Up @@ -157,7 +156,7 @@ impl<'ra> std::fmt::Debug for ImportKind<'ra> {
}

/// One import.
#[derive(Debug, Clone)]
#[derive(Debug)]
pub(crate) struct ImportData<'ra> {
pub kind: ImportKind<'ra>,

Expand Down Expand Up @@ -280,7 +279,7 @@ impl<'ra> ImportData<'ra> {
}

/// Records information about the resolution of a name in a namespace of a module.
#[derive(Clone, Debug)]
#[derive(Debug)]
pub(crate) struct NameResolution<'ra> {
/// Single imports that may define the name in the namespace.
/// Imports are arena-allocated, so it's ok to use pointers as keys.
Expand Down Expand Up @@ -375,7 +374,7 @@ pub(crate) mod cycle_detection {

/// An error that may be transformed into a diagnostic later. Used to combine multiple unresolved
/// import errors within the same use tree into a single diagnostic.
#[derive(Debug, Clone)]
#[derive(Debug)]
pub(crate) struct UnresolvedImportError {
pub(crate) span: Span,
pub(crate) label: Option<String>,
Expand All @@ -394,7 +393,7 @@ fn pub_use_of_private_extern_crate_hack(
import: ImportSummary,
decl: Decl<'_>,
) -> Option<LocalDefId> {
match (import.is_single, decl.kind) {
match (import.is_single, &decl.kind) {
(true, DeclKind::Import { import: decl_import, .. })
if let ImportKind::ExternCrate { def_id, .. } = decl_import.kind
&& import.vis.is_public() =>
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_resolve/src/late/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ pub(super) struct MissingLifetime {

/// Description of the lifetimes appearing in a function parameter.
/// This is used to provide a literal explanation to the elision failure.
#[derive(Clone, Debug)]
#[derive(Debug)]
pub(super) struct ElisionFnParameter {
/// The index of the argument in the original definition.
pub index: usize,
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -984,7 +984,7 @@ impl<'ra> fmt::Debug for LocalModule<'ra> {
}

/// Data associated with any name declaration.
#[derive(Clone, Debug)]
#[derive(Debug)]
struct DeclData<'ra> {
kind: DeclKind<'ra>,
ambiguity: CmCell<Option<(Decl<'ra>, bool /*warning*/)>>,
Expand Down Expand Up @@ -1018,7 +1018,7 @@ impl std::hash::Hash for DeclData<'_> {
}

/// Name declaration kind.
#[derive(Clone, Copy, Debug)]
#[derive(Debug)]
enum DeclKind<'ra> {
/// The name declaration is a definition (possibly without a `DefId`),
/// can be provided by source code or built into the language.
Expand Down
6 changes: 6 additions & 0 deletions compiler/rustc_type_ir/src/binder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,12 @@ impl<I: Interner, T> EarlyBinder<I, T> {
}
}

impl<I: Interner> EarlyBinder<I, ty::TraitRef<I>> {
pub fn def_id(&self) -> I::TraitId {
self.value.def_id
}
}

impl<I: Interner, T> EarlyBinder<I, Option<T>> {
pub fn transpose(self) -> Option<EarlyBinder<I, T>> {
self.value.map(|value| EarlyBinder { value, _tcx: PhantomData })
Expand Down
4 changes: 3 additions & 1 deletion library/std/src/sys/random/linux.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,9 @@ fn getrandom(mut bytes: &mut [u8], insecure: bool) {
GETRANDOM_AVAILABLE.store(false, Relaxed);
break;
}
_ => panic!("failed to generate random data"),
other => {
panic!("failed to generate random data: errno={other:?}, flags={flags:?}")
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/bootstrap/defaults/bootstrap.dist.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ download-rustc = false
llvm-bitcode-linker = true
# Required to make builds reproducible.
remap-debuginfo = true
# Compress debuginfo in generated artifacts to reduce their size
compress-debuginfo = "zlib"

[dist]
# Use better compression when preparing tarballs.
Expand Down
16 changes: 13 additions & 3 deletions src/bootstrap/src/core/builder/cargo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ use std::path::{Path, PathBuf};
use super::{Builder, Kind};
use crate::core::build_steps::test;
use crate::core::build_steps::tool::SourceType;
use crate::core::config::SplitDebuginfo;
use crate::core::config::flags::Color;
use crate::core::config::{CompressDebuginfo, SplitDebuginfo};
use crate::utils::build_stamp;
use crate::utils::helpers::{self, LldThreads, check_cfg_arg, linker_flags};
use crate::{
Expand Down Expand Up @@ -348,8 +348,18 @@ impl Cargo {
self.rustdocflags.arg(&arg);
}

if !builder.config.dry_run() && builder.cc[&target].args().iter().any(|arg| arg == "-gz") {
self.rustflags.arg("-Clink-arg=-gz");
if !builder.config.dry_run() {
match builder.config.compress_debuginfo(target) {
CompressDebuginfo::Zlib => {
// Do not enable Zlib compression on:
// - Windows, because MSVC/PDB doesn't support it
// - macOS, because its linker doesn't know the flag
if !self.target.is_windows() && !self.target.is_apple() {
self.rustflags.arg("-Clink-arg=-Wl,--compress-debug-sections=zlib");
}
}
CompressDebuginfo::Off => {}
}
}

// Ignore linker warnings for now. These are complicated to fix and don't affect the build.
Expand Down
14 changes: 12 additions & 2 deletions src/bootstrap/src/core/config/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ use crate::core::config::toml::target::{
DefaultLinuxLinkerOverride, Target, TomlTarget, default_linux_linker_overrides,
};
use crate::core::config::{
CompilerBuiltins, DebuginfoLevel, DryRun, GccCiMode, LlvmLibunwind, Merge, ReplaceOpt,
RustcLto, SplitDebuginfo, StringOrBool, threads_from_config,
CompilerBuiltins, CompressDebuginfo, DebuginfoLevel, DryRun, GccCiMode, LlvmLibunwind, Merge,
ReplaceOpt, RustcLto, SplitDebuginfo, StringOrBool, threads_from_config,
};
use crate::core::download::{
DownloadContext, download_beta_toolchain, is_download_ci_available, maybe_download_rustfmt,
Expand Down Expand Up @@ -210,6 +210,7 @@ pub struct Config {
pub rust_debuginfo_level_std: DebuginfoLevel,
pub rust_debuginfo_level_tools: DebuginfoLevel,
pub rust_debuginfo_level_tests: DebuginfoLevel,
pub rust_compress_debuginfo: CompressDebuginfo,
pub rust_rpath: bool,
pub rust_strip: bool,
pub rust_frame_pointers: bool,
Expand Down Expand Up @@ -550,6 +551,7 @@ impl Config {
debuginfo_level_std: rust_debuginfo_level_std,
debuginfo_level_tools: rust_debuginfo_level_tools,
debuginfo_level_tests: rust_debuginfo_level_tests,
compress_debuginfo: rust_compress_debuginfo,
backtrace: rust_backtrace,
incremental: rust_incremental,
randomize_layout: rust_randomize_layout,
Expand Down Expand Up @@ -1471,6 +1473,7 @@ NOTE: Please add `--stage 2` to your command line, or if you're sure you want to
.unwrap_or(vec![CodegenBackendKind::Llvm]),
rust_codegen_units: rust_codegen_units.map(threads_from_config),
rust_codegen_units_std: rust_codegen_units_std.map(threads_from_config),
rust_compress_debuginfo: rust_compress_debuginfo.unwrap_or_default(),
rust_debug_logging: rust_debug_logging
.or(rust_rustc_debug_assertions)
.unwrap_or(rust_debug == Some(true)),
Expand Down Expand Up @@ -1927,6 +1930,13 @@ NOTE: Please add `--stage 2` to your command line, or if you're sure you want to
.unwrap_or_else(|| SplitDebuginfo::default_for_platform(target))
}

pub fn compress_debuginfo(&self, target: TargetSelection) -> CompressDebuginfo {
self.target_config
.get(&target)
.and_then(|t| t.compress_debuginfo)
.unwrap_or(self.rust_compress_debuginfo)
}

/// Checks if the given target is the same as the host target.
pub fn is_host_target(&self, target: TargetSelection) -> bool {
self.host_target == target
Expand Down
48 changes: 48 additions & 0 deletions src/bootstrap/src/core/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ use std::path::PathBuf;

use build_helper::exit;
pub use config::*;
use serde::de::Unexpected;
use serde::{Deserialize, Deserializer};
use serde_derive::Deserialize;
pub use target_selection::TargetSelection;
Expand Down Expand Up @@ -378,6 +379,53 @@ impl std::str::FromStr for SplitDebuginfo {
}
}

#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Hash)]
pub enum CompressDebuginfo {
Zlib,
#[default]
Off,
}

impl CompressDebuginfo {
fn default_on() -> Self {
Self::Zlib
}
}

impl std::str::FromStr for CompressDebuginfo {
type Err = ();

fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"zlib" => Ok(CompressDebuginfo::Zlib),
"off" => Ok(CompressDebuginfo::Off),
_ => Err(()),
}
}
}

impl<'de> Deserialize<'de> for CompressDebuginfo {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::Error;

Ok(match Deserialize::deserialize(deserializer)? {
StringOrBool::Bool(value) => {
if value {
CompressDebuginfo::default_on()
} else {
CompressDebuginfo::Off
}
}
StringOrBool::String(value) => CompressDebuginfo::from_str(&value).map_err(|_| {
D::Error::invalid_value(Unexpected::Str(&value), &"`zlib` or `off`")
})?,
})
}
}

/// Describes how to handle conflicts in merging two `TomlConfig`
#[derive(Copy, Clone, Debug)]
pub enum ReplaceOpt {
Expand Down
4 changes: 4 additions & 0 deletions src/bootstrap/src/core/config/target_selection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@ impl TargetSelection {
self.contains("windows")
}

pub fn is_apple(&self) -> bool {
self.contains("apple")
}

pub fn is_windows_gnu(&self) -> bool {
self.ends_with("windows-gnu")
}
Expand Down
5 changes: 4 additions & 1 deletion src/bootstrap/src/core/config/toml/rust.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use build_helper::ci::CiEnv;
use serde::{Deserialize, Deserializer};

use crate::core::config::toml::TomlConfig;
use crate::core::config::{DebuginfoLevel, Merge, ReplaceOpt, StringOrBool};
use crate::core::config::{CompressDebuginfo, DebuginfoLevel, Merge, ReplaceOpt, StringOrBool};
use crate::{BTreeSet, CodegenBackendKind, HashSet, PathBuf, TargetSelection, define_config, exit};

define_config! {
Expand All @@ -28,6 +28,7 @@ define_config! {
debuginfo_level_std: Option<DebuginfoLevel> = "debuginfo-level-std",
debuginfo_level_tools: Option<DebuginfoLevel> = "debuginfo-level-tools",
debuginfo_level_tests: Option<DebuginfoLevel> = "debuginfo-level-tests",
compress_debuginfo: Option<CompressDebuginfo> = "compress-debuginfo",
backtrace: Option<bool> = "backtrace",
incremental: Option<bool> = "incremental",
default_linker: Option<String> = "default-linker",
Expand Down Expand Up @@ -322,6 +323,7 @@ pub fn check_incompatible_options_for_ci_rustc(
randomize_layout,
debug_logging,
debuginfo_level_rustc,
compress_debuginfo,
llvm_tools,
llvm_bitcode_linker,
stack_protector,
Expand Down Expand Up @@ -389,6 +391,7 @@ pub fn check_incompatible_options_for_ci_rustc(

err!(current_rust_config.optimize, optimize, "rust");
err!(current_rust_config.randomize_layout, randomize_layout, "rust");
err!(current_rust_config.compress_debuginfo, compress_debuginfo, "rust");
err!(current_rust_config.debug_logging, debug_logging, "rust");
err!(current_rust_config.debuginfo_level_rustc, debuginfo_level_rustc, "rust");
err!(current_rust_config.rpath, rpath, "rust");
Expand Down
4 changes: 3 additions & 1 deletion src/bootstrap/src/core/config/toml/target.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ use serde::de::Error;
use serde::{Deserialize, Deserializer};

use crate::core::config::{
CompilerBuiltins, LlvmLibunwind, Merge, ReplaceOpt, SplitDebuginfo, StringOrBool,
CompilerBuiltins, CompressDebuginfo, LlvmLibunwind, Merge, ReplaceOpt, SplitDebuginfo,
StringOrBool,
};
use crate::{CodegenBackendKind, HashSet, PathBuf, define_config, exit};

Expand Down Expand Up @@ -68,6 +69,7 @@ pub struct Target {
pub default_linker_linux_override: DefaultLinuxLinkerOverride,
pub linker: Option<PathBuf>,
pub split_debuginfo: Option<SplitDebuginfo>,
pub compress_debuginfo: Option<CompressDebuginfo>,
pub sanitizers: Option<bool>,
pub profiler: Option<StringOrBool>,
pub rpath: Option<bool>,
Expand Down
Loading
Loading