Auto merge of #115685 - matthiaskrgr:rollup-t31gowy, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #113807 (Tests crash from inappropriate use of common linkage) - #115358 (debuginfo: add compiler option to allow compressed debuginfo sections) - #115630 (Dont suggest use between `use` and cfg attr) - #115662 (Improve "associated type not found" diagnostics) - #115673 (Fix sanitize/cfg.rs test) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
b0b8c52649
21 changed files with 248 additions and 29 deletions
|
@ -83,6 +83,8 @@ codegen_llvm_unknown_ctarget_feature_prefix =
|
||||||
unknown feature specified for `-Ctarget-feature`: `{$feature}`
|
unknown feature specified for `-Ctarget-feature`: `{$feature}`
|
||||||
.note = features must begin with a `+` to enable or `-` to disable it
|
.note = features must begin with a `+` to enable or `-` to disable it
|
||||||
|
|
||||||
|
codegen_llvm_unknown_debuginfo_compression = unknown debuginfo compression algorithm {$algorithm} - will fall back to uncompressed debuginfo
|
||||||
|
|
||||||
codegen_llvm_write_bytecode = failed to write bytecode to {$path}: {$err}
|
codegen_llvm_write_bytecode = failed to write bytecode to {$path}: {$err}
|
||||||
|
|
||||||
codegen_llvm_write_ir = failed to write LLVM IR to {$path}
|
codegen_llvm_write_ir = failed to write LLVM IR to {$path}
|
||||||
|
|
|
@ -5,13 +5,17 @@ use crate::back::profiling::{
|
||||||
use crate::base;
|
use crate::base;
|
||||||
use crate::common;
|
use crate::common;
|
||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
CopyBitcode, FromLlvmDiag, FromLlvmOptimizationDiag, LlvmError, WithLlvmError, WriteBytecode,
|
CopyBitcode, FromLlvmDiag, FromLlvmOptimizationDiag, LlvmError, UnknownCompression,
|
||||||
|
WithLlvmError, WriteBytecode,
|
||||||
};
|
};
|
||||||
use crate::llvm::{self, DiagnosticInfo, PassManager};
|
use crate::llvm::{self, DiagnosticInfo, PassManager};
|
||||||
use crate::llvm_util;
|
use crate::llvm_util;
|
||||||
use crate::type_::Type;
|
use crate::type_::Type;
|
||||||
use crate::LlvmCodegenBackend;
|
use crate::LlvmCodegenBackend;
|
||||||
use crate::ModuleLlvm;
|
use crate::ModuleLlvm;
|
||||||
|
use llvm::{
|
||||||
|
LLVMRustLLVMHasZlibCompressionForDebugSymbols, LLVMRustLLVMHasZstdCompressionForDebugSymbols,
|
||||||
|
};
|
||||||
use rustc_codegen_ssa::back::link::ensure_removed;
|
use rustc_codegen_ssa::back::link::ensure_removed;
|
||||||
use rustc_codegen_ssa::back::write::{
|
use rustc_codegen_ssa::back::write::{
|
||||||
BitcodeSection, CodegenContext, EmitObj, ModuleConfig, TargetMachineFactoryConfig,
|
BitcodeSection, CodegenContext, EmitObj, ModuleConfig, TargetMachineFactoryConfig,
|
||||||
|
@ -234,6 +238,22 @@ pub fn target_machine_factory(
|
||||||
args_cstr_buff
|
args_cstr_buff
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let debuginfo_compression = sess.opts.debuginfo_compression.to_string();
|
||||||
|
match sess.opts.debuginfo_compression {
|
||||||
|
rustc_session::config::DebugInfoCompression::Zlib => {
|
||||||
|
if !unsafe { LLVMRustLLVMHasZlibCompressionForDebugSymbols() } {
|
||||||
|
sess.emit_warning(UnknownCompression { algorithm: "zlib" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rustc_session::config::DebugInfoCompression::Zstd => {
|
||||||
|
if !unsafe { LLVMRustLLVMHasZstdCompressionForDebugSymbols() } {
|
||||||
|
sess.emit_warning(UnknownCompression { algorithm: "zstd" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rustc_session::config::DebugInfoCompression::None => {}
|
||||||
|
};
|
||||||
|
let debuginfo_compression = SmallCStr::new(&debuginfo_compression);
|
||||||
|
|
||||||
Arc::new(move |config: TargetMachineFactoryConfig| {
|
Arc::new(move |config: TargetMachineFactoryConfig| {
|
||||||
let split_dwarf_file =
|
let split_dwarf_file =
|
||||||
path_mapping.map_prefix(config.split_dwarf_file.unwrap_or_default()).0;
|
path_mapping.map_prefix(config.split_dwarf_file.unwrap_or_default()).0;
|
||||||
|
@ -259,6 +279,7 @@ pub fn target_machine_factory(
|
||||||
relax_elf_relocations,
|
relax_elf_relocations,
|
||||||
use_init_array,
|
use_init_array,
|
||||||
split_dwarf_file.as_ptr(),
|
split_dwarf_file.as_ptr(),
|
||||||
|
debuginfo_compression.as_ptr(),
|
||||||
force_emulated_tls,
|
force_emulated_tls,
|
||||||
args_cstr_buff.as_ptr() as *const c_char,
|
args_cstr_buff.as_ptr() as *const c_char,
|
||||||
args_cstr_buff.len(),
|
args_cstr_buff.len(),
|
||||||
|
|
|
@ -226,3 +226,9 @@ pub(crate) struct WriteBytecode<'a> {
|
||||||
pub(crate) struct CopyBitcode {
|
pub(crate) struct CopyBitcode {
|
||||||
pub err: std::io::Error,
|
pub err: std::io::Error,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_llvm_unknown_debuginfo_compression)]
|
||||||
|
pub struct UnknownCompression {
|
||||||
|
pub algorithm: &'static str,
|
||||||
|
}
|
||||||
|
|
|
@ -2131,6 +2131,7 @@ extern "C" {
|
||||||
RelaxELFRelocations: bool,
|
RelaxELFRelocations: bool,
|
||||||
UseInitArray: bool,
|
UseInitArray: bool,
|
||||||
SplitDwarfFile: *const c_char,
|
SplitDwarfFile: *const c_char,
|
||||||
|
DebugInfoCompression: *const c_char,
|
||||||
ForceEmulatedTls: bool,
|
ForceEmulatedTls: bool,
|
||||||
ArgsCstrBuff: *const c_char,
|
ArgsCstrBuff: *const c_char,
|
||||||
ArgsCstrBuffLen: usize,
|
ArgsCstrBuffLen: usize,
|
||||||
|
@ -2366,6 +2367,10 @@ extern "C" {
|
||||||
|
|
||||||
pub fn LLVMRustIsBitcode(ptr: *const u8, len: usize) -> bool;
|
pub fn LLVMRustIsBitcode(ptr: *const u8, len: usize) -> bool;
|
||||||
|
|
||||||
|
pub fn LLVMRustLLVMHasZlibCompressionForDebugSymbols() -> bool;
|
||||||
|
|
||||||
|
pub fn LLVMRustLLVMHasZstdCompressionForDebugSymbols() -> bool;
|
||||||
|
|
||||||
pub fn LLVMRustGetSymbols(
|
pub fn LLVMRustGetSymbols(
|
||||||
buf_ptr: *const u8,
|
buf_ptr: *const u8,
|
||||||
buf_len: usize,
|
buf_len: usize,
|
||||||
|
|
|
@ -110,16 +110,22 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
{
|
{
|
||||||
// The fallback span is needed because `assoc_name` might be an `Fn()`'s `Output` without a
|
// The fallback span is needed because `assoc_name` might be an `Fn()`'s `Output` without a
|
||||||
// valid span, so we point at the whole path segment instead.
|
// valid span, so we point at the whole path segment instead.
|
||||||
let span = if assoc_name.span != DUMMY_SP { assoc_name.span } else { span };
|
let is_dummy = assoc_name.span == DUMMY_SP;
|
||||||
|
|
||||||
let mut err = struct_span_err!(
|
let mut err = struct_span_err!(
|
||||||
self.tcx().sess,
|
self.tcx().sess,
|
||||||
span,
|
if is_dummy { span } else { assoc_name.span },
|
||||||
E0220,
|
E0220,
|
||||||
"associated type `{}` not found for `{}`",
|
"associated type `{}` not found for `{}`",
|
||||||
assoc_name,
|
assoc_name,
|
||||||
ty_param_name
|
ty_param_name
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if is_dummy {
|
||||||
|
err.span_label(span, format!("associated type `{assoc_name}` not found"));
|
||||||
|
return err.emit();
|
||||||
|
}
|
||||||
|
|
||||||
let all_candidate_names: Vec<_> = all_candidates()
|
let all_candidate_names: Vec<_> = all_candidates()
|
||||||
.flat_map(|r| self.tcx().associated_items(r.def_id()).in_definition_order())
|
.flat_map(|r| self.tcx().associated_items(r.def_id()).in_definition_order())
|
||||||
.filter_map(|item| {
|
.filter_map(|item| {
|
||||||
|
@ -131,10 +137,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
if let (Some(suggested_name), true) = (
|
if let Some(suggested_name) =
|
||||||
find_best_match_for_name(&all_candidate_names, assoc_name.name, None),
|
find_best_match_for_name(&all_candidate_names, assoc_name.name, None)
|
||||||
assoc_name.span != DUMMY_SP,
|
{
|
||||||
) {
|
|
||||||
err.span_suggestion(
|
err.span_suggestion(
|
||||||
assoc_name.span,
|
assoc_name.span,
|
||||||
"there is an associated type with a similar name",
|
"there is an associated type with a similar name",
|
||||||
|
@ -172,10 +177,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
if let (Some(suggested_name), true) = (
|
if let Some(suggested_name) =
|
||||||
find_best_match_for_name(&wider_candidate_names, assoc_name.name, None),
|
find_best_match_for_name(&wider_candidate_names, assoc_name.name, None)
|
||||||
assoc_name.span != DUMMY_SP,
|
{
|
||||||
) {
|
|
||||||
if let [best_trait] = visible_traits
|
if let [best_trait] = visible_traits
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|trait_def_id| {
|
.filter(|trait_def_id| {
|
||||||
|
@ -197,7 +201,28 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err.span_label(span, format!("associated type `{assoc_name}` not found"));
|
// If we still couldn't find any associated type, and only one associated type exists,
|
||||||
|
// suggests using it.
|
||||||
|
|
||||||
|
if all_candidate_names.len() == 1 {
|
||||||
|
// this should still compile, except on `#![feature(associated_type_defaults)]`
|
||||||
|
// where it could suggests `type A = Self::A`, thus recursing infinitely
|
||||||
|
let applicability = if self.tcx().features().associated_type_defaults {
|
||||||
|
Applicability::Unspecified
|
||||||
|
} else {
|
||||||
|
Applicability::MaybeIncorrect
|
||||||
|
};
|
||||||
|
|
||||||
|
err.span_suggestion(
|
||||||
|
assoc_name.span,
|
||||||
|
format!("`{ty_param_name}` has the following associated type"),
|
||||||
|
all_candidate_names.first().unwrap().to_string(),
|
||||||
|
applicability,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
err.span_label(assoc_name.span, format!("associated type `{assoc_name}` not found"));
|
||||||
|
}
|
||||||
|
|
||||||
err.emit()
|
err.emit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -410,6 +410,7 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
|
||||||
bool RelaxELFRelocations,
|
bool RelaxELFRelocations,
|
||||||
bool UseInitArray,
|
bool UseInitArray,
|
||||||
const char *SplitDwarfFile,
|
const char *SplitDwarfFile,
|
||||||
|
const char *DebugInfoCompression,
|
||||||
bool ForceEmulatedTls,
|
bool ForceEmulatedTls,
|
||||||
const char *ArgsCstrBuff, size_t ArgsCstrBuffLen) {
|
const char *ArgsCstrBuff, size_t ArgsCstrBuffLen) {
|
||||||
|
|
||||||
|
@ -441,6 +442,16 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
|
||||||
if (SplitDwarfFile) {
|
if (SplitDwarfFile) {
|
||||||
Options.MCOptions.SplitDwarfFile = SplitDwarfFile;
|
Options.MCOptions.SplitDwarfFile = SplitDwarfFile;
|
||||||
}
|
}
|
||||||
|
#if LLVM_VERSION_GE(16, 0)
|
||||||
|
if (!strcmp("zlib", DebugInfoCompression) && llvm::compression::zlib::isAvailable()) {
|
||||||
|
Options.CompressDebugSections = DebugCompressionType::Zlib;
|
||||||
|
} else if (!strcmp("zstd", DebugInfoCompression) && llvm::compression::zstd::isAvailable()) {
|
||||||
|
Options.CompressDebugSections = DebugCompressionType::Zstd;
|
||||||
|
} else if (!strcmp("none", DebugInfoCompression)) {
|
||||||
|
Options.CompressDebugSections = DebugCompressionType::None;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Options.RelaxELFRelocations = RelaxELFRelocations;
|
Options.RelaxELFRelocations = RelaxELFRelocations;
|
||||||
Options.UseInitArray = UseInitArray;
|
Options.UseInitArray = UseInitArray;
|
||||||
|
|
||||||
|
|
|
@ -2044,3 +2044,19 @@ extern "C" bool LLVMRustIsNonGVFunctionPointerTy(LLVMValueRef V) {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" bool LLVMRustLLVMHasZlibCompressionForDebugSymbols() {
|
||||||
|
#if LLVM_VERSION_GE(16, 0)
|
||||||
|
return llvm::compression::zlib::isAvailable();
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" bool LLVMRustLLVMHasZstdCompressionForDebugSymbols() {
|
||||||
|
#if LLVM_VERSION_GE(16, 0)
|
||||||
|
return llvm::compression::zstd::isAvailable();
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -2753,7 +2753,13 @@ fn search_for_any_use_in_items(items: &[P<ast::Item>]) -> Option<Span> {
|
||||||
for item in items {
|
for item in items {
|
||||||
if let ItemKind::Use(..) = item.kind {
|
if let ItemKind::Use(..) = item.kind {
|
||||||
if is_span_suitable_for_use_injection(item.span) {
|
if is_span_suitable_for_use_injection(item.span) {
|
||||||
return Some(item.span.shrink_to_lo());
|
let mut lo = item.span.lo();
|
||||||
|
for attr in &item.attrs {
|
||||||
|
if attr.span.eq_ctxt(item.span) {
|
||||||
|
lo = std::cmp::min(lo, attr.span.lo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Some(Span::new(lo, lo, item.span.ctxt(), item.span.parent()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -381,6 +381,24 @@ pub enum DebugInfo {
|
||||||
Full,
|
Full,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Hash)]
|
||||||
|
pub enum DebugInfoCompression {
|
||||||
|
None,
|
||||||
|
Zlib,
|
||||||
|
Zstd,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToString for DebugInfoCompression {
|
||||||
|
fn to_string(&self) -> String {
|
||||||
|
match self {
|
||||||
|
DebugInfoCompression::None => "none",
|
||||||
|
DebugInfoCompression::Zlib => "zlib",
|
||||||
|
DebugInfoCompression::Zstd => "zstd",
|
||||||
|
}
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Split debug-information is enabled by `-C split-debuginfo`, this enum is only used if split
|
/// Split debug-information is enabled by `-C split-debuginfo`, this enum is only used if split
|
||||||
/// debug-information is enabled (in either `Packed` or `Unpacked` modes), and the platform
|
/// debug-information is enabled (in either `Packed` or `Unpacked` modes), and the platform
|
||||||
/// uses DWARF for debug-information.
|
/// uses DWARF for debug-information.
|
||||||
|
@ -1015,6 +1033,7 @@ impl Default for Options {
|
||||||
crate_types: Vec::new(),
|
crate_types: Vec::new(),
|
||||||
optimize: OptLevel::No,
|
optimize: OptLevel::No,
|
||||||
debuginfo: DebugInfo::None,
|
debuginfo: DebugInfo::None,
|
||||||
|
debuginfo_compression: DebugInfoCompression::None,
|
||||||
lint_opts: Vec::new(),
|
lint_opts: Vec::new(),
|
||||||
lint_cap: None,
|
lint_cap: None,
|
||||||
describe_lints: false,
|
describe_lints: false,
|
||||||
|
@ -2277,6 +2296,13 @@ fn select_debuginfo(matches: &getopts::Matches, cg: &CodegenOptions) -> DebugInf
|
||||||
if max_g > max_c { DebugInfo::Full } else { cg.debuginfo }
|
if max_g > max_c { DebugInfo::Full } else { cg.debuginfo }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn select_debuginfo_compression(
|
||||||
|
_handler: &EarlyErrorHandler,
|
||||||
|
unstable_opts: &UnstableOptions,
|
||||||
|
) -> DebugInfoCompression {
|
||||||
|
unstable_opts.debuginfo_compression
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn parse_assert_incr_state(
|
pub(crate) fn parse_assert_incr_state(
|
||||||
handler: &EarlyErrorHandler,
|
handler: &EarlyErrorHandler,
|
||||||
opt_assertion: &Option<String>,
|
opt_assertion: &Option<String>,
|
||||||
|
@ -2752,6 +2778,8 @@ pub fn build_session_options(
|
||||||
// for more details.
|
// for more details.
|
||||||
let debug_assertions = cg.debug_assertions.unwrap_or(opt_level == OptLevel::No);
|
let debug_assertions = cg.debug_assertions.unwrap_or(opt_level == OptLevel::No);
|
||||||
let debuginfo = select_debuginfo(matches, &cg);
|
let debuginfo = select_debuginfo(matches, &cg);
|
||||||
|
let debuginfo_compression: DebugInfoCompression =
|
||||||
|
select_debuginfo_compression(handler, &unstable_opts);
|
||||||
|
|
||||||
let mut search_paths = vec![];
|
let mut search_paths = vec![];
|
||||||
for s in &matches.opt_strs("L") {
|
for s in &matches.opt_strs("L") {
|
||||||
|
@ -2828,6 +2856,7 @@ pub fn build_session_options(
|
||||||
crate_types,
|
crate_types,
|
||||||
optimize: opt_level,
|
optimize: opt_level,
|
||||||
debuginfo,
|
debuginfo,
|
||||||
|
debuginfo_compression,
|
||||||
lint_opts,
|
lint_opts,
|
||||||
lint_cap,
|
lint_cap,
|
||||||
describe_lints,
|
describe_lints,
|
||||||
|
@ -3113,11 +3142,11 @@ impl PpMode {
|
||||||
/// how the hash should be calculated when adding a new command-line argument.
|
/// how the hash should be calculated when adding a new command-line argument.
|
||||||
pub(crate) mod dep_tracking {
|
pub(crate) mod dep_tracking {
|
||||||
use super::{
|
use super::{
|
||||||
BranchProtection, CFGuard, CFProtection, CrateType, DebugInfo, ErrorOutputType,
|
BranchProtection, CFGuard, CFProtection, CrateType, DebugInfo, DebugInfoCompression,
|
||||||
InstrumentCoverage, InstrumentXRay, LdImpl, LinkerPluginLto, LocationDetail, LtoCli,
|
ErrorOutputType, InstrumentCoverage, InstrumentXRay, LdImpl, LinkerPluginLto,
|
||||||
OomStrategy, OptLevel, OutFileName, OutputType, OutputTypes, Passes, ResolveDocLinks,
|
LocationDetail, LtoCli, OomStrategy, OptLevel, OutFileName, OutputType, OutputTypes,
|
||||||
SourceFileHashAlgorithm, SplitDwarfKind, SwitchWithOptPath, SymbolManglingVersion,
|
Passes, ResolveDocLinks, SourceFileHashAlgorithm, SplitDwarfKind, SwitchWithOptPath,
|
||||||
TraitSolver, TrimmedDefPaths,
|
SymbolManglingVersion, TraitSolver, TrimmedDefPaths,
|
||||||
};
|
};
|
||||||
use crate::lint;
|
use crate::lint;
|
||||||
use crate::options::WasiExecModel;
|
use crate::options::WasiExecModel;
|
||||||
|
@ -3195,6 +3224,7 @@ pub(crate) mod dep_tracking {
|
||||||
OptLevel,
|
OptLevel,
|
||||||
LtoCli,
|
LtoCli,
|
||||||
DebugInfo,
|
DebugInfo,
|
||||||
|
DebugInfoCompression,
|
||||||
UnstableFeatures,
|
UnstableFeatures,
|
||||||
NativeLib,
|
NativeLib,
|
||||||
NativeLibKind,
|
NativeLibKind,
|
||||||
|
|
|
@ -139,6 +139,7 @@ top_level_options!(
|
||||||
/// can influence whether overflow checks are done or not.
|
/// can influence whether overflow checks are done or not.
|
||||||
debug_assertions: bool [TRACKED],
|
debug_assertions: bool [TRACKED],
|
||||||
debuginfo: DebugInfo [TRACKED],
|
debuginfo: DebugInfo [TRACKED],
|
||||||
|
debuginfo_compression: DebugInfoCompression [TRACKED],
|
||||||
lint_opts: Vec<(String, lint::Level)> [TRACKED_NO_CRATE_HASH],
|
lint_opts: Vec<(String, lint::Level)> [TRACKED_NO_CRATE_HASH],
|
||||||
lint_cap: Option<lint::Level> [TRACKED_NO_CRATE_HASH],
|
lint_cap: Option<lint::Level> [TRACKED_NO_CRATE_HASH],
|
||||||
describe_lints: bool [UNTRACKED],
|
describe_lints: bool [UNTRACKED],
|
||||||
|
@ -376,6 +377,7 @@ mod desc {
|
||||||
"either a boolean (`yes`, `no`, `on`, `off`, etc), `checks`, or `nochecks`";
|
"either a boolean (`yes`, `no`, `on`, `off`, etc), `checks`, or `nochecks`";
|
||||||
pub const parse_cfprotection: &str = "`none`|`no`|`n` (default), `branch`, `return`, or `full`|`yes`|`y` (equivalent to `branch` and `return`)";
|
pub const parse_cfprotection: &str = "`none`|`no`|`n` (default), `branch`, `return`, or `full`|`yes`|`y` (equivalent to `branch` and `return`)";
|
||||||
pub const parse_debuginfo: &str = "either an integer (0, 1, 2), `none`, `line-directives-only`, `line-tables-only`, `limited`, or `full`";
|
pub const parse_debuginfo: &str = "either an integer (0, 1, 2), `none`, `line-directives-only`, `line-tables-only`, `limited`, or `full`";
|
||||||
|
pub const parse_debuginfo_compression: &str = "one of `none`, `zlib`, or `zstd`";
|
||||||
pub const parse_strip: &str = "either `none`, `debuginfo`, or `symbols`";
|
pub const parse_strip: &str = "either `none`, `debuginfo`, or `symbols`";
|
||||||
pub const parse_linker_flavor: &str = ::rustc_target::spec::LinkerFlavorCli::one_of();
|
pub const parse_linker_flavor: &str = ::rustc_target::spec::LinkerFlavorCli::one_of();
|
||||||
pub const parse_optimization_fuel: &str = "crate=integer";
|
pub const parse_optimization_fuel: &str = "crate=integer";
|
||||||
|
@ -782,6 +784,19 @@ mod parse {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn parse_debuginfo_compression(
|
||||||
|
slot: &mut DebugInfoCompression,
|
||||||
|
v: Option<&str>,
|
||||||
|
) -> bool {
|
||||||
|
match v {
|
||||||
|
Some("none") => *slot = DebugInfoCompression::None,
|
||||||
|
Some("zlib") => *slot = DebugInfoCompression::Zlib,
|
||||||
|
Some("zstd") => *slot = DebugInfoCompression::Zstd,
|
||||||
|
_ => return false,
|
||||||
|
};
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn parse_linker_flavor(slot: &mut Option<LinkerFlavorCli>, v: Option<&str>) -> bool {
|
pub(crate) fn parse_linker_flavor(slot: &mut Option<LinkerFlavorCli>, v: Option<&str>) -> bool {
|
||||||
match v.and_then(LinkerFlavorCli::from_str) {
|
match v.and_then(LinkerFlavorCli::from_str) {
|
||||||
Some(lf) => *slot = Some(lf),
|
Some(lf) => *slot = Some(lf),
|
||||||
|
@ -1424,6 +1439,8 @@ options! {
|
||||||
"emit discriminators and other data necessary for AutoFDO"),
|
"emit discriminators and other data necessary for AutoFDO"),
|
||||||
debug_macros: bool = (false, parse_bool, [TRACKED],
|
debug_macros: bool = (false, parse_bool, [TRACKED],
|
||||||
"emit line numbers debug info inside macros (default: no)"),
|
"emit line numbers debug info inside macros (default: no)"),
|
||||||
|
debuginfo_compression: DebugInfoCompression = (DebugInfoCompression::None, parse_debuginfo_compression, [TRACKED],
|
||||||
|
"compress debug info sections (none, zlib, zstd, default: none)"),
|
||||||
deduplicate_diagnostics: bool = (true, parse_bool, [UNTRACKED],
|
deduplicate_diagnostics: bool = (true, parse_bool, [UNTRACKED],
|
||||||
"deduplicate identical diagnostics (default: yes)"),
|
"deduplicate identical diagnostics (default: yes)"),
|
||||||
dep_info_omit_d_target: bool = (false, parse_bool, [TRACKED],
|
dep_info_omit_d_target: bool = (false, parse_bool, [TRACKED],
|
||||||
|
|
15
tests/run-make/compressed-debuginfo/Makefile
Normal file
15
tests/run-make/compressed-debuginfo/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# ignore-cross-compile
|
||||||
|
include ../tools.mk
|
||||||
|
|
||||||
|
# only-linux
|
||||||
|
# min-llvm-version: 16.0
|
||||||
|
#
|
||||||
|
# This tests debuginfo-compression.
|
||||||
|
|
||||||
|
all: zlib zstandard
|
||||||
|
|
||||||
|
zlib:
|
||||||
|
test "`$(RUSTC) --crate-name=foo --crate-type=lib --emit=obj -C debuginfo=full -Z debuginfo-compression=zlib foo.rs 2>&1 | sed 's/.*unknown.*zlib.*/missing/' | head -n 1`" = missing || readelf -t $(TMPDIR)/foo.o | grep -q ZLIB
|
||||||
|
|
||||||
|
zstandard:
|
||||||
|
test "`$(RUSTC) --crate-name=foo --crate-type=lib --emit=obj -C debuginfo=full -Z debuginfo-compression=zstd foo.rs 2>&1 | sed 's/.*unknown.*zstd.*/missing/' | head -n 1`" = missing || readelf -t $(TMPDIR)/foo.o | grep -q ZST
|
3
tests/run-make/compressed-debuginfo/foo.rs
Normal file
3
tests/run-make/compressed-debuginfo/foo.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
pub fn foo() -> i32 {
|
||||||
|
42
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ error[E0220]: associated type `anything_here_kills_it` not found for `Self`
|
||||||
--> $DIR/issue-23595-2.rs:6:22
|
--> $DIR/issue-23595-2.rs:6:22
|
||||||
|
|
|
|
||||||
LL | type B = C<Self::anything_here_kills_it>;
|
LL | type B = C<Self::anything_here_kills_it>;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ associated type `anything_here_kills_it` not found
|
| ^^^^^^^^^^^^^^^^^^^^^^ help: `Self` has the following associated type: `B`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0220]: associated type `F` not found for `Trait`
|
||||||
--> $DIR/E0220.rs:5:22
|
--> $DIR/E0220.rs:5:22
|
||||||
|
|
|
|
||||||
LL | type Foo = dyn Trait<F=i32>;
|
LL | type Foo = dyn Trait<F=i32>;
|
||||||
| ^ associated type `F` not found
|
| ^ help: `Trait` has the following associated type: `Bar`
|
||||||
|
|
||||||
error[E0191]: the value of the associated type `Bar` (from trait `Trait`) must be specified
|
error[E0191]: the value of the associated type `Bar` (from trait `Trait`) must be specified
|
||||||
--> $DIR/E0220.rs:5:16
|
--> $DIR/E0220.rs:5:16
|
||||||
|
|
|
@ -36,7 +36,7 @@ error[E0220]: associated type `B` not found for `Self`
|
||||||
--> $DIR/issue-95023.rs:6:44
|
--> $DIR/issue-95023.rs:6:44
|
||||||
|
|
|
|
||||||
LL | fn foo<const N: usize>(&self) -> Self::B<{N}>;
|
LL | fn foo<const N: usize>(&self) -> Self::B<{N}>;
|
||||||
| ^ associated type `B` not found
|
| ^ help: `Self` has the following associated type: `Output`
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
|
14
tests/ui/linkage-attr/common-linkage-non-zero-init.rs
Normal file
14
tests/ui/linkage-attr/common-linkage-non-zero-init.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// build-fail
|
||||||
|
// failure-status: 101
|
||||||
|
// known-bug: #109681
|
||||||
|
|
||||||
|
// This test verifies that we continue to hit the LLVM error for common linkage with non-zero
|
||||||
|
// initializers, since it generates invalid LLVM IR.
|
||||||
|
// Linkages are internal features marked as perma-unstable, so we don't need to fix the issue
|
||||||
|
// for now.
|
||||||
|
#![crate_type="lib"]
|
||||||
|
#![feature(linkage)]
|
||||||
|
|
||||||
|
#[linkage = "common"]
|
||||||
|
#[no_mangle]
|
||||||
|
pub static TEST: bool = true;
|
|
@ -0,0 +1,3 @@
|
||||||
|
'common' global must have a zero initializer!
|
||||||
|
ptr @TEST
|
||||||
|
LLVM ERROR: Broken module found, compilation aborted!
|
|
@ -0,0 +1,16 @@
|
||||||
|
// run-rustfix
|
||||||
|
// compile-flags: --cfg=whatever -Aunused
|
||||||
|
|
||||||
|
use y::z;
|
||||||
|
#[cfg(whatever)]
|
||||||
|
use y::Whatever;
|
||||||
|
|
||||||
|
mod y {
|
||||||
|
pub(crate) fn z() {}
|
||||||
|
pub(crate) struct Whatever;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
z();
|
||||||
|
//~^ ERROR cannot find function `z` in this scope
|
||||||
|
}
|
15
tests/ui/resolve/suggest-import-without-clobbering-attrs.rs
Normal file
15
tests/ui/resolve/suggest-import-without-clobbering-attrs.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// run-rustfix
|
||||||
|
// compile-flags: --cfg=whatever -Aunused
|
||||||
|
|
||||||
|
#[cfg(whatever)]
|
||||||
|
use y::Whatever;
|
||||||
|
|
||||||
|
mod y {
|
||||||
|
pub(crate) fn z() {}
|
||||||
|
pub(crate) struct Whatever;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
z();
|
||||||
|
//~^ ERROR cannot find function `z` in this scope
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
error[E0425]: cannot find function `z` in this scope
|
||||||
|
--> $DIR/suggest-import-without-clobbering-attrs.rs:13:5
|
||||||
|
|
|
||||||
|
LL | z();
|
||||||
|
| ^ not found in this scope
|
||||||
|
|
|
||||||
|
help: consider importing this function
|
||||||
|
|
|
||||||
|
LL + use y::z;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0425`.
|
|
@ -2,19 +2,19 @@
|
||||||
// the `#[cfg(sanitize = "option")]` attribute is configured.
|
// the `#[cfg(sanitize = "option")]` attribute is configured.
|
||||||
|
|
||||||
// needs-sanitizer-support
|
// needs-sanitizer-support
|
||||||
// needs-sanitizer-address
|
|
||||||
// needs-sanitizer-cfi
|
|
||||||
// needs-sanitizer-kcfi
|
|
||||||
// needs-sanitizer-leak
|
|
||||||
// needs-sanitizer-memory
|
|
||||||
// needs-sanitizer-thread
|
|
||||||
// check-pass
|
// check-pass
|
||||||
// revisions: address leak memory thread
|
// revisions: address cfi kcfi leak memory thread
|
||||||
|
//[address]needs-sanitizer-address
|
||||||
//[address]compile-flags: -Zsanitizer=address --cfg address
|
//[address]compile-flags: -Zsanitizer=address --cfg address
|
||||||
//[cfi]compile-flags: -Zsanitizer=cfi --cfg cfi
|
//[cfi]needs-sanitizer-cfi
|
||||||
|
//[cfi]compile-flags: -Zsanitizer=cfi --cfg cfi -Clto
|
||||||
|
//[kcfi]needs-sanitizer-kcfi
|
||||||
//[kcfi]compile-flags: -Zsanitizer=kcfi --cfg kcfi
|
//[kcfi]compile-flags: -Zsanitizer=kcfi --cfg kcfi
|
||||||
|
//[leak]needs-sanitizer-leak
|
||||||
//[leak]compile-flags: -Zsanitizer=leak --cfg leak
|
//[leak]compile-flags: -Zsanitizer=leak --cfg leak
|
||||||
|
//[memory]needs-sanitizer-memory
|
||||||
//[memory]compile-flags: -Zsanitizer=memory --cfg memory
|
//[memory]compile-flags: -Zsanitizer=memory --cfg memory
|
||||||
|
//[thread]needs-sanitizer-thread
|
||||||
//[thread]compile-flags: -Zsanitizer=thread --cfg thread
|
//[thread]compile-flags: -Zsanitizer=thread --cfg thread
|
||||||
|
|
||||||
#![feature(cfg_sanitize)]
|
#![feature(cfg_sanitize)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue