Auto merge of #122365 - matthiaskrgr:rollup-4i350h6, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #115141 (Update Windows platform support) - #121865 (Add FileCheck annotations to MIR-opt unnamed-fields tests) - #122000 (Fix 32-bit overflows in LLVM composite constants) - #122194 (Enable creating backtraces via -Ztreat-err-as-bug when stashing errors) - #122319 (Don't ICE when non-self part of trait goal is constrained in new solver) - #122339 (Update books) - #122342 (Update /NODEFAUTLIB comment for msvc) - #122343 (Remove some unnecessary `allow(incomplete_features)` in the test suite) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
b0170b693e
94 changed files with 396 additions and 381 deletions
|
|
@ -95,11 +95,13 @@ impl<'ll> BackendTypes for CodegenCx<'ll, '_> {
|
|||
|
||||
impl<'ll> CodegenCx<'ll, '_> {
|
||||
pub fn const_array(&self, ty: &'ll Type, elts: &[&'ll Value]) -> &'ll Value {
|
||||
unsafe { llvm::LLVMConstArray(ty, elts.as_ptr(), elts.len() as c_uint) }
|
||||
let len = u64::try_from(elts.len()).expect("LLVMConstArray2 elements len overflow");
|
||||
unsafe { llvm::LLVMConstArray2(ty, elts.as_ptr(), len) }
|
||||
}
|
||||
|
||||
pub fn const_vector(&self, elts: &[&'ll Value]) -> &'ll Value {
|
||||
unsafe { llvm::LLVMConstVector(elts.as_ptr(), elts.len() as c_uint) }
|
||||
let len = c_uint::try_from(elts.len()).expect("LLVMConstVector elements len overflow");
|
||||
unsafe { llvm::LLVMConstVector(elts.as_ptr(), len) }
|
||||
}
|
||||
|
||||
pub fn const_bytes(&self, bytes: &[u8]) -> &'ll Value {
|
||||
|
|
@ -108,8 +110,8 @@ impl<'ll> CodegenCx<'ll, '_> {
|
|||
|
||||
pub fn const_get_elt(&self, v: &'ll Value, idx: u64) -> &'ll Value {
|
||||
unsafe {
|
||||
assert_eq!(idx as c_uint as u64, idx);
|
||||
let r = llvm::LLVMGetAggregateElement(v, idx as c_uint).unwrap();
|
||||
let idx = c_uint::try_from(idx).expect("LLVMGetAggregateElement index overflow");
|
||||
let r = llvm::LLVMGetAggregateElement(v, idx).unwrap();
|
||||
|
||||
debug!("const_get_elt(v={:?}, idx={}, r={:?})", v, idx, r);
|
||||
|
||||
|
|
@ -329,7 +331,7 @@ pub fn val_ty(v: &Value) -> &Type {
|
|||
pub fn bytes_in_context<'ll>(llcx: &'ll llvm::Context, bytes: &[u8]) -> &'ll Value {
|
||||
unsafe {
|
||||
let ptr = bytes.as_ptr() as *const c_char;
|
||||
llvm::LLVMConstStringInContext(llcx, ptr, bytes.len() as c_uint, True)
|
||||
llvm::LLVMConstStringInContext2(llcx, ptr, bytes.len(), True)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -338,9 +340,8 @@ pub fn struct_in_context<'ll>(
|
|||
elts: &[&'ll Value],
|
||||
packed: bool,
|
||||
) -> &'ll Value {
|
||||
unsafe {
|
||||
llvm::LLVMConstStructInContext(llcx, elts.as_ptr(), elts.len() as c_uint, packed as Bool)
|
||||
}
|
||||
let len = c_uint::try_from(elts.len()).expect("LLVMConstStructInContext elements len overflow");
|
||||
unsafe { llvm::LLVMConstStructInContext(llcx, elts.as_ptr(), len, packed as Bool) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
|
|||
|
|
@ -936,10 +936,16 @@ extern "C" {
|
|||
pub fn LLVMConstReal(RealTy: &Type, N: f64) -> &Value;
|
||||
|
||||
// Operations on composite constants
|
||||
pub fn LLVMConstStringInContext(
|
||||
pub fn LLVMConstArray2<'a>(
|
||||
ElementTy: &'a Type,
|
||||
ConstantVals: *const &'a Value,
|
||||
Length: u64,
|
||||
) -> &'a Value;
|
||||
pub fn LLVMArrayType2(ElementType: &Type, ElementCount: u64) -> &Type;
|
||||
pub fn LLVMConstStringInContext2(
|
||||
C: &Context,
|
||||
Str: *const c_char,
|
||||
Length: c_uint,
|
||||
Length: size_t,
|
||||
DontNullTerminate: Bool,
|
||||
) -> &Value;
|
||||
pub fn LLVMConstStructInContext<'a>(
|
||||
|
|
@ -948,14 +954,6 @@ extern "C" {
|
|||
Count: c_uint,
|
||||
Packed: Bool,
|
||||
) -> &'a Value;
|
||||
|
||||
// FIXME: replace with LLVMConstArray2 when bumped minimal version to llvm-17
|
||||
// https://github.com/llvm/llvm-project/commit/35276f16e5a2cae0dfb49c0fbf874d4d2f177acc
|
||||
pub fn LLVMConstArray<'a>(
|
||||
ElementTy: &'a Type,
|
||||
ConstantVals: *const &'a Value,
|
||||
Length: c_uint,
|
||||
) -> &'a Value;
|
||||
pub fn LLVMConstVector(ScalarConstantVals: *const &Value, Size: c_uint) -> &Value;
|
||||
|
||||
// Constant expressions
|
||||
|
|
@ -1530,9 +1528,6 @@ extern "C" {
|
|||
/// See llvm::LLVMTypeKind::getTypeID.
|
||||
pub fn LLVMRustGetTypeKind(Ty: &Type) -> TypeKind;
|
||||
|
||||
// Operations on array, pointer, and vector types (sequence types)
|
||||
pub fn LLVMRustArrayType(ElementType: &Type, ElementCount: u64) -> &Type;
|
||||
|
||||
// Operations on all values
|
||||
pub fn LLVMRustGlobalAddMetadata<'a>(Val: &'a Value, KindID: c_uint, Metadata: &'a Metadata);
|
||||
pub fn LLVMRustIsNonGVFunctionPointerTy(Val: &Value) -> bool;
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ impl<'ll, 'tcx> BaseTypeMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
}
|
||||
|
||||
fn type_array(&self, ty: &'ll Type, len: u64) -> &'ll Type {
|
||||
unsafe { llvm::LLVMRustArrayType(ty, len) }
|
||||
unsafe { llvm::LLVMArrayType2(ty, len) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -769,13 +769,10 @@ impl DiagCtxt {
|
|||
format!("invalid level in `stash_diagnostic`: {:?}", diag.level),
|
||||
);
|
||||
}
|
||||
Error => {
|
||||
// This `unchecked_error_guaranteed` is valid. It is where the
|
||||
// `ErrorGuaranteed` for stashed errors originates. See
|
||||
// `DiagCtxtInner::drop`.
|
||||
#[allow(deprecated)]
|
||||
Some(ErrorGuaranteed::unchecked_error_guaranteed())
|
||||
}
|
||||
// We delay a bug here so that `-Ztreat-err-as-bug -Zeagerly-emit-delayed-bugs`
|
||||
// can be used to create a backtrace at the stashing site insted of whenever the
|
||||
// diagnostic context is dropped and thus delayed bugs are emitted.
|
||||
Error => Some(self.span_delayed_bug(span, "stashing {key:?}")),
|
||||
DelayedBug => return self.inner.borrow_mut().emit_diagnostic(diag),
|
||||
ForceWarning(_) | Warning | Note | OnceNote | Help | OnceHelp | FailureNote | Allow
|
||||
| Expect(_) => None,
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include "llvm/IR/IntrinsicsARM.h"
|
||||
#include "llvm/IR/LLVMRemarkStreamer.h"
|
||||
#include "llvm/IR/Mangler.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/Remarks/RemarkStreamer.h"
|
||||
#include "llvm/Remarks/RemarkSerializer.h"
|
||||
#include "llvm/Remarks/RemarkFormat.h"
|
||||
|
|
@ -1223,14 +1224,6 @@ extern "C" void LLVMRustWriteValueToString(LLVMValueRef V,
|
|||
}
|
||||
}
|
||||
|
||||
// LLVMArrayType function does not support 64-bit ElementCount
|
||||
// FIXME: replace with LLVMArrayType2 when bumped minimal version to llvm-17
|
||||
// https://github.com/llvm/llvm-project/commit/35276f16e5a2cae0dfb49c0fbf874d4d2f177acc
|
||||
extern "C" LLVMTypeRef LLVMRustArrayType(LLVMTypeRef ElementTy,
|
||||
uint64_t ElementCount) {
|
||||
return wrap(ArrayType::get(unwrap(ElementTy), ElementCount));
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Twine, LLVMTwineRef)
|
||||
|
||||
extern "C" void LLVMRustWriteTwineToString(LLVMTwineRef T, RustStringRef Str) {
|
||||
|
|
@ -2114,3 +2107,36 @@ extern "C" bool LLVMRustLLVMHasZlibCompressionForDebugSymbols() {
|
|||
extern "C" bool LLVMRustLLVMHasZstdCompressionForDebugSymbols() {
|
||||
return llvm::compression::zstd::isAvailable();
|
||||
}
|
||||
|
||||
// Operations on composite constants.
|
||||
// These are clones of LLVM api functions that will become available in future releases.
|
||||
// They can be removed once Rust's minimum supported LLVM version supports them.
|
||||
// See https://github.com/rust-lang/rust/issues/121868
|
||||
// See https://llvm.org/doxygen/group__LLVMCCoreValueConstantComposite.html
|
||||
|
||||
// FIXME: Remove when Rust's minimum supported LLVM version reaches 19.
|
||||
// https://github.com/llvm/llvm-project/commit/e1405e4f71c899420ebf8262d5e9745598419df8
|
||||
#if LLVM_VERSION_LT(19, 0)
|
||||
extern "C" LLVMValueRef LLVMConstStringInContext2(LLVMContextRef C,
|
||||
const char *Str,
|
||||
size_t Length,
|
||||
bool DontNullTerminate) {
|
||||
return wrap(ConstantDataArray::getString(*unwrap(C), StringRef(Str, Length), !DontNullTerminate));
|
||||
}
|
||||
#endif
|
||||
|
||||
// FIXME: Remove when Rust's minimum supported LLVM version reaches 17.
|
||||
// https://github.com/llvm/llvm-project/commit/35276f16e5a2cae0dfb49c0fbf874d4d2f177acc
|
||||
#if LLVM_VERSION_LT(17, 0)
|
||||
extern "C" LLVMValueRef LLVMConstArray2(LLVMTypeRef ElementTy,
|
||||
LLVMValueRef *ConstantVals,
|
||||
uint64_t Length) {
|
||||
ArrayRef<Constant *> V(unwrap<Constant>(ConstantVals, Length), Length);
|
||||
return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V));
|
||||
}
|
||||
|
||||
extern "C" LLVMTypeRef LLVMArrayType2(LLVMTypeRef ElementTy,
|
||||
uint64_t ElementCount) {
|
||||
return wrap(ArrayType::get(unwrap(ElementTy), ElementCount));
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -17,15 +17,19 @@ pub fn opts() -> TargetOptions {
|
|||
crt_static_allows_dylibs: true,
|
||||
crt_static_respected: true,
|
||||
requires_uwtable: true,
|
||||
// Currently we don't pass the /NODEFAULTLIB flag to the linker on MSVC
|
||||
// as there's been trouble in the past of linking the C++ standard
|
||||
// library required by LLVM. This likely needs to happen one day, but
|
||||
// in general Windows is also a more controlled environment than
|
||||
// Unix, so it's not necessarily as critical that this be implemented.
|
||||
// We don't pass the /NODEFAULTLIB flag to the linker on MSVC
|
||||
// as that prevents linker directives embedded in object files from
|
||||
// including other necessary libraries.
|
||||
//
|
||||
// Note that there are also some licensing worries about statically
|
||||
// linking some libraries which require a specific agreement, so it may
|
||||
// not ever be possible for us to pass this flag.
|
||||
// For example, msvcrt.lib embeds a linker directive like:
|
||||
// /DEFAULTLIB:vcruntime.lib /DEFAULTLIB:ucrt.lib
|
||||
// So that vcruntime.lib and ucrt.lib are included when the entry point
|
||||
// in msvcrt.lib is used. Using /NODEFAULTLIB would mean having to
|
||||
// manually add those two libraries and potentially further dependencies
|
||||
// they bring in.
|
||||
//
|
||||
// See also https://learn.microsoft.com/en-us/cpp/preprocessor/comment-c-cpp?view=msvc-170#lib
|
||||
// for documention on including library dependencies in C/C++ code.
|
||||
no_default_libraries: false,
|
||||
has_thread_local: true,
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ pub fn target() -> Target {
|
|||
Target {
|
||||
llvm_target: "i686-pc-windows-msvc".into(),
|
||||
metadata: crate::spec::TargetMetadata {
|
||||
description: Some("32-bit MSVC (Windows 7+)".into()),
|
||||
description: Some("32-bit MSVC (Windows 10+)".into()),
|
||||
tier: Some(1),
|
||||
host_tools: Some(true),
|
||||
std: Some(true),
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ pub fn target() -> Target {
|
|||
Target {
|
||||
llvm_target: "x86_64-pc-windows-msvc".into(),
|
||||
metadata: crate::spec::TargetMetadata {
|
||||
description: Some("64-bit MSVC (Windows 7+)".into()),
|
||||
description: Some("64-bit MSVC (Windows 10+)".into()),
|
||||
tier: Some(1),
|
||||
host_tools: Some(true),
|
||||
std: Some(true),
|
||||
|
|
|
|||
|
|
@ -274,7 +274,9 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
|||
|
||||
let goal =
|
||||
goal.with(self.tcx(), goal.predicate.with_self_ty(self.tcx(), normalized_self_ty));
|
||||
debug_assert_eq!(goal, self.resolve_vars_if_possible(goal));
|
||||
// Vars that show up in the rest of the goal substs may have been constrained by
|
||||
// normalizing the self type as well, since type variables are not uniquified.
|
||||
let goal = self.resolve_vars_if_possible(goal);
|
||||
|
||||
let mut candidates = vec![];
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue