diff --git a/.gitignore b/.gitignore index d259aac..dffee1e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/rustc-1.51.0-src.tar.xz +SOURCES/rustc-1.55.0-src.tar.xz diff --git a/.rust.metadata b/.rust.metadata index 1d010eb..fae64fb 100644 --- a/.rust.metadata +++ b/.rust.metadata @@ -1 +1 @@ -3a88f9fa4c3e0ef74ce8396ad80121fd0b6cb349 SOURCES/rustc-1.51.0-src.tar.xz +3fd8c1e1d44f95621499d245d0be00c4945347fb SOURCES/rustc-1.55.0-src.tar.xz diff --git a/SOURCES/0001-Use-lld-provided-by-system-for-wasm.patch b/SOURCES/0001-Use-lld-provided-by-system-for-wasm.patch new file mode 100644 index 0000000..681b21a --- /dev/null +++ b/SOURCES/0001-Use-lld-provided-by-system-for-wasm.patch @@ -0,0 +1,26 @@ +From 9ac837c237568a6c1c5f0e979fcce208cd9c926a Mon Sep 17 00:00:00 2001 +From: Ivan Mironov +Date: Sun, 8 Dec 2019 17:23:08 +0500 +Subject: [PATCH] Use lld provided by system for wasm + +--- + compiler/rustc_target/src/spec/wasm_base.rs | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/compiler/rustc_target/src/spec/wasm_base.rs b/compiler/rustc_target/src/spec/wasm_base.rs +index 4c954a1e567c..15c4f1bda5eb 100644 +--- a/compiler/rustc_target/src/spec/wasm_base.rs ++++ b/compiler/rustc_target/src/spec/wasm_base.rs +@@ -99,8 +99,7 @@ pub fn options() -> TargetOptions { + // arguments just yet + limit_rdylib_exports: false, + +- // we use the LLD shipped with the Rust toolchain by default +- linker: Some("rust-lld".to_owned()), ++ linker: Some("lld".to_owned()), + lld_flavor: LldFlavor::Wasm, + linker_is_gnu: false, + +-- +2.31.1 + diff --git a/SOURCES/rustc-1.51.0-backport-pr81910.patch b/SOURCES/rustc-1.51.0-backport-pr81910.patch deleted file mode 100644 index e2f91b6..0000000 --- a/SOURCES/rustc-1.51.0-backport-pr81910.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 852684d306cee955ed751f1e8d8eec6adaecff3b Mon Sep 17 00:00:00 2001 -From: Joshua Nelson -Date: Mon, 8 Feb 2021 22:51:21 -0500 -Subject: [PATCH] Use format string in bootstrap panic instead of a string - directly - -This fixes the following warning when compiling with nightly: - -``` -warning: panic message is not a string literal - --> src/bootstrap/builder.rs:1515:24 - | -1515 | panic!(out); - | ^^^ - | - = note: `#[warn(non_fmt_panic)]` on by default - = note: this is no longer accepted in Rust 2021 -help: add a "{}" format string to Display the message - | -1515 | panic!("{}", out); - | ^^^^^ -help: or use std::panic::panic_any instead - | -1515 | std::panic::panic_any(out); - | ^^^^^^^^^^^^^^^^^^^^^^ -``` - -(cherry picked from commit 31c93397bde772764cda3058e16f9cef61895090) ---- - src/bootstrap/builder.rs | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs -index f1a160250dbe..0f5fcb4af400 100644 ---- a/src/bootstrap/builder.rs -+++ b/src/bootstrap/builder.rs -@@ -1490,7 +1490,7 @@ pub fn ensure(&'a self, step: S) -> S::Output { - for el in stack.iter().rev() { - out += &format!("\t{:?}\n", el); - } -- panic!(out); -+ panic!("{}", out); - } - if let Some(out) = self.cache.get(&step) { - self.verbose(&format!("{}c {:?}", " ".repeat(stack.len()), step)); --- -2.31.1 - diff --git a/SOURCES/rustc-1.51.0-disable-http2.patch b/SOURCES/rustc-1.55.0-disable-http2.patch similarity index 61% rename from SOURCES/rustc-1.51.0-disable-http2.patch rename to SOURCES/rustc-1.55.0-disable-http2.patch index 2517a34..33c6fee 100644 --- a/SOURCES/rustc-1.51.0-disable-http2.patch +++ b/SOURCES/rustc-1.55.0-disable-http2.patch @@ -1,6 +1,6 @@ ---- rustc-beta-src/Cargo.lock.orig 2021-03-09 10:30:08.626424998 -0800 -+++ rustc-beta-src/Cargo.lock 2021-03-09 10:32:38.096207704 -0800 -@@ -899,7 +899,6 @@ +--- rustc-1.55.0-src/Cargo.lock.orig 2021-09-07 16:33:21.672163689 -0700 ++++ rustc-1.55.0-src/Cargo.lock 2021-09-07 16:33:21.673163668 -0700 +@@ -877,7 +877,6 @@ dependencies = [ "cc", "libc", @@ -8,8 +8,8 @@ "libz-sys", "openssl-sys", "pkg-config", -@@ -1860,16 +1859,6 @@ - ] +@@ -1907,16 +1906,6 @@ + checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" [[package]] -name = "libnghttp2-sys" @@ -25,20 +25,20 @@ name = "libz-sys" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" ---- rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2021-03-05 08:34:15.000000000 -0800 -+++ rustc-beta-src/src/tools/cargo/Cargo.toml 2021-03-09 10:32:38.096207704 -0800 +--- rustc-1.55.0-src/src/tools/cargo/Cargo.toml.orig 2021-09-07 16:33:21.673163668 -0700 ++++ rustc-1.55.0-src/src/tools/cargo/Cargo.toml 2021-09-07 16:34:59.637068004 -0700 @@ -25,7 +25,7 @@ + cargo-util = { path = "crates/cargo-util", version = "0.1.1" } crates-io = { path = "crates/crates-io", version = "0.33.0" } crossbeam-utils = "0.8" - crypto-hash = "0.3.1" --curl = { version = "0.4.23", features = ["http2"] } -+curl = { version = "0.4.23", features = [] } - curl-sys = "0.4.22" - env_logger = "0.8.1" +-curl = { version = "0.4.38", features = ["http2"] } ++curl = { version = "0.4.38", features = [] } + curl-sys = "0.4.45" + env_logger = "0.9.0" pretty_env_logger = { version = "0.4", optional = true } ---- rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs.orig 2021-03-05 08:34:15.000000000 -0800 -+++ rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs 2021-03-09 10:32:38.096207704 -0800 -@@ -412,14 +412,8 @@ +--- rustc-1.55.0-src/src/tools/cargo/src/cargo/core/package.rs.orig 2021-09-06 11:42:51.000000000 -0700 ++++ rustc-1.55.0-src/src/tools/cargo/src/cargo/core/package.rs 2021-09-07 16:33:21.674163646 -0700 +@@ -417,14 +417,8 @@ // Also note that pipelining is disabled as curl authors have indicated // that it's buggy, and we've empirically seen that it's buggy with HTTP // proxies. @@ -46,7 +46,7 @@ - let multiplexing = config.http_config()?.multiplexing.unwrap_or(true); - multi - .pipelining(false, multiplexing) -- .chain_err(|| "failed to enable multiplexing/pipelining in curl")?; +- .with_context(|| "failed to enable multiplexing/pipelining in curl")?; - - // let's not flood crates.io with connections - multi.set_max_host_connections(2)?; @@ -55,7 +55,7 @@ Ok(PackageSet { packages: package_ids -@@ -592,7 +586,7 @@ +@@ -597,7 +591,7 @@ macro_rules! try_old_curl { ($e:expr, $msg:expr) => { let result = $e; diff --git a/SOURCES/rustc-1.55.0-llvm-13.patch b/SOURCES/rustc-1.55.0-llvm-13.patch new file mode 100644 index 0000000..21cecbd --- /dev/null +++ b/SOURCES/rustc-1.55.0-llvm-13.patch @@ -0,0 +1,898 @@ +From e84e42e37057d51f68075845c92ad817c1893857 Mon Sep 17 00:00:00 2001 +From: bors +Date: Sat, 21 Aug 2021 09:25:28 +0000 +Subject: [PATCH] Auto merge of #87570 - nikic:llvm-13, r=nagisa + +Upgrade to LLVM 13 + +Work in progress update to LLVM 13. Main changes: + + * InlineAsm diagnostics reported using SrcMgr diagnostic kind are now handled. Previously these used a separate diag handler. + * Codegen tests are updated for additional attributes. + * Some data layouts have changed. + * Switch `#[used]` attribute from `llvm.used` to `llvm.compiler.used` to avoid SHF_GNU_RETAIN flag introduced in https://reviews.llvm.org/D97448, which appears to trigger a bug in older versions of gold. + * Set `LLVM_INCLUDE_TESTS=OFF` to avoid Python 3.6 requirement. + +Upstream issues: + + * ~~https://bugs.llvm.org/show_bug.cgi?id=51210 (InlineAsm diagnostic reporting for module asm)~~ Fixed by https://github.com/llvm/llvm-project/commit/1558bb80c01b695ce12642527cbfccf16cf54ece. + * ~~https://bugs.llvm.org/show_bug.cgi?id=51476 (Miscompile on AArch64 due to incorrect comparison elimination)~~ Fixed by https://github.com/llvm/llvm-project/commit/81b106584f2baf33e09be2362c35c1bf2f6bfe94. + * https://bugs.llvm.org/show_bug.cgi?id=51207 (Can't set custom section flags anymore). Problematic change reverted in our fork, https://reviews.llvm.org/D107216 posted for upstream revert. + * https://bugs.llvm.org/show_bug.cgi?id=51211 (Regression in codegen for #83623). This is an optimization regression that we may likely have to eat for this release. The fix for #83623 was based on an incorrect premise, and this needs to be properly addressed in the MergeICmps pass. + +The [compile-time impact](https://perf.rust-lang.org/compare.html?start=ef9549b6c0efb7525c9b012148689c8d070f9bc0&end=0983094463497eec22d550dad25576a894687002) is mixed, but quite positive as LLVM upgrades go. + +The LLVM 13 final release is scheduled for Sep 21st. The current nightly is scheduled for stable release on Oct 21st. + +r? `@ghost` + +(cherry picked from commit db002a06ae9154a35d410550bc5132df883d7baa) +--- + compiler/rustc_codegen_llvm/src/back/write.rs | 43 +-------- + compiler/rustc_codegen_llvm/src/base.rs | 8 +- + compiler/rustc_codegen_llvm/src/consts.rs | 15 ++- + compiler/rustc_codegen_llvm/src/context.rs | 55 ++++++++--- + compiler/rustc_codegen_llvm/src/lib.rs | 2 +- + .../rustc_codegen_llvm/src/llvm/diagnostic.rs | 94 +++++++++++++++---- + compiler/rustc_codegen_llvm/src/llvm/ffi.rs | 7 +- + compiler/rustc_codegen_ssa/src/traits/misc.rs | 2 + + .../rustc_codegen_ssa/src/traits/statics.rs | 18 ++-- + compiler/rustc_feature/src/accepted.rs | 2 +- + .../rustc_llvm/llvm-wrapper/RustWrapper.cpp | 20 +++- + .../src/spec/powerpc64_unknown_linux_gnu.rs | 2 +- + .../src/spec/powerpc64_unknown_linux_musl.rs | 2 +- + .../src/spec/powerpc64_wrs_vxworks.rs | 2 +- + .../src/spec/powerpc64le_unknown_linux_gnu.rs | 2 +- + .../spec/powerpc64le_unknown_linux_musl.rs | 2 +- + .../src/spec/wasm32_unknown_emscripten.rs | 2 +- + .../src/spec/wasm32_unknown_unknown.rs | 2 +- + compiler/rustc_target/src/spec/wasm32_wasi.rs | 2 +- + .../src/spec/wasm64_unknown_unknown.rs | 2 +- + src/bootstrap/native.rs | 1 + + src/test/codegen/array-equality.rs | 4 +- + .../codegen/issue-83623-SIMD-PartialEq.rs | 46 --------- + src/test/codegen/repeat-trusted-len.rs | 2 +- + .../coverage-llvmir/Makefile | 2 - + .../coverage-llvmir/filecheck.testprog.txt | 18 ++-- + src/test/ui/llvm-asm/issue-69092.rs | 4 +- + src/test/ui/llvm-asm/issue-69092.stderr | 4 +- + 29 files changed, 200 insertions(+), 167 deletions(-) + delete mode 100644 src/test/codegen/issue-83623-SIMD-PartialEq.rs + +diff --git a/compiler/rustc_codegen_llvm/src/back/write.rs b/compiler/rustc_codegen_llvm/src/back/write.rs +index 5b4a187a1d56..791604a18273 100644 +--- a/compiler/rustc_codegen_llvm/src/back/write.rs ++++ b/compiler/rustc_codegen_llvm/src/back/write.rs +@@ -296,39 +296,8 @@ fn report_inline_asm( + } + let (cgcx, _) = *(user as *const (&CodegenContext, &Handler)); + +- // Recover the post-substitution assembly code from LLVM for better +- // diagnostics. +- let mut have_source = false; +- let mut buffer = String::new(); +- let mut level = llvm::DiagnosticLevel::Error; +- let mut loc = 0; +- let mut ranges = [0; 8]; +- let mut num_ranges = ranges.len() / 2; +- let msg = llvm::build_string(|msg| { +- buffer = llvm::build_string(|buffer| { +- have_source = llvm::LLVMRustUnpackSMDiagnostic( +- diag, +- msg, +- buffer, +- &mut level, +- &mut loc, +- ranges.as_mut_ptr(), +- &mut num_ranges, +- ); +- }) +- .expect("non-UTF8 inline asm"); +- }) +- .expect("non-UTF8 SMDiagnostic"); +- +- let source = have_source.then(|| { +- let mut spans = vec![InnerSpan::new(loc as usize, loc as usize)]; +- for i in 0..num_ranges { +- spans.push(InnerSpan::new(ranges[i * 2] as usize, ranges[i * 2 + 1] as usize)); +- } +- (buffer, spans) +- }); +- +- report_inline_asm(cgcx, msg, level, cookie, source); ++ let smdiag = llvm::diagnostic::SrcMgrDiagnostic::unpack(diag); ++ report_inline_asm(cgcx, smdiag.message, smdiag.level, cookie, smdiag.source); + } + + unsafe extern "C" fn diagnostic_handler(info: &DiagnosticInfo, user: *mut c_void) { +@@ -339,13 +308,7 @@ fn report_inline_asm( + + match llvm::diagnostic::Diagnostic::unpack(info) { + llvm::diagnostic::InlineAsm(inline) => { +- report_inline_asm( +- cgcx, +- llvm::twine_to_string(inline.message), +- inline.level, +- inline.cookie, +- None, +- ); ++ report_inline_asm(cgcx, inline.message, inline.level, inline.cookie, inline.source); + } + + llvm::diagnostic::Optimization(opt) => { +diff --git a/compiler/rustc_codegen_llvm/src/base.rs b/compiler/rustc_codegen_llvm/src/base.rs +index cc3cbea4def5..a6bdbd11899d 100644 +--- a/compiler/rustc_codegen_llvm/src/base.rs ++++ b/compiler/rustc_codegen_llvm/src/base.rs +@@ -157,16 +157,18 @@ fn module_codegen(tcx: TyCtxt<'_>, cgu_name: Symbol) -> ModuleCodegen { + /// See for details + pub used_statics: RefCell>, + ++ /// Statics that will be placed in the llvm.compiler.used variable ++ /// See for details ++ pub compiler_used_statics: RefCell>, ++ + pub lltypes: RefCell, Option), &'ll Type>>, + pub scalar_lltypes: RefCell, &'ll Type>>, + pub pointee_infos: RefCell, Size), Option>>, +@@ -101,10 +105,6 @@ fn to_llvm_tls_model(tls_model: TlsModel) -> llvm::ThreadLocalMode { + } + } + +-fn strip_powerpc64_vectors(data_layout: String) -> String { +- data_layout.replace("-v256:256:256-v512:512:512", "") +-} +- + pub unsafe fn create_module( + tcx: TyCtxt<'_>, + llcx: &'ll llvm::Context, +@@ -116,7 +116,18 @@ pub unsafe fn create_module( + + let mut target_data_layout = sess.target.data_layout.clone(); + if llvm_util::get_version() < (12, 0, 0) && sess.target.arch == "powerpc64" { +- target_data_layout = strip_powerpc64_vectors(target_data_layout); ++ target_data_layout = target_data_layout.replace("-v256:256:256-v512:512:512", ""); ++ } ++ if llvm_util::get_version() < (13, 0, 0) { ++ if sess.target.arch == "powerpc64" { ++ target_data_layout = target_data_layout.replace("-S128", ""); ++ } ++ if sess.target.arch == "wasm32" { ++ target_data_layout = "e-m:e-p:32:32-i64:64-n32:64-S128".to_string(); ++ } ++ if sess.target.arch == "wasm64" { ++ target_data_layout = "e-m:e-p:64:64-i64:64-n32:64-S128".to_string(); ++ } + } + + // Ensure the data-layout values hardcoded remain the defaults. +@@ -304,6 +315,7 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> { + const_globals: Default::default(), + statics_to_rauw: RefCell::new(Vec::new()), + used_statics: RefCell::new(Vec::new()), ++ compiler_used_statics: RefCell::new(Vec::new()), + lltypes: Default::default(), + scalar_lltypes: Default::default(), + pointee_infos: Default::default(), +@@ -326,6 +338,18 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> { + pub fn coverage_context(&'a self) -> Option<&'a coverageinfo::CrateCoverageContext<'ll, 'tcx>> { + self.coverage_cx.as_ref() + } ++ ++ fn create_used_variable_impl(&self, name: &'static CStr, values: &[&'ll Value]) { ++ let section = cstr!("llvm.metadata"); ++ let array = self.const_array(&self.type_ptr_to(self.type_i8()), values); ++ ++ unsafe { ++ let g = llvm::LLVMAddGlobal(self.llmod, self.val_ty(array), name.as_ptr()); ++ llvm::LLVMSetInitializer(g, array); ++ llvm::LLVMRustSetLinkage(g, llvm::Linkage::AppendingLinkage); ++ llvm::LLVMSetSection(g, section.as_ptr()); ++ } ++ } + } + + impl MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> { +@@ -416,6 +440,10 @@ fn used_statics(&self) -> &RefCell> { + &self.used_statics + } + ++ fn compiler_used_statics(&self) -> &RefCell> { ++ &self.compiler_used_statics ++ } ++ + fn set_frame_pointer_type(&self, llfn: &'ll Value) { + attributes::set_frame_pointer_type(self, llfn) + } +@@ -426,17 +454,14 @@ fn apply_target_cpu_attr(&self, llfn: &'ll Value) { + } + + fn create_used_variable(&self) { +- let name = cstr!("llvm.used"); +- let section = cstr!("llvm.metadata"); +- let array = +- self.const_array(&self.type_ptr_to(self.type_i8()), &*self.used_statics.borrow()); ++ self.create_used_variable_impl(cstr!("llvm.used"), &*self.used_statics.borrow()); ++ } + +- unsafe { +- let g = llvm::LLVMAddGlobal(self.llmod, self.val_ty(array), name.as_ptr()); +- llvm::LLVMSetInitializer(g, array); +- llvm::LLVMRustSetLinkage(g, llvm::Linkage::AppendingLinkage); +- llvm::LLVMSetSection(g, section.as_ptr()); +- } ++ fn create_compiler_used_variable(&self) { ++ self.create_used_variable_impl( ++ cstr!("llvm.compiler.used"), ++ &*self.compiler_used_statics.borrow(), ++ ); + } + + fn declare_c_main(&self, fn_type: Self::Type) -> Option { +diff --git a/compiler/rustc_codegen_llvm/src/lib.rs b/compiler/rustc_codegen_llvm/src/lib.rs +index aa4db1622b23..1e6e5252b25d 100644 +--- a/compiler/rustc_codegen_llvm/src/lib.rs ++++ b/compiler/rustc_codegen_llvm/src/lib.rs +@@ -352,8 +352,8 @@ fn llmod(&self) -> &llvm::Module { + impl Drop for ModuleLlvm { + fn drop(&mut self) { + unsafe { +- llvm::LLVMContextDispose(&mut *(self.llcx as *mut _)); + llvm::LLVMRustDisposeTargetMachine(&mut *(self.tm as *mut _)); ++ llvm::LLVMContextDispose(&mut *(self.llcx as *mut _)); + } + } + } +diff --git a/compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs b/compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs +index ccd3e42e458f..36aa022d7465 100644 +--- a/compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs ++++ b/compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs +@@ -6,7 +6,8 @@ + use crate::value::Value; + use libc::c_uint; + +-use super::{DiagnosticInfo, Twine}; ++use super::{DiagnosticInfo, SMDiagnostic}; ++use rustc_span::InnerSpan; + + #[derive(Copy, Clone)] + pub enum OptimizationDiagnosticKind { +@@ -86,36 +87,91 @@ unsafe fn unpack(kind: OptimizationDiagnosticKind, di: &'ll DiagnosticInfo) -> S + } + } + +-#[derive(Copy, Clone)] +-pub struct InlineAsmDiagnostic<'ll> { ++pub struct SrcMgrDiagnostic { ++ pub level: super::DiagnosticLevel, ++ pub message: String, ++ pub source: Option<(String, Vec)>, ++} ++ ++impl SrcMgrDiagnostic { ++ pub unsafe fn unpack(diag: &SMDiagnostic) -> SrcMgrDiagnostic { ++ // Recover the post-substitution assembly code from LLVM for better ++ // diagnostics. ++ let mut have_source = false; ++ let mut buffer = String::new(); ++ let mut level = super::DiagnosticLevel::Error; ++ let mut loc = 0; ++ let mut ranges = [0; 8]; ++ let mut num_ranges = ranges.len() / 2; ++ let message = super::build_string(|message| { ++ buffer = super::build_string(|buffer| { ++ have_source = super::LLVMRustUnpackSMDiagnostic( ++ diag, ++ message, ++ buffer, ++ &mut level, ++ &mut loc, ++ ranges.as_mut_ptr(), ++ &mut num_ranges, ++ ); ++ }) ++ .expect("non-UTF8 inline asm"); ++ }) ++ .expect("non-UTF8 SMDiagnostic"); ++ ++ SrcMgrDiagnostic { ++ message, ++ level, ++ source: have_source.then(|| { ++ let mut spans = vec![InnerSpan::new(loc as usize, loc as usize)]; ++ for i in 0..num_ranges { ++ spans.push(InnerSpan::new(ranges[i * 2] as usize, ranges[i * 2 + 1] as usize)); ++ } ++ (buffer, spans) ++ }), ++ } ++ } ++} ++ ++#[derive(Clone)] ++pub struct InlineAsmDiagnostic { + pub level: super::DiagnosticLevel, + pub cookie: c_uint, +- pub message: &'ll Twine, +- pub instruction: Option<&'ll Value>, ++ pub message: String, ++ pub source: Option<(String, Vec)>, + } + +-impl InlineAsmDiagnostic<'ll> { +- unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self { ++impl InlineAsmDiagnostic { ++ unsafe fn unpackInlineAsm(di: &'ll DiagnosticInfo) -> Self { + let mut cookie = 0; + let mut message = None; +- let mut instruction = None; + let mut level = super::DiagnosticLevel::Error; + +- super::LLVMRustUnpackInlineAsmDiagnostic( +- di, +- &mut level, +- &mut cookie, +- &mut message, +- &mut instruction, +- ); ++ super::LLVMRustUnpackInlineAsmDiagnostic(di, &mut level, &mut cookie, &mut message); + +- InlineAsmDiagnostic { level, cookie, message: message.unwrap(), instruction } ++ InlineAsmDiagnostic { ++ level, ++ cookie, ++ message: super::twine_to_string(message.unwrap()), ++ source: None, ++ } ++ } ++ ++ unsafe fn unpackSrcMgr(di: &'ll DiagnosticInfo) -> Self { ++ let mut cookie = 0; ++ let smdiag = SrcMgrDiagnostic::unpack(super::LLVMRustGetSMDiagnostic(di, &mut cookie)); ++ InlineAsmDiagnostic { ++ level: smdiag.level, ++ cookie, ++ message: smdiag.message, ++ source: smdiag.source, ++ } + } + } + + pub enum Diagnostic<'ll> { + Optimization(OptimizationDiagnostic<'ll>), +- InlineAsm(InlineAsmDiagnostic<'ll>), ++ InlineAsm(InlineAsmDiagnostic), + PGO(&'ll DiagnosticInfo), + Linker(&'ll DiagnosticInfo), + Unsupported(&'ll DiagnosticInfo), +@@ -130,7 +186,7 @@ pub unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self { + let kind = super::LLVMRustGetDiagInfoKind(di); + + match kind { +- Dk::InlineAsm => InlineAsm(InlineAsmDiagnostic::unpack(di)), ++ Dk::InlineAsm => InlineAsm(InlineAsmDiagnostic::unpackInlineAsm(di)), + + Dk::OptimizationRemark => { + Optimization(OptimizationDiagnostic::unpack(OptimizationRemark, di)) +@@ -162,6 +218,8 @@ pub unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self { + Dk::Linker => Linker(di), + Dk::Unsupported => Unsupported(di), + ++ Dk::SrcMgr => InlineAsm(InlineAsmDiagnostic::unpackSrcMgr(di)), ++ + _ => UnknownDiagnostic(di), + } + } +diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs +index 68d566cca095..7d5388b9abb8 100644 +--- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs ++++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs +@@ -490,6 +490,7 @@ pub enum DiagnosticKind { + PGOProfile, + Linker, + Unsupported, ++ SrcMgr, + } + + /// LLVMRustDiagnosticLevel +@@ -2258,13 +2259,17 @@ pub fn LLVMRustUnpackInlineAsmDiagnostic( + level_out: &mut DiagnosticLevel, + cookie_out: &mut c_uint, + message_out: &mut Option<&'a Twine>, +- instruction_out: &mut Option<&'a Value>, + ); + + #[allow(improper_ctypes)] + pub fn LLVMRustWriteDiagnosticInfoToString(DI: &DiagnosticInfo, s: &RustString); + pub fn LLVMRustGetDiagInfoKind(DI: &DiagnosticInfo) -> DiagnosticKind; + ++ pub fn LLVMRustGetSMDiagnostic( ++ DI: &'a DiagnosticInfo, ++ cookie_out: &mut c_uint, ++ ) -> &'a SMDiagnostic; ++ + pub fn LLVMRustSetInlineAsmDiagnosticHandler( + C: &Context, + H: InlineAsmDiagHandler, +diff --git a/compiler/rustc_codegen_ssa/src/traits/misc.rs b/compiler/rustc_codegen_ssa/src/traits/misc.rs +index 46f2adbe5520..4266e42ec2b5 100644 +--- a/compiler/rustc_codegen_ssa/src/traits/misc.rs ++++ b/compiler/rustc_codegen_ssa/src/traits/misc.rs +@@ -16,9 +16,11 @@ fn vtables( + fn sess(&self) -> &Session; + fn codegen_unit(&self) -> &'tcx CodegenUnit<'tcx>; + fn used_statics(&self) -> &RefCell>; ++ fn compiler_used_statics(&self) -> &RefCell>; + fn set_frame_pointer_type(&self, llfn: Self::Function); + fn apply_target_cpu_attr(&self, llfn: Self::Function); + fn create_used_variable(&self); ++ fn create_compiler_used_variable(&self); + /// Declares the extern "C" main function for the entry point. Returns None if the symbol already exists. + fn declare_c_main(&self, fn_type: Self::Type) -> Option; + } +diff --git a/compiler/rustc_codegen_ssa/src/traits/statics.rs b/compiler/rustc_codegen_ssa/src/traits/statics.rs +index 817fc02d166a..a2a3cb56c780 100644 +--- a/compiler/rustc_codegen_ssa/src/traits/statics.rs ++++ b/compiler/rustc_codegen_ssa/src/traits/statics.rs +@@ -6,17 +6,15 @@ pub trait StaticMethods: BackendTypes { + fn static_addr_of(&self, cv: Self::Value, align: Align, kind: Option<&str>) -> Self::Value; + fn codegen_static(&self, def_id: DefId, is_mutable: bool); + +- /// Mark the given global value as "used", to prevent a backend from potentially removing a +- /// static variable that may otherwise appear unused. +- /// +- /// Static variables in Rust can be annotated with the `#[used]` attribute to direct the `rustc` +- /// compiler to mark the variable as a "used global". +- /// +- /// ```no_run +- /// #[used] +- /// static FOO: u32 = 0; +- /// ``` ++ /// Mark the given global value as "used", to prevent the compiler and linker from potentially ++ /// removing a static variable that may otherwise appear unused. + fn add_used_global(&self, global: Self::Value); ++ ++ /// Same as add_used_global(), but only prevent the compiler from potentially removing an ++ /// otherwise unused symbol. The linker is still permitted to drop it. ++ /// ++ /// This corresponds to the semantics of the `#[used]` attribute. ++ fn add_compiler_used_global(&self, global: Self::Value); + } + + pub trait StaticBuilderMethods: BackendTypes { +diff --git a/compiler/rustc_feature/src/accepted.rs b/compiler/rustc_feature/src/accepted.rs +index 95504723e7b2..690a6f541ff3 100644 +--- a/compiler/rustc_feature/src/accepted.rs ++++ b/compiler/rustc_feature/src/accepted.rs +@@ -178,7 +178,7 @@ macro_rules! declare_features { + /// Allows annotating functions conforming to `fn(&PanicInfo) -> !` with `#[panic_handler]`. + /// This defines the behavior of panics. + (accepted, panic_handler, "1.30.0", Some(44489), None), +- /// Allows `#[used]` to preserve symbols (see llvm.used). ++ /// Allows `#[used]` to preserve symbols (see llvm.compiler.used). + (accepted, used, "1.30.0", Some(40289), None), + /// Allows `crate` in paths. + (accepted, crate_in_paths, "1.30.0", Some(45477), None), +diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +index 4cdc8a4155bc..fa47dc9caa0b 100644 +--- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp ++++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +@@ -1114,15 +1114,13 @@ extern "C" void + LLVMRustUnpackInlineAsmDiagnostic(LLVMDiagnosticInfoRef DI, + LLVMRustDiagnosticLevel *LevelOut, + unsigned *CookieOut, +- LLVMTwineRef *MessageOut, +- LLVMValueRef *InstructionOut) { ++ LLVMTwineRef *MessageOut) { + // Undefined to call this not on an inline assembly diagnostic! + llvm::DiagnosticInfoInlineAsm *IA = + static_cast(unwrap(DI)); + + *CookieOut = IA->getLocCookie(); + *MessageOut = wrap(&IA->getMsgStr()); +- *InstructionOut = wrap(IA->getInstruction()); + + switch (IA->getSeverity()) { + case DS_Error: +@@ -1165,6 +1163,7 @@ enum class LLVMRustDiagnosticKind { + PGOProfile, + Linker, + Unsupported, ++ SrcMgr, + }; + + static LLVMRustDiagnosticKind toRust(DiagnosticKind Kind) { +@@ -1193,6 +1192,10 @@ static LLVMRustDiagnosticKind toRust(DiagnosticKind Kind) { + return LLVMRustDiagnosticKind::Linker; + case DK_Unsupported: + return LLVMRustDiagnosticKind::Unsupported; ++#if LLVM_VERSION_GE(13, 0) ++ case DK_SrcMgr: ++ return LLVMRustDiagnosticKind::SrcMgr; ++#endif + default: + return (Kind >= DK_FirstRemark && Kind <= DK_LastRemark) + ? LLVMRustDiagnosticKind::OptimizationRemarkOther +@@ -1280,6 +1283,17 @@ extern "C" void LLVMRustSetInlineAsmDiagnosticHandler( + #endif + } + ++extern "C" LLVMSMDiagnosticRef LLVMRustGetSMDiagnostic( ++ LLVMDiagnosticInfoRef DI, unsigned *Cookie) { ++#if LLVM_VERSION_GE(13, 0) ++ llvm::DiagnosticInfoSrcMgr *SM = static_cast(unwrap(DI)); ++ *Cookie = SM->getLocCookie(); ++ return wrap(&SM->getSMDiag()); ++#else ++ report_fatal_error("Shouldn't get called on older versions"); ++#endif ++} ++ + extern "C" bool LLVMRustUnpackSMDiagnostic(LLVMSMDiagnosticRef DRef, + RustStringRef MessageOut, + RustStringRef BufferOut, +diff --git a/compiler/rustc_target/src/spec/powerpc64_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/powerpc64_unknown_linux_gnu.rs +index 559a1a40868f..f10d4d49bb90 100644 +--- a/compiler/rustc_target/src/spec/powerpc64_unknown_linux_gnu.rs ++++ b/compiler/rustc_target/src/spec/powerpc64_unknown_linux_gnu.rs +@@ -14,7 +14,7 @@ pub fn target() -> Target { + Target { + llvm_target: "powerpc64-unknown-linux-gnu".to_string(), + pointer_width: 64, +- data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), ++ data_layout: "E-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512".to_string(), + arch: "powerpc64".to_string(), + options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base }, + } +diff --git a/compiler/rustc_target/src/spec/powerpc64_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/powerpc64_unknown_linux_musl.rs +index f1190b159aba..611621727bd1 100644 +--- a/compiler/rustc_target/src/spec/powerpc64_unknown_linux_musl.rs ++++ b/compiler/rustc_target/src/spec/powerpc64_unknown_linux_musl.rs +@@ -10,7 +10,7 @@ pub fn target() -> Target { + Target { + llvm_target: "powerpc64-unknown-linux-musl".to_string(), + pointer_width: 64, +- data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), ++ data_layout: "E-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512".to_string(), + arch: "powerpc64".to_string(), + options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base }, + } +diff --git a/compiler/rustc_target/src/spec/powerpc64_wrs_vxworks.rs b/compiler/rustc_target/src/spec/powerpc64_wrs_vxworks.rs +index 3ebc5469e0a8..9c63997ce2f9 100644 +--- a/compiler/rustc_target/src/spec/powerpc64_wrs_vxworks.rs ++++ b/compiler/rustc_target/src/spec/powerpc64_wrs_vxworks.rs +@@ -10,7 +10,7 @@ pub fn target() -> Target { + Target { + llvm_target: "powerpc64-unknown-linux-gnu".to_string(), + pointer_width: 64, +- data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), ++ data_layout: "E-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512".to_string(), + arch: "powerpc64".to_string(), + options: TargetOptions { endian: Endian::Big, ..base }, + } +diff --git a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs +index 76f70e474f07..f645eceadfe3 100644 +--- a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs ++++ b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs +@@ -9,7 +9,7 @@ pub fn target() -> Target { + Target { + llvm_target: "powerpc64le-unknown-linux-gnu".to_string(), + pointer_width: 64, +- data_layout: "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), ++ data_layout: "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512".to_string(), + arch: "powerpc64".to_string(), + options: TargetOptions { mcount: "_mcount".to_string(), ..base }, + } +diff --git a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_musl.rs +index 42c49103b3b4..934371fb2211 100644 +--- a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_musl.rs ++++ b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_musl.rs +@@ -9,7 +9,7 @@ pub fn target() -> Target { + Target { + llvm_target: "powerpc64le-unknown-linux-musl".to_string(), + pointer_width: 64, +- data_layout: "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), ++ data_layout: "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512".to_string(), + arch: "powerpc64".to_string(), + options: TargetOptions { mcount: "_mcount".to_string(), ..base }, + } +diff --git a/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs b/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs +index 302139395d31..86b1a7552335 100644 +--- a/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs ++++ b/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs +@@ -43,7 +43,7 @@ pub fn target() -> Target { + Target { + llvm_target: "wasm32-unknown-emscripten".to_string(), + pointer_width: 32, +- data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128".to_string(), ++ data_layout: "e-m:e-p:32:32-i64:64-f128:64-n32:64-S128-ni:1:10:20".to_string(), + arch: "wasm32".to_string(), + options: opts, + } +diff --git a/compiler/rustc_target/src/spec/wasm32_unknown_unknown.rs b/compiler/rustc_target/src/spec/wasm32_unknown_unknown.rs +index 834c4dbfc05f..134c6803b15d 100644 +--- a/compiler/rustc_target/src/spec/wasm32_unknown_unknown.rs ++++ b/compiler/rustc_target/src/spec/wasm32_unknown_unknown.rs +@@ -54,7 +54,7 @@ pub fn target() -> Target { + Target { + llvm_target: "wasm32-unknown-unknown".to_string(), + pointer_width: 32, +- data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128".to_string(), ++ data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128-ni:1:10:20".to_string(), + arch: "wasm32".to_string(), + options, + } +diff --git a/compiler/rustc_target/src/spec/wasm32_wasi.rs b/compiler/rustc_target/src/spec/wasm32_wasi.rs +index a6b12d2ee8f6..2dab206dc760 100644 +--- a/compiler/rustc_target/src/spec/wasm32_wasi.rs ++++ b/compiler/rustc_target/src/spec/wasm32_wasi.rs +@@ -109,7 +109,7 @@ pub fn target() -> Target { + Target { + llvm_target: "wasm32-wasi".to_string(), + pointer_width: 32, +- data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128".to_string(), ++ data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128-ni:1:10:20".to_string(), + arch: "wasm32".to_string(), + options, + } +diff --git a/compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs b/compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs +index 8bfb229d77f6..fb6526c0e720 100644 +--- a/compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs ++++ b/compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs +@@ -32,7 +32,7 @@ pub fn target() -> Target { + Target { + llvm_target: "wasm64-unknown-unknown".to_string(), + pointer_width: 64, +- data_layout: "e-m:e-p:64:64-i64:64-n32:64-S128".to_string(), ++ data_layout: "e-m:e-p:64:64-i64:64-n32:64-S128-ni:1:10:20".to_string(), + arch: "wasm64".to_string(), + options, + } +diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs +index 1be414b29a1a..63a252154b90 100644 +--- a/src/bootstrap/native.rs ++++ b/src/bootstrap/native.rs +@@ -174,6 +174,7 @@ fn run(self, builder: &Builder<'_>) -> PathBuf { + .define("LLVM_INCLUDE_EXAMPLES", "OFF") + .define("LLVM_INCLUDE_DOCS", "OFF") + .define("LLVM_INCLUDE_BENCHMARKS", "OFF") ++ .define("LLVM_INCLUDE_TESTS", "OFF") + .define("LLVM_ENABLE_TERMINFO", "OFF") + .define("LLVM_ENABLE_LIBEDIT", "OFF") + .define("LLVM_ENABLE_BINDINGS", "OFF") +diff --git a/src/test/codegen/array-equality.rs b/src/test/codegen/array-equality.rs +index 4b60fa4b0bff..fefc232b4904 100644 +--- a/src/test/codegen/array-equality.rs ++++ b/src/test/codegen/array-equality.rs +@@ -29,7 +29,7 @@ + // CHECK-NEXT: start: + // CHECK-NEXT: bitcast + // CHECK-NEXT: bitcast +- // CHECK-NEXT: %[[CMP:.+]] = tail call i32 @{{bcmp|memcmp}}(i8* nonnull dereferenceable(18) %{{.+}}, i8* nonnull dereferenceable(18) %{{.+}}, i64 18) ++ // CHECK-NEXT: %[[CMP:.+]] = tail call i32 @{{bcmp|memcmp}}(i8* {{.*}} dereferenceable(18) %{{.+}}, i8* {{.*}} dereferenceable(18) %{{.+}}, i64 18) + // CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[CMP]], 0 + // CHECK-NEXT: ret i1 %[[EQ]] + a == b +@@ -41,7 +41,7 @@ + // CHECK-NEXT: start: + // CHECK-NEXT: bitcast + // CHECK-NEXT: bitcast +- // CHECK-NEXT: %[[CMP:.+]] = tail call i32 @{{bcmp|memcmp}}(i8* nonnull dereferenceable(2468) %{{.+}}, i8* nonnull dereferenceable(2468) %{{.+}}, i64 2468) ++ // CHECK-NEXT: %[[CMP:.+]] = tail call i32 @{{bcmp|memcmp}}(i8* {{.*}} dereferenceable(2468) %{{.+}}, i8* {{.*}} dereferenceable(2468) %{{.+}}, i64 2468) + // CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[CMP]], 0 + // CHECK-NEXT: ret i1 %[[EQ]] + a == b +diff --git a/src/test/codegen/issue-83623-SIMD-PartialEq.rs b/src/test/codegen/issue-83623-SIMD-PartialEq.rs +deleted file mode 100644 +index b22b7f52402d..000000000000 +--- a/src/test/codegen/issue-83623-SIMD-PartialEq.rs ++++ /dev/null +@@ -1,46 +0,0 @@ +-// This test checks that jumps generated by logical operators can be optimized away +- +-// compile-flags: -Copt-level=3 +-// only-64bit +- +-#![crate_type="lib"] +- +-pub struct Blueprint { +- pub fuel_tank_size: u32, +- pub payload: u32, +- pub wheel_diameter: u32, +- pub wheel_width: u32, +- pub storage: u32, +-} +- +-// && chains should not prevent SIMD optimizations for primitives +-impl PartialEq for Blueprint{ +- fn eq(&self, other: &Self)->bool{ +- // CHECK-NOT: call{{.*}}bcmp +- // CHECK-NOT: call{{.*}}memcmp +- // CHECK-NOT: br {{.*}} +- self.fuel_tank_size == other.fuel_tank_size +- && self.payload == other.payload +- && self.wheel_diameter == other.wheel_diameter +- && self.wheel_width == other.wheel_width +- && self.storage == other.storage +- } +-} +- +-#[derive(PartialEq)] +-pub struct Blueprint2 { +- pub fuel_tank_size: u32, +- pub payload: u32, +- pub wheel_diameter: u32, +- pub wheel_width: u32, +- pub storage: u32, +-} +- +-// Derived PartialEq should not generate jumps and should use SIMD +-#[no_mangle] +-pub fn partial_eq_should_not_jump(a: &Blueprint2, b:&Blueprint2)->bool{ +- // CHECK-NOT: call{{.*}}bcmp +- // CHECK-NOT: call{{.*}}memcmp +- // CHECK-NOT: br {{.*}} +- a==b +-} +diff --git a/src/test/codegen/repeat-trusted-len.rs b/src/test/codegen/repeat-trusted-len.rs +index 9e904fc82ab4..cb2d0ef809af 100644 +--- a/src/test/codegen/repeat-trusted-len.rs ++++ b/src/test/codegen/repeat-trusted-len.rs +@@ -8,6 +8,6 @@ + // CHECK-LABEL: @repeat_take_collect + #[no_mangle] + pub fn repeat_take_collect() -> Vec { +-// CHECK: call void @llvm.memset.p0i8.i{{[0-9]+}}(i8* {{(nonnull )?}}align 1{{.*}} %{{[0-9]+}}, i8 42, i{{[0-9]+}} 100000, i1 false) ++// CHECK: call void @llvm.memset.p0i8.i{{[0-9]+}}(i8* {{.*}}align 1{{.*}} %{{[0-9]+}}, i8 42, i{{[0-9]+}} 100000, i1 false) + iter::repeat(42).take(100000).collect() + } +diff --git a/src/test/run-make-fulldeps/coverage-llvmir/Makefile b/src/test/run-make-fulldeps/coverage-llvmir/Makefile +index 7d9121ee2f83..1ff1ffcc4b0b 100644 +--- a/src/test/run-make-fulldeps/coverage-llvmir/Makefile ++++ b/src/test/run-make-fulldeps/coverage-llvmir/Makefile +@@ -22,7 +22,6 @@ DEFINE_INTERNAL=define internal + ifdef IS_WINDOWS + LLVM_FILECHECK_OPTIONS=\ + -check-prefixes=CHECK,WINDOWS \ +- -DPRIVATE_GLOBAL='internal global' \ + -DDEFINE_INTERNAL='$(DEFINE_INTERNAL)' \ + -DCOMDAT_IF_SUPPORTED='$(COMDAT_IF_SUPPORTED)' \ + -DINSTR_PROF_DATA='.lprfd$$M' \ +@@ -36,7 +35,6 @@ ifdef IS_WINDOWS + else + LLVM_FILECHECK_OPTIONS=\ + -check-prefixes=CHECK \ +- -DPRIVATE_GLOBAL='private global' \ + -DDEFINE_INTERNAL='$(DEFINE_INTERNAL)' \ + -DCOMDAT_IF_SUPPORTED='$(COMDAT_IF_SUPPORTED)' \ + -DINSTR_PROF_DATA='$(DATA_SECTION_PREFIX)__llvm_prf_data$(INSTR_PROF_DATA_SUFFIX)' \ +diff --git a/src/test/run-make-fulldeps/coverage-llvmir/filecheck.testprog.txt b/src/test/run-make-fulldeps/coverage-llvmir/filecheck.testprog.txt +index a312ec48e849..8e5f21046877 100644 +--- a/src/test/run-make-fulldeps/coverage-llvmir/filecheck.testprog.txt ++++ b/src/test/run-make-fulldeps/coverage-llvmir/filecheck.testprog.txt +@@ -11,27 +11,25 @@ CHECK-SAME: section "[[INSTR_PROF_COVMAP]]", align 8 + + WINDOWS: @__llvm_profile_runtime = external global i32 + +-CHECK: @__profc__R{{[a-zA-Z0-9_]+}}testprog14will_be_called = [[PRIVATE_GLOBAL]] +-CHECK-SAME: section "[[INSTR_PROF_CNTS]]", align 8 ++CHECK: @__profc__R{{[a-zA-Z0-9_]+}}testprog14will_be_called = {{private|internal}} global ++CHECK-SAME: section "[[INSTR_PROF_CNTS]]"{{.*}}, align 8 + +-CHECK: @__profd__R{{[a-zA-Z0-9_]+}}testprog14will_be_called = [[PRIVATE_GLOBAL]] ++CHECK: @__profd__R{{[a-zA-Z0-9_]+}}testprog14will_be_called = {{private|internal}} global + CHECK-SAME: @__profc__R{{[a-zA-Z0-9_]+}}testprog14will_be_called, +-CHECK-SAME: section "[[INSTR_PROF_DATA]]", align 8 ++CHECK-SAME: section "[[INSTR_PROF_DATA]]"{{.*}}, align 8 + +-CHECK: @__profc__R{{[a-zA-Z0-9_]+}}testprog4main = [[PRIVATE_GLOBAL]] +-CHECK-SAME: section "[[INSTR_PROF_CNTS]]", align 8 ++CHECK: @__profc__R{{[a-zA-Z0-9_]+}}testprog4main = {{private|internal}} global ++CHECK-SAME: section "[[INSTR_PROF_CNTS]]"{{.*}}, align 8 + +-CHECK: @__profd__R{{[a-zA-Z0-9_]+}}testprog4main = [[PRIVATE_GLOBAL]] ++CHECK: @__profd__R{{[a-zA-Z0-9_]+}}testprog4main = {{private|internal}} global + CHECK-SAME: @__profc__R{{[a-zA-Z0-9_]+}}testprog4main, +-CHECK-SAME: section "[[INSTR_PROF_DATA]]", align 8 ++CHECK-SAME: section "[[INSTR_PROF_DATA]]"{{.*}}, align 8 + + CHECK: @__llvm_prf_nm = private constant + CHECK-SAME: section "[[INSTR_PROF_NAME]]", align 1 + + CHECK: @llvm.used = appending global + CHECK-SAME: i8* bitcast ({ {{.*}} }* @__llvm_coverage_mapping to i8*) +-WINDOWS-SAME: i8* bitcast (i32 ()* @__llvm_profile_runtime_user to i8*) +-CHECK-SAME: i8* bitcast ({ {{.*}} }* @__profd__R{{[a-zA-Z0-9_]*}}testprog4main to i8*) + CHECK-SAME: i8* getelementptr inbounds ({{.*}}* @__llvm_prf_nm, i32 0, i32 0) + CHECK-SAME: section "llvm.metadata" + +diff --git a/src/test/ui/llvm-asm/issue-69092.rs b/src/test/ui/llvm-asm/issue-69092.rs +index 96c019b760e9..8260e7204686 100644 +--- a/src/test/ui/llvm-asm/issue-69092.rs ++++ b/src/test/ui/llvm-asm/issue-69092.rs +@@ -1,10 +1,12 @@ + // build-fail + // ignore-emscripten no asm! support ++// The error message differs slightly between LLVM versions ++// min-llvm-version: 13.0 + // Regression test for #69092 + + #![feature(llvm_asm)] + + fn main() { + unsafe { llvm_asm!(".ascii \"Xen\0\""); } +- //~^ ERROR: expected string in '.ascii' directive ++ //~^ ERROR: expected string + } +diff --git a/src/test/ui/llvm-asm/issue-69092.stderr b/src/test/ui/llvm-asm/issue-69092.stderr +index 2ca86cf7c1b9..9bce1c0b346f 100644 +--- a/src/test/ui/llvm-asm/issue-69092.stderr ++++ b/src/test/ui/llvm-asm/issue-69092.stderr +@@ -1,5 +1,5 @@ +-error: expected string in '.ascii' directive +- --> $DIR/issue-69092.rs:8:14 ++error: expected string ++ --> $DIR/issue-69092.rs:10:14 + | + LL | unsafe { llvm_asm!(".ascii \"Xen\0\""); } + | ^ +-- +2.33.0 + diff --git a/SPECS/rust.spec b/SPECS/rust.spec index fe2e695..a17053d 100644 --- a/SPECS/rust.spec +++ b/SPECS/rust.spec @@ -10,19 +10,32 @@ # e.g. 1.10.0 wants rustc: 1.9.0-2016-05-24 # or nightly wants some beta-YYYY-MM-DD # Note that cargo matches the program version here, not its crate version. -%global bootstrap_rust 1.50.0 -%global bootstrap_cargo 1.50.0 -%global bootstrap_channel 1.50.0 -%global bootstrap_date 2021-02-11 +%global bootstrap_rust 1.54.0 +%global bootstrap_cargo 1.54.0 +%global bootstrap_channel 1.54.0 +%global bootstrap_date 2021-07-29 # Only the specified arches will use bootstrap binaries. #global bootstrap_arches %%{rust_arches} +# Define a space-separated list of targets to ship rust-std-static-$triple for +# cross-compilation. The packages are noarch, but they're not fully +# reproducible between hosts, so only x86_64 actually builds it. +#ifarch x86_64 +# FIX: Except on RHEL8 modules, we can't filter a noarch package from shipping +# on certain arches, namely s390x for its lack of lld. So we need to make it an +# arch-specific package only for the supported arches. +%ifnarch s390x +%if 0%{?fedora} || 0%{?rhel} >= 8 +%global cross_targets wasm32-unknown-unknown +%endif +%endif + # Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases. %bcond_with llvm_static # We can also choose to just use Rust's bundled LLVM, in case the system LLVM -# is insufficient. Rust currently requires LLVM 9.0+. +# is insufficient. Rust currently requires LLVM 10.0+. %bcond_with bundled_llvm # Requires stable libgit2 1.1 @@ -53,7 +66,7 @@ %endif Name: rust -Version: 1.51.0 +Version: 1.55.0 Release: 1%{?dist} Summary: The Rust Programming Language License: (ASL 2.0 or MIT) and (BSD and MIT) @@ -72,9 +85,11 @@ Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.xz # https://github.com/rust-lang/rust/issues/80810#issuecomment-781784032 Patch1: 0001-Revert-Auto-merge-of-79547.patch -# Fix bootstrap for stage0 rust 1.51 -# https://github.com/rust-lang/rust/pull/81910 -Patch2: rustc-1.51.0-backport-pr81910.patch +# By default, rust tries to use "rust-lld" as a linker for WebAssembly. +Patch2: 0001-Use-lld-provided-by-system-for-wasm.patch + +# Backport support for LLVM 13, https://github.com/rust-lang/rust/pull/87570 +Patch3: rustc-1.55.0-llvm-13.patch ### RHEL-specific patches below ### @@ -83,7 +98,7 @@ Patch100: rustc-1.48.0-disable-libssh2.patch # libcurl on RHEL7 doesn't have http2, but since cargo requests it, curl-sys # will try to build it statically -- instead we turn off the feature. -Patch101: rustc-1.51.0-disable-http2.patch +Patch101: rustc-1.55.0-disable-http2.patch # kernel rh1410097 causes too-small stacks for PIE. # (affects RHEL6 kernels when building for RHEL7) @@ -169,15 +184,11 @@ BuildRequires: pkgconfig(libssh2) >= 1.6.0 BuildRequires: %{python} %if %with bundled_llvm -BuildRequires: cmake3 >= 3.4.3 -Provides: bundled(llvm) = 11.0.1 +BuildRequires: cmake3 >= 3.13.4 +Provides: bundled(llvm) = 12.0.1 %else BuildRequires: cmake >= 2.8.11 %if 0%{?epel} == 7 -%global llvm llvm9.0 -%endif -%if 0%{?fedora} >= 34 -# we're not ready for llvm-12 yet %global llvm llvm11 %endif %if %defined llvm @@ -186,7 +197,7 @@ BuildRequires: cmake >= 2.8.11 %global llvm llvm %global llvm_root %{_prefix} %endif -BuildRequires: %{llvm}-devel >= 9.0 +BuildRequires: %{llvm}-devel >= 10.0 %if %with llvm_static BuildRequires: %{llvm}-static BuildRequires: libffi-devel @@ -211,6 +222,14 @@ Requires: %{name}-std-static%{?_isa} = %{version}-%{release} # https://github.com/rust-lang/rust/issues/11937 Requires: /usr/bin/cc +%if 0%{?epel} == 7 +%global devtoolset_name devtoolset-9 +BuildRequires: %{devtoolset_name}-gcc +BuildRequires: %{devtoolset_name}-gcc-c++ +%global __cc /opt/rh/%{devtoolset_name}/root/usr/bin/gcc +%global __cxx /opt/rh/%{devtoolset_name}/root/usr/bin/g++ +%endif + # ALL Rust libraries are private, because they don't keep an ABI. %global _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.* %global __provides_exclude ^(%{_privatelibs})$ @@ -239,6 +258,19 @@ Requires: /usr/bin/cc %endif %endif +# We're going to override --libdir when configuring to get rustlib into a +# common path, but we'll fix the shared libraries during install. +%global common_libdir %{_prefix}/lib +%global rustlibdir %{common_libdir}/rustlib + +%if %defined cross_targets +# brp-strip-static-archive breaks the archive index for wasm +%global __os_install_post \ +%__os_install_post \ +find '%{buildroot}%{rustlibdir}' -type f -path '*/wasm*/lib/*.rlib' -print -exec '%{llvm_root}/bin/llvm-ranlib' '{}' ';' \ +%{nil} +%endif + %description Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. @@ -253,6 +285,33 @@ Summary: Standard library for Rust This package includes the standard libraries for building applications written in Rust. +%if %defined cross_targets +%{lua: do + for triple in string.gmatch(rpm.expand("%{cross_targets}"), "%S+") do + local requires = rpm.expand("Requires: rust = %{version}-%{release}") + if string.sub(triple, 1, 4) == "wasm" then + requires = requires .. "\nRequires: lld >= 8.0" + end + local subs = { + triple = triple, + requires = requires, + } + local s = string.gsub([[ +%package std-static-{{triple}} +Summary: Standard library for Rust +# FIX: we can't be noarch while excluding s390x for lack of lld +# BuildArch: noarch +{{requires}} + +%description std-static-{{triple}} +This package includes the standard libraries for building applications +written in Rust for the {{triple}} target. +]], "{{(%w+)}}", subs) + print(s) + end +end} +%endif + %package debugger-common Summary: Common debugger pretty printers for Rust @@ -411,6 +470,7 @@ test -f '%{local_rust_root}/bin/rustc' %patch1 -p1 %patch2 -p1 +%patch3 -p1 %if %with disabled_libssh2 %patch100 -p1 @@ -496,11 +556,6 @@ find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' %build export %{rust_env} -# We're going to override --libdir when configuring to get rustlib into a -# common path, but we'll fix the shared libraries during install. -%global common_libdir %{_prefix}/lib -%global rustlibdir %{common_libdir}/rustlib - %ifarch %{arm} %{ix86} s390x # full debuginfo is exhausting memory; just do libstd for now # https://github.com/rust-lang/rust/issues/45854 @@ -515,13 +570,6 @@ export %{rust_env} %define enable_debuginfo --debuginfo-level=2 %endif -# We want the best optimization for std, but it caused problems for rpm-ostree -# on ppc64le to have all of the compiler_builtins in a single object: -# https://bugzilla.redhat.com/show_bug.cgi?id=1713090 -%ifnarch %{power64} -%define codegen_units_std --set rust.codegen-units-std=1 -%endif - # Some builders have relatively little memory for their CPU count. # At least 2GB per CPU is a good rule of thumb for building rustc. ncpus=$(/usr/bin/getconf _NPROCESSORS_ONLN) @@ -533,6 +581,9 @@ fi %configure --disable-option-checking \ --libdir=%{common_libdir} \ --build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \ + --set target.%{rust_triple}.linker=%{__cc} \ + --set target.%{rust_triple}.cc=%{__cc} \ + --set target.%{rust_triple}.cxx=%{__cxx} \ --python=%{python} \ --local-rust-root=%{local_rust_root} \ %{!?with_bundled_llvm: --llvm-root=%{llvm_root} \ @@ -540,6 +591,7 @@ fi %{!?with_llvm_static: --enable-llvm-link-shared } } \ --disable-rpath \ %{enable_debuginfo} \ + --set rust.codegen-units-std=1 \ --enable-extended \ --tools=analysis,cargo,clippy,rls,rustfmt,src \ --enable-vendor \ @@ -551,12 +603,26 @@ fi %{python} ./x.py build -j "$ncpus" --stage 2 %{python} ./x.py doc --stage 2 +%if %defined cross_targets +for triple in %{cross_targets}; do + %{python} ./x.py build --stage 2 --target=$triple std +done +%endif %install export %{rust_env} DESTDIR=%{buildroot} %{python} ./x.py install +%if %defined cross_targets +for triple in %{cross_targets}; do + DESTDIR=%{buildroot} %{python} ./x.py install --target=$triple std +done +%endif + +# These are transient files used by x.py dist and install +rm -rf ./build/dist/ ./build/tmp/ + # Make sure the shared libraries are in the proper libdir %if "%{_libdir}" != "%{common_libdir}" mkdir -p %{buildroot}%{_libdir} @@ -627,9 +693,20 @@ rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll* %check export %{rust_env} +# Sanity-check the installed binaries, debuginfo-stripped and all. +%{buildroot}%{_bindir}/cargo new build/hello-world +env RUSTC=%{buildroot}%{_bindir}/rustc \ + LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" \ + %{buildroot}%{_bindir}/cargo run --manifest-path build/hello-world/Cargo.toml + # The results are not stable on koji, so mask errors and just log it. +# Some of the larger test artifacts are manually cleaned to save space. %{python} ./x.py test --no-fail-fast --stage 2 || : +rm -rf "./build/%{rust_triple}/test/" + %{python} ./x.py test --no-fail-fast --stage 2 cargo || : +rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/" + %{python} ./x.py test --no-fail-fast --stage 2 clippy || : %{python} ./x.py test --no-fail-fast --stage 2 rls || : %{python} ./x.py test --no-fail-fast --stage 2 rustfmt || : @@ -659,6 +736,26 @@ export %{rust_env} %{rustlibdir}/%{rust_triple}/lib/*.rlib +%if %defined cross_targets +%{lua: do + for triple in string.gmatch(rpm.expand("%{cross_targets}"), "%S+") do + local subs = { + triple = triple, + rustlibdir = rpm.expand("%{rustlibdir}"), + } + local s = string.gsub([[ +%files std-static-{{triple}} +%dir {{rustlibdir}} +%dir {{rustlibdir}}/{{triple}} +%dir {{rustlibdir}}/{{triple}}/lib +{{rustlibdir}}/{{triple}}/lib/*.rlib +]], "{{(%w+)}}", subs) + print(s) + end +end} +%endif + + %files debugger-common %dir %{rustlibdir} %dir %{rustlibdir}/etc @@ -689,6 +786,7 @@ export %{rust_env} %{_docdir}/%{name}/html/*.png %{_docdir}/%{name}/html/*.svg %{_docdir}/%{name}/html/*.woff +%{_docdir}/%{name}/html/*.woff2 %license %{_docdir}/%{name}/html/*.txt %license %{_docdir}/%{name}/html/*.md @@ -741,6 +839,30 @@ export %{rust_env} %changelog +* Fri Oct 29 2021 Josh Stone - 1.55.0-1 +- Update to 1.55.0. +- Backport support for LLVM 13. + +* Tue Aug 17 2021 Josh Stone - 1.54.0-2 +- Make std-static-wasm* arch-specific to avoid s390x. + +* Thu Jul 29 2021 Josh Stone - 1.54.0-1 +- Update to 1.54.0. + +* Tue Jul 20 2021 Josh Stone - 1.53.0-2 +- Use llvm-ranlib to fix wasm archives. + +* Mon Jun 21 2021 Josh Stone - 1.53.0-1 +- Update to 1.53.0. + +* Tue Jun 15 2021 Josh Stone - 1.52.1-2 +- Set rust.codegen-units-std=1 for all targets again. +- Add rust-std-static-wasm32-unknown-unknown. + +* Tue May 25 2021 Josh Stone - 1.52.1-1 +- Update to 1.52.1. Includes security fixes for CVE-2020-36323, + CVE-2021-28876, CVE-2021-28878, CVE-2021-28879, and CVE-2021-31162. + * Mon May 24 2021 Josh Stone - 1.51.0-1 - Update to 1.51.0. Update to 1.51.0. Includes security fixes for CVE-2021-28875 and CVE-2021-28877.