Rollup merge of #100460 - cuviper:drop-llvm-12, r=nagisa

Update the minimum external LLVM to 13

With this change, we'll have stable support for LLVM 13 through 15 (pending release).
For reference, the previous increase to LLVM 12 was #90175.

r? `@nagisa`
This commit is contained in:
Matthias Krüger 2022-08-16 06:05:57 +02:00 committed by GitHub
commit 0b19a185db
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 46 additions and 289 deletions

View file

@ -43,7 +43,7 @@ jobs:
- name: mingw-check - name: mingw-check
os: ubuntu-20.04-xl os: ubuntu-20.04-xl
env: {} env: {}
- name: x86_64-gnu-llvm-12 - name: x86_64-gnu-llvm-13
os: ubuntu-20.04-xl os: ubuntu-20.04-xl
env: {} env: {}
- name: x86_64-gnu-tools - name: x86_64-gnu-tools
@ -274,11 +274,11 @@ jobs:
- name: x86_64-gnu-distcheck - name: x86_64-gnu-distcheck
os: ubuntu-20.04-xl os: ubuntu-20.04-xl
env: {} env: {}
- name: x86_64-gnu-llvm-12 - name: x86_64-gnu-llvm-13
env: env:
RUST_BACKTRACE: 1 RUST_BACKTRACE: 1
os: ubuntu-20.04-xl os: ubuntu-20.04-xl
- name: x86_64-gnu-llvm-12-stage1 - name: x86_64-gnu-llvm-13-stage1
env: env:
RUST_BACKTRACE: 1 RUST_BACKTRACE: 1
os: ubuntu-20.04-xl os: ubuntu-20.04-xl

View file

@ -3,7 +3,6 @@ use crate::builder::Builder;
use crate::common::Funclet; use crate::common::Funclet;
use crate::context::CodegenCx; use crate::context::CodegenCx;
use crate::llvm; use crate::llvm;
use crate::llvm_util;
use crate::type_::Type; use crate::type_::Type;
use crate::type_of::LayoutLlvmExt; use crate::type_of::LayoutLlvmExt;
use crate::value::Value; use crate::value::Value;
@ -419,13 +418,6 @@ pub(crate) fn inline_asm_call<'ll>(
let constraints_ok = llvm::LLVMRustInlineAsmVerify(fty, cons.as_ptr().cast(), cons.len()); let constraints_ok = llvm::LLVMRustInlineAsmVerify(fty, cons.as_ptr().cast(), cons.len());
debug!("constraint verification result: {:?}", constraints_ok); debug!("constraint verification result: {:?}", constraints_ok);
if constraints_ok { if constraints_ok {
if unwind && llvm_util::get_version() < (13, 0, 0) {
bx.cx.sess().span_fatal(
line_spans[0],
"unwinding from inline assembly is only supported on llvm >= 13.",
);
}
let v = llvm::LLVMRustInlineAsm( let v = llvm::LLVMRustInlineAsm(
fty, fty,
asm.as_ptr().cast(), asm.as_ptr().cast(),

View file

@ -5,7 +5,7 @@ use crate::back::profiling::{
use crate::base; use crate::base;
use crate::common; use crate::common;
use crate::consts; use crate::consts;
use crate::llvm::{self, DiagnosticInfo, PassManager, SMDiagnostic}; use crate::llvm::{self, DiagnosticInfo, PassManager};
use crate::llvm_util; use crate::llvm_util;
use crate::type_::Type; use crate::type_::Type;
use crate::LlvmCodegenBackend; use crate::LlvmCodegenBackend;
@ -304,7 +304,6 @@ impl<'a> DiagnosticHandlers<'a> {
remark_passes.as_ptr(), remark_passes.as_ptr(),
remark_passes.len(), remark_passes.len(),
); );
llvm::LLVMRustSetInlineAsmDiagnosticHandler(llcx, inline_asm_handler, data.cast());
DiagnosticHandlers { data, llcx, old_handler } DiagnosticHandlers { data, llcx, old_handler }
} }
} }
@ -312,9 +311,7 @@ impl<'a> DiagnosticHandlers<'a> {
impl<'a> Drop for DiagnosticHandlers<'a> { impl<'a> Drop for DiagnosticHandlers<'a> {
fn drop(&mut self) { fn drop(&mut self) {
use std::ptr::null_mut;
unsafe { unsafe {
llvm::LLVMRustSetInlineAsmDiagnosticHandler(self.llcx, inline_asm_handler, null_mut());
llvm::LLVMRustContextSetDiagnosticHandler(self.llcx, self.old_handler); llvm::LLVMRustContextSetDiagnosticHandler(self.llcx, self.old_handler);
drop(Box::from_raw(self.data)); drop(Box::from_raw(self.data));
} }
@ -342,16 +339,6 @@ fn report_inline_asm(
cgcx.diag_emitter.inline_asm_error(cookie as u32, msg, level, source); cgcx.diag_emitter.inline_asm_error(cookie as u32, msg, level, source);
} }
unsafe extern "C" fn inline_asm_handler(diag: &SMDiagnostic, user: *const c_void, cookie: c_uint) {
if user.is_null() {
return;
}
let (cgcx, _) = *(user as *const (&CodegenContext<LlvmCodegenBackend>, &Handler));
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) { unsafe extern "C" fn diagnostic_handler(info: &DiagnosticInfo, user: *mut c_void) {
if user.is_null() { if user.is_null() {
return; return;

View file

@ -3,7 +3,6 @@ use crate::common::Funclet;
use crate::context::CodegenCx; use crate::context::CodegenCx;
use crate::llvm::{self, BasicBlock, False}; use crate::llvm::{self, BasicBlock, False};
use crate::llvm::{AtomicOrdering, AtomicRmwBinOp, SynchronizationScope}; use crate::llvm::{AtomicOrdering, AtomicRmwBinOp, SynchronizationScope};
use crate::llvm_util;
use crate::type_::Type; use crate::type_::Type;
use crate::type_of::LayoutLlvmExt; use crate::type_of::LayoutLlvmExt;
use crate::value::Value; use crate::value::Value;
@ -1038,25 +1037,11 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
dst: &'ll Value, dst: &'ll Value,
cmp: &'ll Value, cmp: &'ll Value,
src: &'ll Value, src: &'ll Value,
mut order: rustc_codegen_ssa::common::AtomicOrdering, order: rustc_codegen_ssa::common::AtomicOrdering,
failure_order: rustc_codegen_ssa::common::AtomicOrdering, failure_order: rustc_codegen_ssa::common::AtomicOrdering,
weak: bool, weak: bool,
) -> &'ll Value { ) -> &'ll Value {
let weak = if weak { llvm::True } else { llvm::False }; let weak = if weak { llvm::True } else { llvm::False };
if llvm_util::get_version() < (13, 0, 0) {
use rustc_codegen_ssa::common::AtomicOrdering::*;
// Older llvm has the pre-C++17 restriction on
// success and failure memory ordering,
// requiring the former to be at least as strong as the latter.
// So, for llvm 12, we upgrade the success ordering to a stronger
// one if necessary.
match (order, failure_order) {
(Relaxed, Acquire) => order = Acquire,
(Release, Acquire) => order = AcquireRelease,
(_, SequentiallyConsistent) => order = SequentiallyConsistent,
_ => {}
}
}
unsafe { unsafe {
llvm::LLVMRustBuildAtomicCmpXchg( llvm::LLVMRustBuildAtomicCmpXchg(
self.llbuilder, self.llbuilder,
@ -1444,51 +1429,37 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
} }
} }
fn fptoint_sat_broken_in_llvm(&self) -> bool {
match self.tcx.sess.target.arch.as_ref() {
// FIXME - https://bugs.llvm.org/show_bug.cgi?id=50083
"riscv64" => llvm_util::get_version() < (13, 0, 0),
_ => false,
}
}
fn fptoint_sat( fn fptoint_sat(
&mut self, &mut self,
signed: bool, signed: bool,
val: &'ll Value, val: &'ll Value,
dest_ty: &'ll Type, dest_ty: &'ll Type,
) -> Option<&'ll Value> { ) -> Option<&'ll Value> {
if !self.fptoint_sat_broken_in_llvm() { let src_ty = self.cx.val_ty(val);
let src_ty = self.cx.val_ty(val); let (float_ty, int_ty, vector_length) = if self.cx.type_kind(src_ty) == TypeKind::Vector {
let (float_ty, int_ty, vector_length) = if self.cx.type_kind(src_ty) == TypeKind::Vector assert_eq!(self.cx.vector_length(src_ty), self.cx.vector_length(dest_ty));
{ (
assert_eq!(self.cx.vector_length(src_ty), self.cx.vector_length(dest_ty)); self.cx.element_type(src_ty),
( self.cx.element_type(dest_ty),
self.cx.element_type(src_ty), Some(self.cx.vector_length(src_ty)),
self.cx.element_type(dest_ty), )
Some(self.cx.vector_length(src_ty)),
)
} else {
(src_ty, dest_ty, None)
};
let float_width = self.cx.float_width(float_ty);
let int_width = self.cx.int_width(int_ty);
let instr = if signed { "fptosi" } else { "fptoui" };
let name = if let Some(vector_length) = vector_length {
format!(
"llvm.{}.sat.v{}i{}.v{}f{}",
instr, vector_length, int_width, vector_length, float_width
)
} else {
format!("llvm.{}.sat.i{}.f{}", instr, int_width, float_width)
};
let f =
self.declare_cfn(&name, llvm::UnnamedAddr::No, self.type_func(&[src_ty], dest_ty));
Some(self.call(self.type_func(&[src_ty], dest_ty), f, &[val], None))
} else { } else {
None (src_ty, dest_ty, None)
} };
let float_width = self.cx.float_width(float_ty);
let int_width = self.cx.int_width(int_ty);
let instr = if signed { "fptosi" } else { "fptoui" };
let name = if let Some(vector_length) = vector_length {
format!(
"llvm.{}.sat.v{}i{}.v{}f{}",
instr, vector_length, int_width, vector_length, float_width
)
} else {
format!("llvm.{}.sat.i{}.f{}", instr, int_width, float_width)
};
let f = self.declare_cfn(&name, llvm::UnnamedAddr::No, self.type_func(&[src_ty], dest_ty));
Some(self.call(self.type_func(&[src_ty], dest_ty), f, &[val], None))
} }
pub(crate) fn landing_pad( pub(crate) fn landing_pad(

View file

@ -142,17 +142,6 @@ pub unsafe fn create_module<'ll>(
let mut target_data_layout = sess.target.data_layout.to_string(); let mut target_data_layout = sess.target.data_layout.to_string();
let llvm_version = llvm_util::get_version(); let llvm_version = llvm_util::get_version();
if llvm_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();
}
}
if llvm_version < (14, 0, 0) { if llvm_version < (14, 0, 0) {
if sess.target.llvm_target == "i686-pc-windows-msvc" if sess.target.llvm_target == "i686-pc-windows-msvc"
|| sess.target.llvm_target == "i586-pc-windows-msvc" || sess.target.llvm_target == "i586-pc-windows-msvc"

View file

@ -2424,12 +2424,6 @@ extern "C" {
cookie_out: &mut c_uint, cookie_out: &mut c_uint,
) -> &'a SMDiagnostic; ) -> &'a SMDiagnostic;
pub fn LLVMRustSetInlineAsmDiagnosticHandler(
C: &Context,
H: InlineAsmDiagHandlerTy,
CX: *mut c_void,
);
#[allow(improper_ctypes)] #[allow(improper_ctypes)]
pub fn LLVMRustUnpackSMDiagnostic( pub fn LLVMRustUnpackSMDiagnostic(
d: &SMDiagnostic, d: &SMDiagnostic,

View file

@ -92,16 +92,6 @@ unsafe fn configure_llvm(sess: &Session) {
add("-generate-arange-section", false); add("-generate-arange-section", false);
} }
// Disable the machine outliner by default in LLVM versions 11 and LLVM
// version 12, where it leads to miscompilation.
//
// Ref:
// - https://github.com/rust-lang/rust/issues/85351
// - https://reviews.llvm.org/D103167
if llvm_util::get_version() < (13, 0, 0) {
add("-enable-machine-outliner=never", false);
}
match sess.opts.unstable_opts.merge_functions.unwrap_or(sess.target.merge_functions) { match sess.opts.unstable_opts.merge_functions.unwrap_or(sess.target.merge_functions) {
MergeFunctions::Disabled | MergeFunctions::Trampolines => {} MergeFunctions::Disabled | MergeFunctions::Trampolines => {}
MergeFunctions::Aliases => { MergeFunctions::Aliases => {

View file

@ -24,17 +24,10 @@ extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
const char* const Filenames[], const char* const Filenames[],
size_t FilenamesLen, size_t FilenamesLen,
RustStringRef BufferOut) { RustStringRef BufferOut) {
#if LLVM_VERSION_GE(13,0)
SmallVector<std::string,32> FilenameRefs; SmallVector<std::string,32> FilenameRefs;
for (size_t i = 0; i < FilenamesLen; i++) { for (size_t i = 0; i < FilenamesLen; i++) {
FilenameRefs.push_back(std::string(Filenames[i])); FilenameRefs.push_back(std::string(Filenames[i]));
} }
#else
SmallVector<StringRef,32> FilenameRefs;
for (size_t i = 0; i < FilenamesLen; i++) {
FilenameRefs.push_back(StringRef(Filenames[i]));
}
#endif
auto FilenamesWriter = coverage::CoverageFilenamesSectionWriter( auto FilenamesWriter = coverage::CoverageFilenamesSectionWriter(
makeArrayRef(FilenameRefs)); makeArrayRef(FilenameRefs));
RawRustStringOstream OS(BufferOut); RawRustStringOstream OS(BufferOut);
@ -109,9 +102,5 @@ extern "C" void LLVMRustCoverageWriteMappingVarNameToString(RustStringRef Str) {
} }
extern "C" uint32_t LLVMRustCoverageMappingVersion() { extern "C" uint32_t LLVMRustCoverageMappingVersion() {
#if LLVM_VERSION_GE(13, 0)
return coverage::CovMapVersion::Version6; return coverage::CovMapVersion::Version6;
#else
return coverage::CovMapVersion::Version5;
#endif
} }

View file

@ -870,19 +870,11 @@ LLVMRustOptimizeWithNewPassManager(
PGOOptions::NoCSAction, DebugInfoForProfiling); PGOOptions::NoCSAction, DebugInfoForProfiling);
} }
#if LLVM_VERSION_GE(13, 0)
PassBuilder PB(TM, PTO, PGOOpt, &PIC); PassBuilder PB(TM, PTO, PGOOpt, &PIC);
LoopAnalysisManager LAM; LoopAnalysisManager LAM;
FunctionAnalysisManager FAM; FunctionAnalysisManager FAM;
CGSCCAnalysisManager CGAM; CGSCCAnalysisManager CGAM;
ModuleAnalysisManager MAM; ModuleAnalysisManager MAM;
#else
PassBuilder PB(DebugPassManager, TM, PTO, PGOOpt, &PIC);
LoopAnalysisManager LAM(DebugPassManager);
FunctionAnalysisManager FAM(DebugPassManager);
CGSCCAnalysisManager CGAM(DebugPassManager);
ModuleAnalysisManager MAM(DebugPassManager);
#endif
FAM.registerPass([&] { return PB.buildDefaultAAPipeline(); }); FAM.registerPass([&] { return PB.buildDefaultAAPipeline(); });
@ -1019,11 +1011,7 @@ LLVMRustOptimizeWithNewPassManager(
} }
} }
#if LLVM_VERSION_GE(13, 0)
ModulePassManager MPM; ModulePassManager MPM;
#else
ModulePassManager MPM(DebugPassManager);
#endif
bool NeedThinLTOBufferPasses = UseThinLTOBuffers; bool NeedThinLTOBufferPasses = UseThinLTOBuffers;
if (!NoPrepopulatePasses) { if (!NoPrepopulatePasses) {
// The pre-link pipelines don't support O0 and require using budilO0DefaultPipeline() instead. // The pre-link pipelines don't support O0 and require using budilO0DefaultPipeline() instead.
@ -1438,17 +1426,13 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules,
Ret->ResolvedODR[ModuleIdentifier][GUID] = NewLinkage; Ret->ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
}; };
#if LLVM_VERSION_GE(13,0)
// Uses FromPrevailing visibility scheme which works for many binary // Uses FromPrevailing visibility scheme which works for many binary
// formats. We probably could and should use ELF visibility scheme for many of // formats. We probably could and should use ELF visibility scheme for many of
// our targets, however. // our targets, however.
lto::Config conf; lto::Config conf;
thinLTOResolvePrevailingInIndex(conf, Ret->Index, isPrevailing, recordNewLinkage, thinLTOResolvePrevailingInIndex(conf, Ret->Index, isPrevailing, recordNewLinkage,
Ret->GUIDPreservedSymbols); Ret->GUIDPreservedSymbols);
#else
thinLTOResolvePrevailingInIndex(Ret->Index, isPrevailing, recordNewLinkage,
Ret->GUIDPreservedSymbols);
#endif
// Here we calculate an `ExportedGUIDs` set for use in the `isExported` // Here we calculate an `ExportedGUIDs` set for use in the `isExported`
// callback below. This callback below will dictate the linkage for all // callback below. This callback below will dictate the linkage for all
// summaries in the index, and we basically just only want to ensure that dead // summaries in the index, and we basically just only want to ensure that dead

View file

@ -413,18 +413,12 @@ LLVMRustBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Target,
LLVMValueRef Old, LLVMValueRef Source, LLVMValueRef Old, LLVMValueRef Source,
LLVMAtomicOrdering Order, LLVMAtomicOrdering Order,
LLVMAtomicOrdering FailureOrder, LLVMBool Weak) { LLVMAtomicOrdering FailureOrder, LLVMBool Weak) {
#if LLVM_VERSION_GE(13,0)
// Rust probably knows the alignment of the target value and should be able to // Rust probably knows the alignment of the target value and should be able to
// specify something more precise than MaybeAlign here. See also // specify something more precise than MaybeAlign here. See also
// https://reviews.llvm.org/D97224 which may be a useful reference. // https://reviews.llvm.org/D97224 which may be a useful reference.
AtomicCmpXchgInst *ACXI = unwrap(B)->CreateAtomicCmpXchg( AtomicCmpXchgInst *ACXI = unwrap(B)->CreateAtomicCmpXchg(
unwrap(Target), unwrap(Old), unwrap(Source), llvm::MaybeAlign(), fromRust(Order), unwrap(Target), unwrap(Old), unwrap(Source), llvm::MaybeAlign(), fromRust(Order),
fromRust(FailureOrder)); fromRust(FailureOrder));
#else
AtomicCmpXchgInst *ACXI = unwrap(B)->CreateAtomicCmpXchg(
unwrap(Target), unwrap(Old), unwrap(Source), fromRust(Order),
fromRust(FailureOrder));
#endif
ACXI->setWeak(Weak); ACXI->setWeak(Weak);
return wrap(ACXI); return wrap(ACXI);
} }
@ -472,19 +466,11 @@ LLVMRustInlineAsm(LLVMTypeRef Ty, char *AsmString, size_t AsmStringLen,
char *Constraints, size_t ConstraintsLen, char *Constraints, size_t ConstraintsLen,
LLVMBool HasSideEffects, LLVMBool IsAlignStack, LLVMBool HasSideEffects, LLVMBool IsAlignStack,
LLVMRustAsmDialect Dialect, LLVMBool CanThrow) { LLVMRustAsmDialect Dialect, LLVMBool CanThrow) {
#if LLVM_VERSION_GE(13, 0)
return wrap(InlineAsm::get(unwrap<FunctionType>(Ty), return wrap(InlineAsm::get(unwrap<FunctionType>(Ty),
StringRef(AsmString, AsmStringLen), StringRef(AsmString, AsmStringLen),
StringRef(Constraints, ConstraintsLen), StringRef(Constraints, ConstraintsLen),
HasSideEffects, IsAlignStack, HasSideEffects, IsAlignStack,
fromRust(Dialect), CanThrow)); fromRust(Dialect), CanThrow));
#else
return wrap(InlineAsm::get(unwrap<FunctionType>(Ty),
StringRef(AsmString, AsmStringLen),
StringRef(Constraints, ConstraintsLen),
HasSideEffects, IsAlignStack,
fromRust(Dialect)));
#endif
} }
extern "C" bool LLVMRustInlineAsmVerify(LLVMTypeRef Ty, char *Constraints, extern "C" bool LLVMRustInlineAsmVerify(LLVMTypeRef Ty, char *Constraints,
@ -1274,10 +1260,8 @@ static LLVMRustDiagnosticKind toRust(DiagnosticKind Kind) {
return LLVMRustDiagnosticKind::Linker; return LLVMRustDiagnosticKind::Linker;
case DK_Unsupported: case DK_Unsupported:
return LLVMRustDiagnosticKind::Unsupported; return LLVMRustDiagnosticKind::Unsupported;
#if LLVM_VERSION_GE(13, 0)
case DK_SrcMgr: case DK_SrcMgr:
return LLVMRustDiagnosticKind::SrcMgr; return LLVMRustDiagnosticKind::SrcMgr;
#endif
default: default:
return (Kind >= DK_FirstRemark && Kind <= DK_LastRemark) return (Kind >= DK_FirstRemark && Kind <= DK_LastRemark)
? LLVMRustDiagnosticKind::OptimizationRemarkOther ? LLVMRustDiagnosticKind::OptimizationRemarkOther
@ -1351,30 +1335,11 @@ extern "C" LLVMTypeKind LLVMRustGetTypeKind(LLVMTypeRef Ty) {
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SMDiagnostic, LLVMSMDiagnosticRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SMDiagnostic, LLVMSMDiagnosticRef)
#if LLVM_VERSION_LT(13, 0)
using LLVMInlineAsmDiagHandlerTy = LLVMContext::InlineAsmDiagHandlerTy;
#else
using LLVMInlineAsmDiagHandlerTy = void*;
#endif
extern "C" void LLVMRustSetInlineAsmDiagnosticHandler(
LLVMContextRef C, LLVMInlineAsmDiagHandlerTy H, void *CX) {
// Diagnostic handlers were unified in LLVM change 5de2d189e6ad, so starting
// with LLVM 13 this function is gone.
#if LLVM_VERSION_LT(13, 0)
unwrap(C)->setInlineAsmDiagnosticHandler(H, CX);
#endif
}
extern "C" LLVMSMDiagnosticRef LLVMRustGetSMDiagnostic( extern "C" LLVMSMDiagnosticRef LLVMRustGetSMDiagnostic(
LLVMDiagnosticInfoRef DI, unsigned *Cookie) { LLVMDiagnosticInfoRef DI, unsigned *Cookie) {
#if LLVM_VERSION_GE(13, 0)
llvm::DiagnosticInfoSrcMgr *SM = static_cast<llvm::DiagnosticInfoSrcMgr *>(unwrap(DI)); llvm::DiagnosticInfoSrcMgr *SM = static_cast<llvm::DiagnosticInfoSrcMgr *>(unwrap(DI));
*Cookie = SM->getLocCookie(); *Cookie = SM->getLocCookie();
return wrap(&SM->getSMDiag()); return wrap(&SM->getSMDiag());
#else
report_fatal_error("Shouldn't get called on older versions");
#endif
} }
extern "C" bool LLVMRustUnpackSMDiagnostic(LLVMSMDiagnosticRef DRef, extern "C" bool LLVMRustUnpackSMDiagnostic(LLVMSMDiagnosticRef DRef,

View file

@ -1139,11 +1139,7 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
#[must_use] #[must_use]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
fn le(&self, other: &Rhs) -> bool { fn le(&self, other: &Rhs) -> bool {
// Pattern `Some(Less | Eq)` optimizes worse than negating `None | Some(Greater)`. matches!(self.partial_cmp(other), Some(Less | Equal))
// FIXME: The root cause was fixed upstream in LLVM with:
// https://github.com/llvm/llvm-project/commit/9bad7de9a3fb844f1ca2965f35d0c2a3d1e11775
// Revert this workaround once support for LLVM 12 gets dropped.
!matches!(self.partial_cmp(other), None | Some(Greater))
} }
/// This method tests greater than (for `self` and `other`) and is used by the `>` operator. /// This method tests greater than (for `self` and `other`) and is used by the `>` operator.

View file

@ -515,11 +515,11 @@ fn check_llvm_version(builder: &Builder<'_>, llvm_config: &Path) {
let version = output(cmd.arg("--version")); let version = output(cmd.arg("--version"));
let mut parts = version.split('.').take(2).filter_map(|s| s.parse::<u32>().ok()); let mut parts = version.split('.').take(2).filter_map(|s| s.parse::<u32>().ok());
if let (Some(major), Some(_minor)) = (parts.next(), parts.next()) { if let (Some(major), Some(_minor)) = (parts.next(), parts.next()) {
if major >= 12 { if major >= 13 {
return; return;
} }
} }
panic!("\n\nbad LLVM version: {}, need >=12.0\n\n", version) panic!("\n\nbad LLVM version: {}, need >=13.0\n\n", version)
} }
fn configure_cmake( fn configure_cmake(

View file

@ -1,4 +1,4 @@
FROM ubuntu:20.04 FROM ubuntu:22.04
ARG DEBIAN_FRONTEND=noninteractive ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install -y --no-install-recommends \
@ -14,8 +14,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
cmake \ cmake \
sudo \ sudo \
gdb \ gdb \
llvm-12-tools \ llvm-13-tools \
llvm-12-dev \ llvm-13-dev \
libedit-dev \ libedit-dev \
libssl-dev \ libssl-dev \
pkg-config \ pkg-config \
@ -29,7 +29,7 @@ RUN sh /scripts/sccache.sh
# using llvm-link-shared due to libffi issues -- see #34486 # using llvm-link-shared due to libffi issues -- see #34486
ENV RUST_CONFIGURE_ARGS \ ENV RUST_CONFIGURE_ARGS \
--build=x86_64-unknown-linux-gnu \ --build=x86_64-unknown-linux-gnu \
--llvm-root=/usr/lib/llvm-12 \ --llvm-root=/usr/lib/llvm-13 \
--enable-llvm-link-shared \ --enable-llvm-link-shared \
--set rust.thin-lto-import-instr-limit=10 --set rust.thin-lto-import-instr-limit=10
@ -41,4 +41,4 @@ ENV SCRIPT python2.7 ../x.py --stage 1 test --exclude src/tools/tidy && \
# It will also detect tests lacking `// EMIT_MIR_FOR_EACH_BIT_WIDTH`, # It will also detect tests lacking `// EMIT_MIR_FOR_EACH_BIT_WIDTH`,
# despite having different output on 32-bit vs 64-bit targets. # despite having different output on 32-bit vs 64-bit targets.
python2.7 ../x.py --stage 1 test src/test/mir-opt \ python2.7 ../x.py --stage 1 test src/test/mir-opt \
--host='' --target=i686-unknown-linux-gnu --host='' --target=i686-unknown-linux-gnu

View file

@ -1,4 +1,4 @@
FROM ubuntu:20.04 FROM ubuntu:22.04
ARG DEBIAN_FRONTEND=noninteractive ARG DEBIAN_FRONTEND=noninteractive
@ -17,8 +17,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
cmake \ cmake \
sudo \ sudo \
gdb \ gdb \
llvm-12-tools \ llvm-13-tools \
llvm-12-dev \ llvm-13-dev \
libedit-dev \ libedit-dev \
libssl-dev \ libssl-dev \
pkg-config \ pkg-config \
@ -40,7 +40,7 @@ RUN sh /scripts/sccache.sh
# using llvm-link-shared due to libffi issues -- see #34486 # using llvm-link-shared due to libffi issues -- see #34486
ENV RUST_CONFIGURE_ARGS \ ENV RUST_CONFIGURE_ARGS \
--build=x86_64-unknown-linux-gnu \ --build=x86_64-unknown-linux-gnu \
--llvm-root=/usr/lib/llvm-12 \ --llvm-root=/usr/lib/llvm-13 \
--enable-llvm-link-shared \ --enable-llvm-link-shared \
--set rust.thin-lto-import-instr-limit=10 --set rust.thin-lto-import-instr-limit=10

View file

@ -284,7 +284,7 @@ jobs:
- name: mingw-check - name: mingw-check
<<: *job-linux-xl <<: *job-linux-xl
- name: x86_64-gnu-llvm-12 - name: x86_64-gnu-llvm-13
<<: *job-linux-xl <<: *job-linux-xl
- name: x86_64-gnu-tools - name: x86_64-gnu-tools
@ -431,12 +431,12 @@ jobs:
- name: x86_64-gnu-distcheck - name: x86_64-gnu-distcheck
<<: *job-linux-xl <<: *job-linux-xl
- name: x86_64-gnu-llvm-12 - name: x86_64-gnu-llvm-13
env: env:
RUST_BACKTRACE: 1 RUST_BACKTRACE: 1
<<: *job-linux-xl <<: *job-linux-xl
- name: x86_64-gnu-llvm-12-stage1 - name: x86_64-gnu-llvm-13-stage1
env: env:
RUST_BACKTRACE: 1 RUST_BACKTRACE: 1
<<: *job-linux-xl <<: *job-linux-xl

View file

@ -1,6 +1,5 @@
// Test that PAC instructions are emitted when branch-protection is specified. // Test that PAC instructions are emitted when branch-protection is specified.
// min-llvm-version: 10.0.1
// assembly-output: emit-asm // assembly-output: emit-asm
// compile-flags: --target aarch64-unknown-linux-gnu // compile-flags: --target aarch64-unknown-linux-gnu
// compile-flags: -Z branch-protection=pac-ret,leaf // compile-flags: -Z branch-protection=pac-ret,leaf

View file

@ -1,4 +1,3 @@
// min-llvm-version: 13.0
// assembly-output: emit-asm // assembly-output: emit-asm
// compile-flags: --target avr-unknown-gnu-atmega328 // compile-flags: --target avr-unknown-gnu-atmega328
// needs-llvm-components: avr // needs-llvm-components: avr

View file

@ -1,4 +1,3 @@
// min-llvm-version: 13.0
// assembly-output: emit-asm // assembly-output: emit-asm
// compile-flags: --target avr-unknown-gnu-atmega328 // compile-flags: --target avr-unknown-gnu-atmega328
// needs-llvm-components: avr // needs-llvm-components: avr

View file

@ -1,4 +1,3 @@
// min-llvm-version: 13.0
// assembly-output: emit-asm // assembly-output: emit-asm
// compile-flags: --target bpfel-unknown-none -C target_feature=+alu32 // compile-flags: --target bpfel-unknown-none -C target_feature=+alu32
// needs-llvm-components: bpf // needs-llvm-components: bpf

View file

@ -1,4 +1,3 @@
// min-llvm-version: 13.0
// assembly-output: emit-asm // assembly-output: emit-asm
// compile-flags: --target msp430-none-elf // compile-flags: --target msp430-none-elf
// needs-llvm-components: msp430 // needs-llvm-components: msp430

View file

@ -1,4 +1,3 @@
// min-llvm-version: 12.0.1
// revisions: powerpc powerpc64 // revisions: powerpc powerpc64
// assembly-output: emit-asm // assembly-output: emit-asm
//[powerpc] compile-flags: --target powerpc-unknown-linux-gnu //[powerpc] compile-flags: --target powerpc-unknown-linux-gnu

View file

@ -156,7 +156,6 @@
// [r74] needs-llvm-components: x86 // [r74] needs-llvm-components: x86
// [r75] compile-flags:--target x86_64-fortanix-unknown-sgx // [r75] compile-flags:--target x86_64-fortanix-unknown-sgx
// [r75] needs-llvm-components: x86 // [r75] needs-llvm-components: x86
// [r75] min-llvm-version: 11.0.0
// [r76] compile-flags:--target x86_64-fuchsia // [r76] compile-flags:--target x86_64-fuchsia
// [r76] needs-llvm-components: x86 // [r76] needs-llvm-components: x86
// [r77] compile-flags:--target x86_64-linux-android // [r77] compile-flags:--target x86_64-linux-android

View file

@ -1,4 +1,3 @@
// min-llvm-version: 13.0.0
// compile-flags: -O // compile-flags: -O
// only-x86_64 // only-x86_64

View file

@ -1,84 +0,0 @@
// Code generation of atomic operations for LLVM 12
// ignore-llvm-version: 13 - 99
// compile-flags: -O
#![crate_type = "lib"]
use std::sync::atomic::{AtomicI32, Ordering::*};
// CHECK-LABEL: @compare_exchange
#[no_mangle]
pub fn compare_exchange(a: &AtomicI32) {
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 10 monotonic monotonic
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 11 acquire acquire
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 12 seq_cst seq_cst
let _ = a.compare_exchange(0, 10, Relaxed, Relaxed);
let _ = a.compare_exchange(0, 11, Relaxed, Acquire);
let _ = a.compare_exchange(0, 12, Relaxed, SeqCst);
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 20 release monotonic
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 21 acq_rel acquire
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 22 seq_cst seq_cst
let _ = a.compare_exchange(0, 20, Release, Relaxed);
let _ = a.compare_exchange(0, 21, Release, Acquire);
let _ = a.compare_exchange(0, 22, Release, SeqCst);
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 30 acquire monotonic
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 31 acquire acquire
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 32 seq_cst seq_cst
let _ = a.compare_exchange(0, 30, Acquire, Relaxed);
let _ = a.compare_exchange(0, 31, Acquire, Acquire);
let _ = a.compare_exchange(0, 32, Acquire, SeqCst);
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 40 acq_rel monotonic
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 41 acq_rel acquire
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 42 seq_cst seq_cst
let _ = a.compare_exchange(0, 40, AcqRel, Relaxed);
let _ = a.compare_exchange(0, 41, AcqRel, Acquire);
let _ = a.compare_exchange(0, 42, AcqRel, SeqCst);
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 50 seq_cst monotonic
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 51 seq_cst acquire
// CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 52 seq_cst seq_cst
let _ = a.compare_exchange(0, 50, SeqCst, Relaxed);
let _ = a.compare_exchange(0, 51, SeqCst, Acquire);
let _ = a.compare_exchange(0, 52, SeqCst, SeqCst);
}
// CHECK-LABEL: @compare_exchange_weak
#[no_mangle]
pub fn compare_exchange_weak(w: &AtomicI32) {
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 10 monotonic monotonic
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 11 acquire acquire
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 12 seq_cst seq_cst
let _ = w.compare_exchange_weak(1, 10, Relaxed, Relaxed);
let _ = w.compare_exchange_weak(1, 11, Relaxed, Acquire);
let _ = w.compare_exchange_weak(1, 12, Relaxed, SeqCst);
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 20 release monotonic
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 21 acq_rel acquire
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 22 seq_cst seq_cst
let _ = w.compare_exchange_weak(1, 20, Release, Relaxed);
let _ = w.compare_exchange_weak(1, 21, Release, Acquire);
let _ = w.compare_exchange_weak(1, 22, Release, SeqCst);
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 30 acquire monotonic
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 31 acquire acquire
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 32 seq_cst seq_cst
let _ = w.compare_exchange_weak(1, 30, Acquire, Relaxed);
let _ = w.compare_exchange_weak(1, 31, Acquire, Acquire);
let _ = w.compare_exchange_weak(1, 32, Acquire, SeqCst);
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 40 acq_rel monotonic
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 41 acq_rel acquire
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 42 seq_cst seq_cst
let _ = w.compare_exchange_weak(1, 40, AcqRel, Relaxed);
let _ = w.compare_exchange_weak(1, 41, AcqRel, Acquire);
let _ = w.compare_exchange_weak(1, 42, AcqRel, SeqCst);
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 50 seq_cst monotonic
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 51 seq_cst acquire
// CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 52 seq_cst seq_cst
let _ = w.compare_exchange_weak(1, 50, SeqCst, Relaxed);
let _ = w.compare_exchange_weak(1, 51, SeqCst, Acquire);
let _ = w.compare_exchange_weak(1, 52, SeqCst, SeqCst);
}

View file

@ -1,5 +1,4 @@
// Code generation of atomic operations. // Code generation of atomic operations.
// min-llvm-version: 13.0
// compile-flags: -O // compile-flags: -O
#![crate_type = "lib"] #![crate_type = "lib"]

View file

@ -1,7 +1,6 @@
// Test that the correct module flags are emitted with different branch protection flags. // Test that the correct module flags are emitted with different branch protection flags.
// revisions: BTI PACRET LEAF BKEY NONE // revisions: BTI PACRET LEAF BKEY NONE
// min-llvm-version: 12.0.0
// needs-llvm-components: aarch64 // needs-llvm-components: aarch64
// [BTI] compile-flags: -Z branch-protection=bti // [BTI] compile-flags: -Z branch-protection=bti
// [PACRET] compile-flags: -Z branch-protection=pac-ret // [PACRET] compile-flags: -Z branch-protection=pac-ret

View file

@ -1,3 +1,4 @@
// min-llvm-version: 14.0
// revisions: O Os // revisions: O Os
//[Os] compile-flags: -Copt-level=s //[Os] compile-flags: -Copt-level=s
//[O] compile-flags: -O //[O] compile-flags: -O

View file

@ -1,7 +1,6 @@
//! Tests that unwinding from an asm block is caught and forced to abort //! Tests that unwinding from an asm block is caught and forced to abort
//! when `-C panic=abort`. //! when `-C panic=abort`.
// min-llvm-version: 13.0.0
// only-x86_64 // only-x86_64
// compile-flags: -C panic=abort // compile-flags: -C panic=abort
// no-prefer-dynamic // no-prefer-dynamic

View file

@ -1,4 +1,3 @@
// min-llvm-version: 13.0.0
// only-aarch64 // only-aarch64
// run-pass // run-pass
// needs-asm-support // needs-asm-support

View file

@ -1,4 +1,3 @@
// min-llvm-version: 13.0.0
// run-pass // run-pass
// needs-asm-support // needs-asm-support

View file

@ -1,4 +1,3 @@
// min-llvm-version: 13.0.0
// only-x86_64 // only-x86_64
// run-pass // run-pass
// needs-asm-support // needs-asm-support

View file

@ -1,4 +1,3 @@
// min-llvm-version: 12.0.1
// only-x86_64 // only-x86_64
// only-linux // only-linux
// needs-asm-support // needs-asm-support

View file

@ -1,5 +1,4 @@
// run-pass // run-pass
// min-llvm-version: 13.0
// compile-flags: -O // compile-flags: -O
// Regression test for issue #80309 // Regression test for issue #80309

View file

@ -1,5 +1,4 @@
// run-pass // run-pass
// min-llvm-version: 13.0
// compile-flags: -O // compile-flags: -O
// Regression test for issue #80309 // Regression test for issue #80309