From bfce1300e551a0bccdc474a3d3dd956de36d28d2 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Mar 04 2022 20:44:00 +0000 Subject: import rust-1.57.0-1.module+el8.6.0+13694+e7e93647 --- diff --git a/.gitignore b/.gitignore index dffee1e..351d602 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -SOURCES/rustc-1.55.0-src.tar.xz +SOURCES/rustc-1.57.0-src.tar.xz +SOURCES/wasi-libc-ad5133410f66b93a2381db5b542aad5e0964db96.tar.gz diff --git a/.rust.metadata b/.rust.metadata index fae64fb..8d0c576 100644 --- a/.rust.metadata +++ b/.rust.metadata @@ -1 +1,2 @@ -3fd8c1e1d44f95621499d245d0be00c4945347fb SOURCES/rustc-1.55.0-src.tar.xz +f036a5589319edb5a741d396d40cc1a95291f426 SOURCES/rustc-1.57.0-src.tar.xz +b8865d1192852214d6d9b0a0957d4b36c16832aa SOURCES/wasi-libc-ad5133410f66b93a2381db5b542aad5e0964db96.tar.gz diff --git a/SOURCES/0001-Revert-Auto-merge-of-79547.patch b/SOURCES/0001-Revert-Auto-merge-of-79547.patch deleted file mode 100644 index b2e58a1..0000000 --- a/SOURCES/0001-Revert-Auto-merge-of-79547.patch +++ /dev/null @@ -1,102 +0,0 @@ -From eaf7ea1fc339e1ff348ed941ed2e8c4d66f3e458 Mon Sep 17 00:00:00 2001 -From: Josh Stone -Date: Thu, 18 Feb 2021 19:14:58 -0800 -Subject: [PATCH] Revert "Auto merge of #79547 - erikdesjardins:byval, - r=nagisa" - -This reverts commit a094ff9590b83c8f94d898f92c2964a5803ded06, reversing -changes made to d37afad0cc87bf709ad10c85319296ac53030f03. ---- - compiler/rustc_middle/src/ty/layout.rs | 12 ++++++------ - ...return-value-in-reg.rs => return-value-in-reg.rs} | 4 ++-- - src/test/codegen/union-abi.rs | 11 +++-------- - 3 files changed, 11 insertions(+), 16 deletions(-) - rename src/test/codegen/{arg-return-value-in-reg.rs => return-value-in-reg.rs} (74%) - -diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs -index b545b92c9252..545f6aee1a21 100644 ---- a/compiler/rustc_middle/src/ty/layout.rs -+++ b/compiler/rustc_middle/src/ty/layout.rs -@@ -2849,7 +2849,7 @@ fn adjust_for_abi(&mut self, cx: &C, abi: SpecAbi) { - || abi == SpecAbi::RustIntrinsic - || abi == SpecAbi::PlatformIntrinsic - { -- let fixup = |arg: &mut ArgAbi<'tcx, Ty<'tcx>>| { -+ let fixup = |arg: &mut ArgAbi<'tcx, Ty<'tcx>>, is_ret: bool| { - if arg.is_ignore() { - return; - } -@@ -2887,9 +2887,9 @@ fn adjust_for_abi(&mut self, cx: &C, abi: SpecAbi) { - _ => return, - } - -- // Pass and return structures up to 2 pointers in size by value, matching `ScalarPair`. -- // LLVM will usually pass these in 2 registers, which is more efficient than by-ref. -- let max_by_val_size = Pointer.size(cx) * 2; -+ // Return structures up to 2 pointers in size by value, matching `ScalarPair`. LLVM -+ // will usually return these in 2 registers, which is more efficient than by-ref. -+ let max_by_val_size = if is_ret { Pointer.size(cx) * 2 } else { Pointer.size(cx) }; - let size = arg.layout.size; - - if arg.layout.is_unsized() || size > max_by_val_size { -@@ -2901,9 +2901,9 @@ fn adjust_for_abi(&mut self, cx: &C, abi: SpecAbi) { - arg.cast_to(Reg { kind: RegKind::Integer, size }); - } - }; -- fixup(&mut self.ret); -+ fixup(&mut self.ret, true); - for arg in &mut self.args { -- fixup(arg); -+ fixup(arg, false); - } - return; - } -diff --git a/src/test/codegen/arg-return-value-in-reg.rs b/src/test/codegen/return-value-in-reg.rs -similarity index 74% -rename from src/test/codegen/arg-return-value-in-reg.rs -rename to src/test/codegen/return-value-in-reg.rs -index a69291d47821..4bc0136c5e32 100644 ---- a/src/test/codegen/arg-return-value-in-reg.rs -+++ b/src/test/codegen/return-value-in-reg.rs -@@ -1,4 +1,4 @@ --//! Check that types of up to 128 bits are passed and returned by-value instead of via pointer. -+//! This test checks that types of up to 128 bits are returned by-value instead of via out-pointer. - - // compile-flags: -C no-prepopulate-passes -O - // only-x86_64 -@@ -11,7 +11,7 @@ pub struct S { - c: u32, - } - --// CHECK: define i128 @modify(i128{{( %0)?}}) -+// CHECK: define i128 @modify(%S* noalias nocapture dereferenceable(16) %s) - #[no_mangle] - pub fn modify(s: S) -> S { - S { a: s.a + s.a, b: s.b + s.b, c: s.c + s.c } -diff --git a/src/test/codegen/union-abi.rs b/src/test/codegen/union-abi.rs -index f282fd237054..afea01e9a2d0 100644 ---- a/src/test/codegen/union-abi.rs -+++ b/src/test/codegen/union-abi.rs -@@ -63,16 +63,11 @@ pub union UnionU128{a:u128} - #[no_mangle] - pub fn test_UnionU128(_: UnionU128) -> UnionU128 { loop {} } - --pub union UnionU128x2{a:(u128, u128)} --// CHECK: define void @test_UnionU128x2(i128 %_1.0, i128 %_1.1) --#[no_mangle] --pub fn test_UnionU128x2(_: UnionU128x2) { loop {} } -- - #[repr(C)] --pub union CUnionU128x2{a:(u128, u128)} --// CHECK: define void @test_CUnionU128x2(%CUnionU128x2* {{.*}} %_1) -+pub union CUnionU128{a:u128} -+// CHECK: define void @test_CUnionU128(%CUnionU128* {{.*}} %_1) - #[no_mangle] --pub fn test_CUnionU128x2(_: CUnionU128x2) { loop {} } -+pub fn test_CUnionU128(_: CUnionU128) { loop {} } - - pub union UnionBool { b:bool } - // CHECK: define zeroext i1 @test_UnionBool(i8 %b) --- -2.29.2 - diff --git a/SOURCES/rust-pr91070.patch b/SOURCES/rust-pr91070.patch new file mode 100644 index 0000000..1b4f052 --- /dev/null +++ b/SOURCES/rust-pr91070.patch @@ -0,0 +1,94 @@ +diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +index e77d29bed712..f3d8eb2602a3 100644 +--- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp ++++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +@@ -124,8 +124,18 @@ extern "C" LLVMValueRef LLVMRustGetOrInsertFunction(LLVMModuleRef M, + + extern "C" LLVMValueRef + LLVMRustGetOrInsertGlobal(LLVMModuleRef M, const char *Name, size_t NameLen, LLVMTypeRef Ty) { ++ Module *Mod = unwrap(M); + StringRef NameRef(Name, NameLen); +- return wrap(unwrap(M)->getOrInsertGlobal(NameRef, unwrap(Ty))); ++ ++ // We don't use Module::getOrInsertGlobal because that returns a Constant*, ++ // which may either be the real GlobalVariable*, or a constant bitcast of it ++ // if our type doesn't match the original declaration. We always want the ++ // GlobalVariable* so we can access linkage, visibility, etc. ++ GlobalVariable *GV = Mod->getGlobalVariable(NameRef, true); ++ if (!GV) ++ GV = new GlobalVariable(*Mod, unwrap(Ty), false, ++ GlobalValue::ExternalLinkage, nullptr, NameRef); ++ return wrap(GV); + } + + extern "C" LLVMValueRef +diff --git a/src/test/ui/statics/issue-91050-1.rs b/src/test/ui/statics/issue-91050-1.rs +new file mode 100644 +index 000000000000..403a41462ef1 +--- /dev/null ++++ b/src/test/ui/statics/issue-91050-1.rs +@@ -0,0 +1,34 @@ ++// build-pass ++// compile-flags: --crate-type=rlib --emit=llvm-ir -Cno-prepopulate-passes ++ ++// This test declares globals by the same name with different types, which ++// caused problems because Module::getOrInsertGlobal would return a Constant* ++// bitcast instead of a GlobalVariable* that could access linkage/visibility. ++// In alt builds with LLVM assertions this would fail: ++// ++// rustc: /checkout/src/llvm-project/llvm/include/llvm/Support/Casting.h:269: ++// typename cast_retty::ret_type llvm::cast(Y *) [X = llvm::GlobalValue, Y = llvm::Value]: ++// Assertion `isa(Val) && "cast() argument of incompatible type!"' failed. ++// ++// In regular builds, the bad cast was UB, like "Invalid LLVMRustVisibility value!" ++ ++pub mod before { ++ #[no_mangle] ++ pub static GLOBAL1: [u8; 1] = [1]; ++} ++ ++pub mod inner { ++ extern "C" { ++ pub static GLOBAL1: u8; ++ pub static GLOBAL2: u8; ++ } ++ ++ pub fn call() { ++ drop(unsafe { (GLOBAL1, GLOBAL2) }); ++ } ++} ++ ++pub mod after { ++ #[no_mangle] ++ pub static GLOBAL2: [u8; 1] = [2]; ++} +diff --git a/src/test/ui/statics/issue-91050-2.rs b/src/test/ui/statics/issue-91050-2.rs +new file mode 100644 +index 000000000000..2ff954d15cab +--- /dev/null ++++ b/src/test/ui/statics/issue-91050-2.rs +@@ -0,0 +1,24 @@ ++// build-pass ++// compile-flags: --crate-type=rlib --emit=llvm-ir -Cno-prepopulate-passes ++ ++// This is a variant of issue-91050-1.rs -- see there for an explanation. ++ ++pub mod before { ++ extern "C" { ++ pub static GLOBAL1: [u8; 1]; ++ } ++ ++ pub unsafe fn do_something_with_array() -> u8 { ++ GLOBAL1[0] ++ } ++} ++ ++pub mod inner { ++ extern "C" { ++ pub static GLOBAL1: u8; ++ } ++ ++ pub unsafe fn call() -> u8 { ++ GLOBAL1 + 42 ++ } ++} diff --git a/SOURCES/rustc-1.48.0-disable-libssh2.patch b/SOURCES/rustc-1.48.0-disable-libssh2.patch deleted file mode 100644 index 6916e74..0000000 --- a/SOURCES/rustc-1.48.0-disable-libssh2.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- rustc-1.48.0-src/Cargo.lock.orig 2020-11-16 06:01:53.000000000 -0800 -+++ rustc-1.48.0-src/Cargo.lock 2020-11-16 09:27:44.425104404 -0800 -@@ -1676,7 +1676,6 @@ - dependencies = [ - "cc", - "libc", -- "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -@@ -1693,20 +1692,6 @@ - ] - - [[package]] --name = "libssh2-sys" --version = "0.2.19" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "ca46220853ba1c512fc82826d0834d87b06bcd3c2a42241b7de72f3d2fe17056" --dependencies = [ -- "cc", -- "libc", -- "libz-sys", -- "openssl-sys", -- "pkg-config", -- "vcpkg", --] -- --[[package]] - name = "libz-sys" - version = "1.1.2" - source = "registry+https://github.com/rust-lang/crates.io-index" ---- rustc-1.48.0-src/vendor/git2/Cargo.toml.orig 2020-11-16 06:27:49.000000000 -0800 -+++ rustc-1.48.0-src/vendor/git2/Cargo.toml 2020-11-16 09:27:44.425104404 -0800 -@@ -49,7 +49,7 @@ - version = "0.1.39" - - [features] --default = ["ssh", "https", "ssh_key_from_memory"] -+default = ["https"] - https = ["libgit2-sys/https", "openssl-sys", "openssl-probe"] - ssh = ["libgit2-sys/ssh"] - ssh_key_from_memory = ["libgit2-sys/ssh_key_from_memory"] diff --git a/SOURCES/rustc-1.51.0-no-default-pie.patch b/SOURCES/rustc-1.51.0-no-default-pie.patch deleted file mode 100644 index d24cc75..0000000 --- a/SOURCES/rustc-1.51.0-no-default-pie.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- rustc-beta-src/compiler/rustc_codegen_ssa/src/back/link.rs.orig 2021-03-09 10:40:09.755485845 -0800 -+++ rustc-beta-src/compiler/rustc_codegen_ssa/src/back/link.rs 2021-03-09 10:44:51.257426181 -0800 -@@ -1279,11 +1279,13 @@ - } - - fn link_output_kind(sess: &Session, crate_type: CrateType) -> LinkOutputKind { -- let kind = match (crate_type, sess.crt_static(Some(crate_type)), sess.relocation_model()) { -+ // Only use PIE if explicity specified. -+ let explicit_pic = matches!(sess.opts.cg.relocation_model, Some(RelocModel::Pic)); -+ let kind = match (crate_type, sess.crt_static(Some(crate_type)), explicit_pic) { - (CrateType::Executable, _, _) if sess.is_wasi_reactor() => LinkOutputKind::WasiReactorExe, -- (CrateType::Executable, false, RelocModel::Pic) => LinkOutputKind::DynamicPicExe, -+ (CrateType::Executable, false, true) => LinkOutputKind::DynamicPicExe, - (CrateType::Executable, false, _) => LinkOutputKind::DynamicNoPicExe, -- (CrateType::Executable, true, RelocModel::Pic) => LinkOutputKind::StaticPicExe, -+ (CrateType::Executable, true, true) => LinkOutputKind::StaticPicExe, - (CrateType::Executable, true, _) => LinkOutputKind::StaticNoPicExe, - (_, true, _) => LinkOutputKind::StaticDylib, - (_, false, _) => LinkOutputKind::DynamicDylib, diff --git a/SOURCES/rustc-1.55.0-disable-http2.patch b/SOURCES/rustc-1.55.0-disable-http2.patch deleted file mode 100644 index 33c6fee..0000000 --- a/SOURCES/rustc-1.55.0-disable-http2.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- 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", -- "libnghttp2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -@@ -1907,16 +1906,6 @@ - checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - - [[package]] --name = "libnghttp2-sys" --version = "0.1.4+1.41.0" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "03624ec6df166e79e139a2310ca213283d6b3c30810c54844f307086d4488df1" --dependencies = [ -- "cc", -- "libc", --] -- --[[package]] - name = "libz-sys" - version = "1.1.2" - source = "registry+https://github.com/rust-lang/crates.io-index" ---- 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" --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-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. -- let mut multi = Multi::new(); -- let multiplexing = config.http_config()?.multiplexing.unwrap_or(true); -- multi -- .pipelining(false, multiplexing) -- .with_context(|| "failed to enable multiplexing/pipelining in curl")?; -- -- // let's not flood crates.io with connections -- multi.set_max_host_connections(2)?; -+ let multi = Multi::new(); -+ let multiplexing = false; - - Ok(PackageSet { - packages: package_ids -@@ -597,7 +591,7 @@ - macro_rules! try_old_curl { - ($e:expr, $msg:expr) => { - let result = $e; -- if cfg!(target_os = "macos") { -+ if cfg!(any(target_os = "linux", target_os = "macos")) { - if let Err(e) = result { - warn!("ignoring libcurl {} error: {}", $msg, e); - } diff --git a/SOURCES/rustc-1.55.0-llvm-13.patch b/SOURCES/rustc-1.55.0-llvm-13.patch deleted file mode 100644 index 21cecbd..0000000 --- a/SOURCES/rustc-1.55.0-llvm-13.patch +++ /dev/null @@ -1,898 +0,0 @@ -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/SOURCES/rustc-1.56.0-disable-libssh2.patch b/SOURCES/rustc-1.56.0-disable-libssh2.patch new file mode 100644 index 0000000..4d9331b --- /dev/null +++ b/SOURCES/rustc-1.56.0-disable-libssh2.patch @@ -0,0 +1,42 @@ +--- rustc-1.56.0-src/Cargo.lock.orig 2021-10-18 02:52:36.000000000 -0700 ++++ rustc-1.56.0-src/Cargo.lock 2021-10-19 18:00:47.999793566 -0700 +@@ -1895,7 +1895,6 @@ + dependencies = [ + "cc", + "libc", +- "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +@@ -1918,20 +1917,6 @@ + ] + + [[package]] +-name = "libssh2-sys" +-version = "0.2.19" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "ca46220853ba1c512fc82826d0834d87b06bcd3c2a42241b7de72f3d2fe17056" +-dependencies = [ +- "cc", +- "libc", +- "libz-sys", +- "openssl-sys", +- "pkg-config", +- "vcpkg", +-] +- +-[[package]] + name = "libz-sys" + version = "1.1.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +--- rustc-1.56.0-src/vendor/git2/Cargo.toml.orig 2021-10-18 04:05:54.000000000 -0700 ++++ rustc-1.56.0-src/vendor/git2/Cargo.toml 2021-10-19 17:57:37.960500359 -0700 +@@ -52,7 +52,7 @@ + version = "0.1.39" + + [features] +-default = ["ssh", "https", "ssh_key_from_memory"] ++default = ["https"] + https = ["libgit2-sys/https", "openssl-sys", "openssl-probe"] + ssh = ["libgit2-sys/ssh"] + ssh_key_from_memory = ["libgit2-sys/ssh_key_from_memory"] diff --git a/SOURCES/rustc-1.57.0-disable-http2.patch b/SOURCES/rustc-1.57.0-disable-http2.patch new file mode 100644 index 0000000..6723dc6 --- /dev/null +++ b/SOURCES/rustc-1.57.0-disable-http2.patch @@ -0,0 +1,66 @@ +--- rustc-beta-src/Cargo.lock.orig 2021-11-29 10:37:40.665228216 -0800 ++++ rustc-beta-src/Cargo.lock 2021-11-29 10:37:40.667228175 -0800 +@@ -889,7 +889,6 @@ + dependencies = [ + "cc", + "libc", +- "libnghttp2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +@@ -1907,16 +1906,6 @@ + checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" + + [[package]] +-name = "libnghttp2-sys" +-version = "0.1.4+1.41.0" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "03624ec6df166e79e139a2310ca213283d6b3c30810c54844f307086d4488df1" +-dependencies = [ +- "cc", +- "libc", +-] +- +-[[package]] + name = "libz-sys" + version = "1.1.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +--- rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2021-11-29 10:37:40.667228175 -0800 ++++ rustc-beta-src/src/tools/cargo/Cargo.toml 2021-11-29 10:38:41.291987733 -0800 +@@ -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" +-curl = { version = "0.4.39", features = ["http2"] } ++curl = { version = "0.4.39", features = [] } + curl-sys = "0.4.49" + 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-11-27 09:38:17.000000000 -0800 ++++ rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs 2021-11-29 10:37:40.667228175 -0800 +@@ -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. +- let mut multi = Multi::new(); +- let multiplexing = config.http_config()?.multiplexing.unwrap_or(true); +- multi +- .pipelining(false, multiplexing) +- .with_context(|| "failed to enable multiplexing/pipelining in curl")?; +- +- // let's not flood crates.io with connections +- multi.set_max_host_connections(2)?; ++ let multi = Multi::new(); ++ let multiplexing = false; + + Ok(PackageSet { + packages: package_ids +@@ -653,7 +647,7 @@ + macro_rules! try_old_curl { + ($e:expr, $msg:expr) => { + let result = $e; +- if cfg!(target_os = "macos") { ++ if cfg!(any(target_os = "linux", target_os = "macos")) { + if let Err(e) = result { + warn!("ignoring libcurl {} error: {}", $msg, e); + } diff --git a/SOURCES/rustc-1.57.0-no-default-pie.patch b/SOURCES/rustc-1.57.0-no-default-pie.patch new file mode 100644 index 0000000..c9c8693 --- /dev/null +++ b/SOURCES/rustc-1.57.0-no-default-pie.patch @@ -0,0 +1,24 @@ +--- rustc-beta-src/compiler/rustc_codegen_ssa/src/back/link.rs.orig 2021-11-29 10:41:02.380100917 -0800 ++++ rustc-beta-src/compiler/rustc_codegen_ssa/src/back/link.rs 2021-11-29 10:53:31.014783112 -0800 +@@ -1485,15 +1485,14 @@ + } + + fn link_output_kind(sess: &Session, crate_type: CrateType) -> LinkOutputKind { +- let kind = match (crate_type, sess.crt_static(Some(crate_type)), sess.relocation_model()) { ++ // Only use PIE if explicity specified. ++ let explicit_pic = ++ matches!(sess.opts.cg.relocation_model, Some(RelocModel::Pic | RelocModel::Pie)); ++ let kind = match (crate_type, sess.crt_static(Some(crate_type)), explicit_pic) { + (CrateType::Executable, _, _) if sess.is_wasi_reactor() => LinkOutputKind::WasiReactorExe, +- (CrateType::Executable, false, RelocModel::Pic | RelocModel::Pie) => { +- LinkOutputKind::DynamicPicExe +- } ++ (CrateType::Executable, false, true) => LinkOutputKind::DynamicPicExe, + (CrateType::Executable, false, _) => LinkOutputKind::DynamicNoPicExe, +- (CrateType::Executable, true, RelocModel::Pic | RelocModel::Pie) => { +- LinkOutputKind::StaticPicExe +- } ++ (CrateType::Executable, true, true) => LinkOutputKind::StaticPicExe, + (CrateType::Executable, true, _) => LinkOutputKind::StaticNoPicExe, + (_, true, _) => LinkOutputKind::StaticDylib, + (_, false, _) => LinkOutputKind::DynamicDylib, diff --git a/SPECS/rust.spec b/SPECS/rust.spec index a17053d..669b652 100644 --- a/SPECS/rust.spec +++ b/SPECS/rust.spec @@ -1,6 +1,5 @@ # Only x86_64 and i686 are Tier 1 platforms at this time. # https://doc.rust-lang.org/nightly/rustc/platform-support.html -#global rust_arches x86_64 i686 armv7hl aarch64 ppc64 ppc64le s390x %global rust_arches x86_64 i686 aarch64 ppc64le s390x # The channel can be stable, beta, or nightly @@ -10,10 +9,10 @@ # 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.54.0 -%global bootstrap_cargo 1.54.0 -%global bootstrap_channel 1.54.0 -%global bootstrap_date 2021-07-29 +%global bootstrap_rust 1.56.1 +%global bootstrap_cargo 1.56.1 +%global bootstrap_channel 1.56.1 +%global bootstrap_date 2021-11-01 # Only the specified arches will use bootstrap binaries. #global bootstrap_arches %%{rust_arches} @@ -27,10 +26,18 @@ # arch-specific package only for the supported arches. %ifnarch s390x %if 0%{?fedora} || 0%{?rhel} >= 8 -%global cross_targets wasm32-unknown-unknown +%global cross_targets wasm32-unknown-unknown wasm32-wasi %endif %endif +# We need CRT files for *-wasi targets, at least as new as the commit in +# src/ci/docker/host-x86_64/dist-various-2/build-wasi-toolchain.sh +%global wasi_libc_url https://github.com/WebAssembly/wasi-libc +%global wasi_libc_commit ad5133410f66b93a2381db5b542aad5e0964db96 +%global wasi_libc_name wasi-libc-%{wasi_libc_commit} +%global wasi_libc_source %{wasi_libc_url}/archive/%{wasi_libc_commit}/%{wasi_libc_name}.tar.gz +%global wasi_libc_dir %{_builddir}/%{wasi_libc_name} + # Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases. %bcond_with llvm_static @@ -38,8 +45,8 @@ # is insufficient. Rust currently requires LLVM 10.0+. %bcond_with bundled_llvm -# Requires stable libgit2 1.1 -%if 0%{?fedora} >= 34 +# Requires stable libgit2 1.3 +%if 0%{?fedora} >= 36 %bcond_with bundled_libgit2 %else %bcond_without bundled_libgit2 @@ -66,7 +73,7 @@ %endif Name: rust -Version: 1.55.0 +Version: 1.57.0 Release: 1%{?dist} Summary: The Rust Programming Language License: (ASL 2.0 or MIT) and (BSD and MIT) @@ -80,30 +87,28 @@ ExclusiveArch: %{rust_arches} %global rustc_package rustc-%{channel}-src %endif Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.xz +Source1: %{wasi_libc_source} +# Sources for bootstrap_arches are inserted by lua below -# This internal rust-abi change broke s390x -- revert for now. -# https://github.com/rust-lang/rust/issues/80810#issuecomment-781784032 -Patch1: 0001-Revert-Auto-merge-of-79547.patch +# Fix a bad typecast for LLVM globals, rhbz#1990657 +# https://github.com/rust-lang/rust/pull/91070 +Patch1: rust-pr91070.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 ### # Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949) -Patch100: rustc-1.48.0-disable-libssh2.patch +Patch100: rustc-1.56.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.55.0-disable-http2.patch +Patch101: rustc-1.57.0-disable-http2.patch # kernel rh1410097 causes too-small stacks for PIE. # (affects RHEL6 kernels when building for RHEL7) -Patch102: rustc-1.51.0-no-default-pie.patch - +Patch102: rustc-1.57.0-no-default-pie.patch # Get the Rust triple for any arch. %{lua: function rust_triple(arch) @@ -135,6 +140,7 @@ end} .."/rust-%{bootstrap_channel}") local target_arch = rpm.expand("%{_target_cpu}") for i, arch in ipairs(bootstrap_arches) do + i = 100 + i print(string.format("Source%d: %s-%s.tar.xz\n", i, base, rust_triple(arch))) if arch == target_arch then @@ -171,8 +177,8 @@ BuildRequires: pkgconfig(liblzma) BuildRequires: pkgconfig(openssl) BuildRequires: pkgconfig(zlib) -%if %without bundled_libgit2 -BuildRequires: pkgconfig(libgit2) >= 1.1.0 +%if %{without bundled_libgit2} +BuildRequires: pkgconfig(libgit2) >= 1.3.0 %endif %if %{without disabled_libssh2} @@ -185,7 +191,8 @@ BuildRequires: %{python} %if %with bundled_llvm BuildRequires: cmake3 >= 3.13.4 -Provides: bundled(llvm) = 12.0.1 +BuildRequires: ninja-build +Provides: bundled(llvm) = 13.0.0 %else BuildRequires: cmake >= 2.8.11 %if 0%{?epel} == 7 @@ -264,6 +271,7 @@ BuildRequires: %{devtoolset_name}-gcc-c++ %global rustlibdir %{common_libdir}/rustlib %if %defined cross_targets +BuildRequires: clang # brp-strip-static-archive breaks the archive index for wasm %global __os_install_post \ %__os_install_post \ @@ -288,24 +296,30 @@ 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, + verrel = rpm.expand("%{version}-%{release}"), + wasm = string.sub(triple, 1, 4) == "wasm" and 1 or 0, + wasi = string.find(triple, "-wasi") and 1 or 0, } 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}} +Requires: rust = {{verrel}} +%if {{wasm}} +Requires: lld >= 8.0 +%endif +%if {{wasi}} +Provides: bundled(wasi-libc) +%endif %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 @@ -363,7 +377,7 @@ its standard library. %package -n cargo Summary: Rust's package manager and build tool %if %with bundled_libgit2 -Provides: bundled(libgit2) = 1.1.0 +Provides: bundled(libgit2) = 1.3.0 %endif # For tests: BuildRequires: git @@ -406,7 +420,7 @@ A tool for formatting Rust code according to style guidelines. %package -n rls Summary: Rust Language Server for IDE integration %if %with bundled_libgit2 -Provides: bundled(libgit2) = 1.1.0 +Provides: bundled(libgit2) = 1.3.0 %endif Requires: rust-analysis # /usr/bin/rls is dynamically linked against internal rustc libs @@ -466,11 +480,14 @@ test -f '%{local_rust_root}/bin/cargo' test -f '%{local_rust_root}/bin/rustc' %endif +%if %defined cross_targets +%setup -q -n %{wasi_libc_name} -T -b 1 +%endif + %setup -q -n %{rustc_package} %patch1 -p1 %patch2 -p1 -%patch3 -p1 %if %with disabled_libssh2 %patch100 -p1 @@ -543,10 +560,6 @@ find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' %if 0%{?cmake_path:1} %global rust_env %{rust_env} PATH="%{cmake_path}:$PATH" %endif -%if %without bundled_libgit2 -# convince libgit2-sys to use the distro libgit2 -%global rust_env %{rust_env} LIBGIT2_SYS_USE_PKG_CONFIG=1 -%endif %if %without disabled_libssh2 # convince libssh2-sys to use the distro libssh2 %global rust_env %{rust_env} LIBSSH2_SYS_USE_PKG_CONFIG=1 @@ -578,6 +591,22 @@ if [ "$max_cpus" -ge 1 -a "$max_cpus" -lt "$ncpus" ]; then ncpus="$max_cpus" fi +%if %defined cross_targets +%make_build -C %{wasi_libc_dir} +%{lua: do + local wasi_root = rpm.expand("%{wasi_libc_dir}") .. "/sysroot" + local set_wasi_root = "" + for triple in string.gmatch(rpm.expand("%{cross_targets}"), "%S+") do + if string.find(triple, "-wasi") then + set_wasi_root = set_wasi_root .. " --set target." .. triple .. ".wasi-root=" .. wasi_root + end + end + if wasi_root ~= "" then + rpm.define("set_wasi_root "..set_wasi_root) + end +end} +%endif + %configure --disable-option-checking \ --libdir=%{common_libdir} \ --build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \ @@ -596,7 +625,8 @@ fi --tools=analysis,cargo,clippy,rls,rustfmt,src \ --enable-vendor \ --enable-verbose-tests \ - %{?codegen_units_std} \ + %{?set_wasi_root} \ + --dist-compression-formats=gz \ --release-channel=%{channel} \ --release-description="%{?fedora:Fedora }%{?rhel:Red Hat }%{version}-%{release}" @@ -708,7 +738,10 @@ rm -rf "./build/%{rust_triple}/test/" rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/" %{python} ./x.py test --no-fail-fast --stage 2 clippy || : + +env RLS_TEST_WAIT_FOR_AGES=1 \ %{python} ./x.py test --no-fail-fast --stage 2 rls || : + %{python} ./x.py test --no-fail-fast --stage 2 rustfmt || : @@ -742,13 +775,20 @@ rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/" local subs = { triple = triple, rustlibdir = rpm.expand("%{rustlibdir}"), + wasi = string.find(triple, "-wasi") and 1 or 0, } local s = string.gsub([[ + %files std-static-{{triple}} %dir {{rustlibdir}} %dir {{rustlibdir}}/{{triple}} %dir {{rustlibdir}}/{{triple}}/lib {{rustlibdir}}/{{triple}}/lib/*.rlib +%if {{wasi}} +%dir {{rustlibdir}}/{{triple}}/lib/self-contained +{{rustlibdir}}/{{triple}}/lib/self-contained/crt*.o +%endif + ]], "{{(%w+)}}", subs) print(s) end @@ -839,6 +879,16 @@ end} %changelog +* Wed Dec 15 2021 Josh Stone - 1.57.0-1 +- Update to 1.57.0. + +* Thu Dec 02 2021 Josh Stone - 1.56.1-2 +- Add rust-std-static-wasm32-wasi + Resolves: rhbz#1980080 + +* Tue Nov 02 2021 Josh Stone - 1.56.0-1 +- Update to 1.56.1. + * Fri Oct 29 2021 Josh Stone - 1.55.0-1 - Update to 1.55.0. - Backport support for LLVM 13.