mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-29 20:46:07 +03:00
Auto merge of #137346 - workingjubilee:rollup-sxu05ms, r=workingjubilee
Rollup of 12 pull requests
Successful merges:
- #131651 (Create a generic AVR target: avr-none)
- #134340 (Stabilize `num_midpoint_signed` feature)
- #136473 (infer linker flavor by linker name if it's sufficiently specific)
- #136608 (Pass through of target features to llvm-bitcode-linker and handling them)
- #136985 (Do not ignore uninhabited types for function-call ABI purposes. (Remove BackendRepr::Uninhabited))
- #137270 (Fix `*-win7-windows-msvc` target since 26eeac1a1e)
- #137312 (Update references to cc_detect.rs)
- #137318 (Workaround Cranelift not yet properly supporting vectors smaller than 128bit)
- #137322 (Update docs for default features of wasm targets)
- #137324 (Make x86 QNX target name consistent with other Rust targets)
- #137338 (skip submodule updating logics on tarballs)
- #137340 (Add a notice about missing GCC sources into source tarballs)
r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
@@ -65,8 +65,6 @@ pub fn homogeneous_aggregate<C>(&self, cx: &C) -> Result<HomogeneousAggregate, H
|
||||
Ty: TyAbiInterface<'a, C> + Copy,
|
||||
{
|
||||
match self.backend_repr {
|
||||
BackendRepr::Uninhabited => Err(Heterogeneous),
|
||||
|
||||
// The primitive for this algorithm.
|
||||
BackendRepr::Scalar(scalar) => {
|
||||
let kind = match scalar.primitive() {
|
||||
|
||||
@@ -130,6 +130,7 @@ pub fn scalar_pair<FieldIdx: Idx, VariantIdx: Idx>(
|
||||
},
|
||||
backend_repr: BackendRepr::ScalarPair(a, b),
|
||||
largest_niche,
|
||||
uninhabited: false,
|
||||
align,
|
||||
size,
|
||||
max_repr_align: None,
|
||||
@@ -221,8 +222,9 @@ pub fn layout_of_never_type<FieldIdx: Idx, VariantIdx: Idx>(
|
||||
LayoutData {
|
||||
variants: Variants::Empty,
|
||||
fields: FieldsShape::Primitive,
|
||||
backend_repr: BackendRepr::Uninhabited,
|
||||
backend_repr: BackendRepr::Memory { sized: true },
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
align: dl.i8_align,
|
||||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
@@ -400,6 +402,7 @@ pub fn layout_of_union<
|
||||
fields: FieldsShape::Union(union_field_count),
|
||||
backend_repr: abi,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
align,
|
||||
size: size.align_to(align.abi),
|
||||
max_repr_align,
|
||||
@@ -447,7 +450,6 @@ fn layout_of_struct<
|
||||
Scalar::Union { .. } => {}
|
||||
};
|
||||
match &mut st.backend_repr {
|
||||
BackendRepr::Uninhabited => {}
|
||||
BackendRepr::Scalar(scalar) => hide_niches(scalar),
|
||||
BackendRepr::ScalarPair(a, b) => {
|
||||
hide_niches(a);
|
||||
@@ -639,9 +641,8 @@ struct TmpLayout<FieldIdx: Idx, VariantIdx: Idx> {
|
||||
let same_size = size == variant_layouts[largest_variant_index].size;
|
||||
let same_align = align == variant_layouts[largest_variant_index].align;
|
||||
|
||||
let abi = if variant_layouts.iter().all(|v| v.is_uninhabited()) {
|
||||
BackendRepr::Uninhabited
|
||||
} else if same_size && same_align && others_zst {
|
||||
let uninhabited = variant_layouts.iter().all(|v| v.is_uninhabited());
|
||||
let abi = if same_size && same_align && others_zst {
|
||||
match variant_layouts[largest_variant_index].backend_repr {
|
||||
// When the total alignment and size match, we can use the
|
||||
// same ABI as the scalar variant with the reserved niche.
|
||||
@@ -683,6 +684,7 @@ struct TmpLayout<FieldIdx: Idx, VariantIdx: Idx> {
|
||||
},
|
||||
backend_repr: abi,
|
||||
largest_niche,
|
||||
uninhabited,
|
||||
size,
|
||||
align,
|
||||
max_repr_align,
|
||||
@@ -853,9 +855,8 @@ struct TmpLayout<FieldIdx: Idx, VariantIdx: Idx> {
|
||||
};
|
||||
let mut abi = BackendRepr::Memory { sized: true };
|
||||
|
||||
if layout_variants.iter().all(|v| v.is_uninhabited()) {
|
||||
abi = BackendRepr::Uninhabited;
|
||||
} else if tag.size(dl) == size {
|
||||
let uninhabited = layout_variants.iter().all(|v| v.is_uninhabited());
|
||||
if tag.size(dl) == size {
|
||||
// Make sure we only use scalar layout when the enum is entirely its
|
||||
// own tag (i.e. it has no padding nor any non-ZST variant fields).
|
||||
abi = BackendRepr::Scalar(tag);
|
||||
@@ -995,6 +996,7 @@ struct TmpLayout<FieldIdx: Idx, VariantIdx: Idx> {
|
||||
memory_index: [0].into(),
|
||||
},
|
||||
largest_niche,
|
||||
uninhabited,
|
||||
backend_repr: abi,
|
||||
align,
|
||||
size,
|
||||
@@ -1355,9 +1357,7 @@ fn univariant_biased<
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
if fields.iter().any(|f| f.is_uninhabited()) {
|
||||
abi = BackendRepr::Uninhabited;
|
||||
}
|
||||
let uninhabited = fields.iter().any(|f| f.is_uninhabited());
|
||||
|
||||
let unadjusted_abi_align = if repr.transparent() {
|
||||
match layout_of_single_non_zst_field {
|
||||
@@ -1378,6 +1378,7 @@ fn univariant_biased<
|
||||
fields: FieldsShape::Arbitrary { offsets, memory_index },
|
||||
backend_repr: abi,
|
||||
largest_niche,
|
||||
uninhabited,
|
||||
align,
|
||||
size,
|
||||
max_repr_align,
|
||||
|
||||
@@ -1404,7 +1404,6 @@ impl AddressSpace {
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
|
||||
#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
|
||||
pub enum BackendRepr {
|
||||
Uninhabited,
|
||||
Scalar(Scalar),
|
||||
ScalarPair(Scalar, Scalar),
|
||||
Vector {
|
||||
@@ -1423,10 +1422,9 @@ impl BackendRepr {
|
||||
#[inline]
|
||||
pub fn is_unsized(&self) -> bool {
|
||||
match *self {
|
||||
BackendRepr::Uninhabited
|
||||
| BackendRepr::Scalar(_)
|
||||
| BackendRepr::ScalarPair(..)
|
||||
| BackendRepr::Vector { .. } => false,
|
||||
BackendRepr::Scalar(_) | BackendRepr::ScalarPair(..) | BackendRepr::Vector { .. } => {
|
||||
false
|
||||
}
|
||||
BackendRepr::Memory { sized } => !sized,
|
||||
}
|
||||
}
|
||||
@@ -1445,12 +1443,6 @@ pub fn is_signed(&self) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `true` if this is an uninhabited type
|
||||
#[inline]
|
||||
pub fn is_uninhabited(&self) -> bool {
|
||||
matches!(*self, BackendRepr::Uninhabited)
|
||||
}
|
||||
|
||||
/// Returns `true` if this is a scalar type
|
||||
#[inline]
|
||||
pub fn is_scalar(&self) -> bool {
|
||||
@@ -1471,7 +1463,7 @@ pub fn inherent_align<C: HasDataLayout>(&self, cx: &C) -> Option<AbiAndPrefAlign
|
||||
BackendRepr::Vector { element, count } => {
|
||||
cx.data_layout().vector_align(element.size(cx) * count)
|
||||
}
|
||||
BackendRepr::Uninhabited | BackendRepr::Memory { .. } => return None,
|
||||
BackendRepr::Memory { .. } => return None,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1492,7 +1484,7 @@ pub fn inherent_size<C: HasDataLayout>(&self, cx: &C) -> Option<Size> {
|
||||
// to make the size a multiple of align (e.g. for vectors of size 3).
|
||||
(element.size(cx) * count).align_to(self.inherent_align(cx)?.abi)
|
||||
}
|
||||
BackendRepr::Uninhabited | BackendRepr::Memory { .. } => return None,
|
||||
BackendRepr::Memory { .. } => return None,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1506,9 +1498,7 @@ pub fn to_union(&self) -> Self {
|
||||
BackendRepr::Vector { element, count } => {
|
||||
BackendRepr::Vector { element: element.to_union(), count }
|
||||
}
|
||||
BackendRepr::Uninhabited | BackendRepr::Memory { .. } => {
|
||||
BackendRepr::Memory { sized: true }
|
||||
}
|
||||
BackendRepr::Memory { .. } => BackendRepr::Memory { sized: true },
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1704,6 +1694,11 @@ pub struct LayoutData<FieldIdx: Idx, VariantIdx: Idx> {
|
||||
/// The leaf scalar with the largest number of invalid values
|
||||
/// (i.e. outside of its `valid_range`), if it exists.
|
||||
pub largest_niche: Option<Niche>,
|
||||
/// Is this type known to be uninhabted?
|
||||
///
|
||||
/// This is separate from BackendRepr because uninhabited return types can affect ABI,
|
||||
/// especially in the case of by-pointer struct returns, which allocate stack even when unused.
|
||||
pub uninhabited: bool,
|
||||
|
||||
pub align: AbiAndPrefAlign,
|
||||
pub size: Size,
|
||||
@@ -1735,14 +1730,14 @@ impl<FieldIdx: Idx, VariantIdx: Idx> LayoutData<FieldIdx, VariantIdx> {
|
||||
/// Returns `true` if this is an aggregate type (including a ScalarPair!)
|
||||
pub fn is_aggregate(&self) -> bool {
|
||||
match self.backend_repr {
|
||||
BackendRepr::Uninhabited | BackendRepr::Scalar(_) | BackendRepr::Vector { .. } => false,
|
||||
BackendRepr::Scalar(_) | BackendRepr::Vector { .. } => false,
|
||||
BackendRepr::ScalarPair(..) | BackendRepr::Memory { .. } => true,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `true` if this is an uninhabited type
|
||||
pub fn is_uninhabited(&self) -> bool {
|
||||
self.backend_repr.is_uninhabited()
|
||||
self.uninhabited
|
||||
}
|
||||
|
||||
pub fn scalar<C: HasDataLayout>(cx: &C, scalar: Scalar) -> Self {
|
||||
@@ -1778,6 +1773,7 @@ pub fn scalar<C: HasDataLayout>(cx: &C, scalar: Scalar) -> Self {
|
||||
fields: FieldsShape::Primitive,
|
||||
backend_repr: BackendRepr::Scalar(scalar),
|
||||
largest_niche,
|
||||
uninhabited: false,
|
||||
size,
|
||||
align,
|
||||
max_repr_align: None,
|
||||
@@ -1802,6 +1798,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
backend_repr,
|
||||
fields,
|
||||
largest_niche,
|
||||
uninhabited,
|
||||
variants,
|
||||
max_repr_align,
|
||||
unadjusted_abi_align,
|
||||
@@ -1813,6 +1810,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
.field("abi", backend_repr)
|
||||
.field("fields", fields)
|
||||
.field("largest_niche", largest_niche)
|
||||
.field("uninhabited", uninhabited)
|
||||
.field("variants", variants)
|
||||
.field("max_repr_align", max_repr_align)
|
||||
.field("unadjusted_abi_align", unadjusted_abi_align)
|
||||
@@ -1877,7 +1875,6 @@ pub fn is_zst(&self) -> bool {
|
||||
BackendRepr::Scalar(_) | BackendRepr::ScalarPair(..) | BackendRepr::Vector { .. } => {
|
||||
false
|
||||
}
|
||||
BackendRepr::Uninhabited => self.size.bytes() == 0,
|
||||
BackendRepr::Memory { sized } => sized && self.size.bytes() == 0,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -638,9 +638,7 @@ fn transmute_scalar<'tcx>(
|
||||
}
|
||||
CPlaceInner::Addr(_, Some(_)) => bug!("Can't write value to unsized place {:?}", self),
|
||||
CPlaceInner::Addr(to_ptr, None) => {
|
||||
if dst_layout.size == Size::ZERO
|
||||
|| dst_layout.backend_repr == BackendRepr::Uninhabited
|
||||
{
|
||||
if dst_layout.size == Size::ZERO {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -315,7 +315,7 @@ fn codegen_intrinsic_call(
|
||||
let layout = self.layout_of(tp_ty).layout;
|
||||
let _use_integer_compare = match layout.backend_repr() {
|
||||
Scalar(_) | ScalarPair(_, _) => true,
|
||||
Uninhabited | Vector { .. } => false,
|
||||
Vector { .. } => false,
|
||||
Memory { .. } => {
|
||||
// For rusty ABIs, small aggregates are actually passed
|
||||
// as `RegKind::Integer` (see `FnAbi::adjust_for_abi`),
|
||||
|
||||
@@ -84,7 +84,7 @@ fn uncached_gcc_type<'gcc, 'tcx>(
|
||||
false,
|
||||
);
|
||||
}
|
||||
BackendRepr::Uninhabited | BackendRepr::Memory { .. } => {}
|
||||
BackendRepr::Memory { .. } => {}
|
||||
}
|
||||
|
||||
let name = match *layout.ty.kind() {
|
||||
@@ -179,19 +179,16 @@ impl<'tcx> LayoutGccExt<'tcx> for TyAndLayout<'tcx> {
|
||||
fn is_gcc_immediate(&self) -> bool {
|
||||
match self.backend_repr {
|
||||
BackendRepr::Scalar(_) | BackendRepr::Vector { .. } => true,
|
||||
BackendRepr::ScalarPair(..) | BackendRepr::Uninhabited | BackendRepr::Memory { .. } => {
|
||||
false
|
||||
}
|
||||
BackendRepr::ScalarPair(..) | BackendRepr::Memory { .. } => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn is_gcc_scalar_pair(&self) -> bool {
|
||||
match self.backend_repr {
|
||||
BackendRepr::ScalarPair(..) => true,
|
||||
BackendRepr::Uninhabited
|
||||
| BackendRepr::Scalar(_)
|
||||
| BackendRepr::Vector { .. }
|
||||
| BackendRepr::Memory { .. } => false,
|
||||
BackendRepr::Scalar(_) | BackendRepr::Vector { .. } | BackendRepr::Memory { .. } => {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -476,7 +476,7 @@ fn codegen_intrinsic_call(
|
||||
let layout = self.layout_of(tp_ty).layout;
|
||||
let use_integer_compare = match layout.backend_repr() {
|
||||
Scalar(_) | ScalarPair(_, _) => true,
|
||||
Uninhabited | Vector { .. } => false,
|
||||
Vector { .. } => false,
|
||||
Memory { .. } => {
|
||||
// For rusty ABIs, small aggregates are actually passed
|
||||
// as `RegKind::Integer` (see `FnAbi::adjust_for_abi`),
|
||||
|
||||
@@ -23,7 +23,7 @@ fn uncached_llvm_type<'a, 'tcx>(
|
||||
let element = layout.scalar_llvm_type_at(cx, element);
|
||||
return cx.type_vector(element, count);
|
||||
}
|
||||
BackendRepr::Uninhabited | BackendRepr::Memory { .. } | BackendRepr::ScalarPair(..) => {}
|
||||
BackendRepr::Memory { .. } | BackendRepr::ScalarPair(..) => {}
|
||||
}
|
||||
|
||||
let name = match layout.ty.kind() {
|
||||
@@ -172,19 +172,16 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
|
||||
fn is_llvm_immediate(&self) -> bool {
|
||||
match self.backend_repr {
|
||||
BackendRepr::Scalar(_) | BackendRepr::Vector { .. } => true,
|
||||
BackendRepr::ScalarPair(..) | BackendRepr::Uninhabited | BackendRepr::Memory { .. } => {
|
||||
false
|
||||
}
|
||||
BackendRepr::ScalarPair(..) | BackendRepr::Memory { .. } => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn is_llvm_scalar_pair(&self) -> bool {
|
||||
match self.backend_repr {
|
||||
BackendRepr::ScalarPair(..) => true,
|
||||
BackendRepr::Uninhabited
|
||||
| BackendRepr::Scalar(_)
|
||||
| BackendRepr::Vector { .. }
|
||||
| BackendRepr::Memory { .. } => false,
|
||||
BackendRepr::Scalar(_) | BackendRepr::Vector { .. } | BackendRepr::Memory { .. } => {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1990,6 +1990,7 @@ fn add_pre_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor)
|
||||
if let Some(args) = sess.target.pre_link_args.get(&flavor) {
|
||||
cmd.verbatim_args(args.iter().map(Deref::deref));
|
||||
}
|
||||
|
||||
cmd.verbatim_args(&sess.opts.unstable_opts.pre_link_args);
|
||||
}
|
||||
|
||||
@@ -2518,6 +2519,12 @@ fn add_order_independent_options(
|
||||
"--target-cpu",
|
||||
&codegen_results.crate_info.target_cpu,
|
||||
]);
|
||||
if codegen_results.crate_info.target_features.len() > 0 {
|
||||
cmd.link_arg(&format!(
|
||||
"--target-feature={}",
|
||||
&codegen_results.crate_info.target_features.join(",")
|
||||
));
|
||||
}
|
||||
} else if flavor == LinkerFlavor::Ptx {
|
||||
cmd.link_args(&["--fallback-arch", &codegen_results.crate_info.target_cpu]);
|
||||
} else if flavor == LinkerFlavor::Bpf {
|
||||
|
||||
@@ -153,6 +153,7 @@ pub(crate) fn get_linker<'a>(
|
||||
hinted_static: None,
|
||||
is_ld: cc == Cc::No,
|
||||
is_gnu: flavor.is_gnu(),
|
||||
uses_lld: flavor.uses_lld(),
|
||||
}) as Box<dyn Linker>,
|
||||
LinkerFlavor::Msvc(..) => Box::new(MsvcLinker { cmd, sess }) as Box<dyn Linker>,
|
||||
LinkerFlavor::EmCc => Box::new(EmLinker { cmd, sess }) as Box<dyn Linker>,
|
||||
@@ -361,6 +362,7 @@ struct GccLinker<'a> {
|
||||
// Link as ld
|
||||
is_ld: bool,
|
||||
is_gnu: bool,
|
||||
uses_lld: bool,
|
||||
}
|
||||
|
||||
impl<'a> GccLinker<'a> {
|
||||
@@ -552,6 +554,7 @@ fn set_output_kind(
|
||||
self.link_args(&["--entry", "_initialize"]);
|
||||
}
|
||||
}
|
||||
|
||||
// VxWorks compiler driver introduced `--static-crt` flag specifically for rustc,
|
||||
// it switches linking for libc and similar system libraries to static without using
|
||||
// any `#[link]` attributes in the `libc` crate, see #72782 for details.
|
||||
@@ -567,6 +570,15 @@ fn set_output_kind(
|
||||
{
|
||||
self.cc_arg("--static-crt");
|
||||
}
|
||||
|
||||
// avr-none doesn't have default ISA, users must specify which specific
|
||||
// CPU (well, microcontroller) they are targetting using `-Ctarget-cpu`.
|
||||
//
|
||||
// Currently this makes sense only when using avr-gcc as a linker, since
|
||||
// it brings a couple of hand-written important intrinsics from libgcc.
|
||||
if self.sess.target.arch == "avr" && !self.uses_lld {
|
||||
self.verbatim_arg(format!("-mmcu={}", self.target_cpu));
|
||||
}
|
||||
}
|
||||
|
||||
fn link_dylib_by_name(&mut self, name: &str, verbatim: bool, as_needed: bool) {
|
||||
|
||||
@@ -915,6 +915,7 @@ pub fn new(tcx: TyCtxt<'_>, target_cpu: String) -> CrateInfo {
|
||||
let n_crates = crates.len();
|
||||
let mut info = CrateInfo {
|
||||
target_cpu,
|
||||
target_features: tcx.global_backend_features(()).clone(),
|
||||
crate_types,
|
||||
exported_symbols,
|
||||
linked_symbols,
|
||||
|
||||
@@ -190,6 +190,7 @@ fn from(lib: &cstore::NativeLib) -> Self {
|
||||
#[derive(Debug, Encodable, Decodable)]
|
||||
pub struct CrateInfo {
|
||||
pub target_cpu: String,
|
||||
pub target_features: Vec<String>,
|
||||
pub crate_types: Vec<CrateType>,
|
||||
pub exported_symbols: UnordMap<CrateType, Vec<String>>,
|
||||
pub linked_symbols: FxIndexMap<CrateType, Vec<(String, SymbolExportKind)>>,
|
||||
@@ -230,6 +231,7 @@ pub fn provide(providers: &mut Providers) {
|
||||
crate::base::provide(providers);
|
||||
crate::target_features::provide(providers);
|
||||
crate::codegen_attrs::provide(providers);
|
||||
providers.queries.global_backend_features = |_tcx: TyCtxt<'_>, ()| vec![];
|
||||
}
|
||||
|
||||
/// Checks if the given filename ends with the `.rcgu.o` extension that `rustc`
|
||||
|
||||
@@ -4,9 +4,7 @@
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_middle::mir::{
|
||||
self, AssertKind, BasicBlock, InlineAsmMacro, SwitchTargets, UnwindTerminateReason,
|
||||
};
|
||||
use rustc_middle::mir::{self, AssertKind, InlineAsmMacro, SwitchTargets, UnwindTerminateReason};
|
||||
use rustc_middle::ty::layout::{HasTyCtxt, LayoutOf, ValidityRequirement};
|
||||
use rustc_middle::ty::print::{with_no_trimmed_paths, with_no_visible_paths};
|
||||
use rustc_middle::ty::{self, Instance, Ty};
|
||||
@@ -942,7 +940,6 @@ fn codegen_call_terminator(
|
||||
&fn_abi.ret,
|
||||
&mut llargs,
|
||||
Some(intrinsic),
|
||||
target,
|
||||
);
|
||||
let dest = match ret_dest {
|
||||
_ if fn_abi.ret.is_indirect() => llargs[0],
|
||||
@@ -998,19 +995,12 @@ fn codegen_call_terminator(
|
||||
};
|
||||
|
||||
let mut llargs = Vec::with_capacity(arg_count);
|
||||
let destination = target.as_ref().map(|&target| {
|
||||
(
|
||||
self.make_return_dest(
|
||||
bx,
|
||||
destination,
|
||||
&fn_abi.ret,
|
||||
&mut llargs,
|
||||
None,
|
||||
Some(target),
|
||||
),
|
||||
target,
|
||||
)
|
||||
});
|
||||
|
||||
// We still need to call `make_return_dest` even if there's no `target`, since
|
||||
// `fn_abi.ret` could be `PassMode::Indirect`, even if it is uninhabited,
|
||||
// and `make_return_dest` adds the return-place indirect pointer to `llargs`.
|
||||
let return_dest = self.make_return_dest(bx, destination, &fn_abi.ret, &mut llargs, None);
|
||||
let destination = target.map(|target| (return_dest, target));
|
||||
|
||||
// Split the rust-call tupled arguments off.
|
||||
let (first_args, untuple) = if abi == ExternAbi::RustCall && !args.is_empty() {
|
||||
@@ -1813,11 +1803,7 @@ fn make_return_dest(
|
||||
fn_ret: &ArgAbi<'tcx, Ty<'tcx>>,
|
||||
llargs: &mut Vec<Bx::Value>,
|
||||
intrinsic: Option<ty::IntrinsicDef>,
|
||||
target: Option<BasicBlock>,
|
||||
) -> ReturnDest<'tcx, Bx::Value> {
|
||||
if target.is_none() {
|
||||
return ReturnDest::Nothing;
|
||||
}
|
||||
// If the return is ignored, we can just return a do-nothing `ReturnDest`.
|
||||
if fn_ret.is_ignore() {
|
||||
return ReturnDest::Nothing;
|
||||
|
||||
@@ -422,9 +422,7 @@ pub(crate) fn extract_field<Bx: BuilderMethods<'a, 'tcx, Value = V>>(
|
||||
See <https://github.com/rust-lang/rust/issues/137108>",
|
||||
);
|
||||
}
|
||||
BackendRepr::Uninhabited
|
||||
| BackendRepr::ScalarPair(_, _)
|
||||
| BackendRepr::Memory { sized: false } => bug!(),
|
||||
BackendRepr::ScalarPair(_, _) | BackendRepr::Memory { sized: false } => bug!(),
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
@@ -385,7 +385,7 @@ fn offset_(&self, offset: Size, layout: TyAndLayout<'tcx>, cx: &impl HasDataLayo
|
||||
(Immediate::Uninit, _) => Immediate::Uninit,
|
||||
// If the field is uninhabited, we can forget the data (can happen in ConstProp).
|
||||
// `enum S { A(!), B, C }` is an example of an enum with Scalar layout that
|
||||
// has an `Uninhabited` variant, which means this case is possible.
|
||||
// has an uninhabited variant, which means this case is possible.
|
||||
_ if layout.is_uninhabited() => Immediate::Uninit,
|
||||
// the field contains no information, can be left uninit
|
||||
// (Scalar/ScalarPair can contain even aligned ZST, not just 1-ZST)
|
||||
|
||||
@@ -1264,21 +1264,20 @@ fn visit_value(&mut self, val: &PlaceTy<'tcx, M::Provenance>) -> InterpResult<'t
|
||||
}
|
||||
}
|
||||
|
||||
// *After* all of this, check the ABI. We need to check the ABI to handle
|
||||
// types like `NonNull` where the `Scalar` info is more restrictive than what
|
||||
// the fields say (`rustc_layout_scalar_valid_range_start`).
|
||||
// But in most cases, this will just propagate what the fields say,
|
||||
// and then we want the error to point at the field -- so, first recurse,
|
||||
// then check ABI.
|
||||
// *After* all of this, check further information stored in the layout. We need to check
|
||||
// this to handle types like `NonNull` where the `Scalar` info is more restrictive than what
|
||||
// the fields say (`rustc_layout_scalar_valid_range_start`). But in most cases, this will
|
||||
// just propagate what the fields say, and then we want the error to point at the field --
|
||||
// so, we first recurse, then we do this check.
|
||||
//
|
||||
// FIXME: We could avoid some redundant checks here. For newtypes wrapping
|
||||
// scalars, we do the same check on every "level" (e.g., first we check
|
||||
// MyNewtype and then the scalar in there).
|
||||
if val.layout.is_uninhabited() {
|
||||
let ty = val.layout.ty;
|
||||
throw_validation_failure!(self.path, UninhabitedVal { ty });
|
||||
}
|
||||
match val.layout.backend_repr {
|
||||
BackendRepr::Uninhabited => {
|
||||
let ty = val.layout.ty;
|
||||
throw_validation_failure!(self.path, UninhabitedVal { ty });
|
||||
}
|
||||
BackendRepr::Scalar(scalar_layout) => {
|
||||
if !scalar_layout.is_uninit_valid() {
|
||||
// There is something to check here.
|
||||
|
||||
@@ -111,13 +111,15 @@ fn check_validity_requirement_lax<'tcx>(
|
||||
};
|
||||
|
||||
// Check the ABI.
|
||||
let valid = match this.backend_repr {
|
||||
BackendRepr::Uninhabited => false, // definitely UB
|
||||
BackendRepr::Scalar(s) => scalar_allows_raw_init(s),
|
||||
BackendRepr::ScalarPair(s1, s2) => scalar_allows_raw_init(s1) && scalar_allows_raw_init(s2),
|
||||
BackendRepr::Vector { element: s, count } => count == 0 || scalar_allows_raw_init(s),
|
||||
BackendRepr::Memory { .. } => true, // Fields are checked below.
|
||||
};
|
||||
let valid = !this.is_uninhabited() // definitely UB if uninhabited
|
||||
&& match this.backend_repr {
|
||||
BackendRepr::Scalar(s) => scalar_allows_raw_init(s),
|
||||
BackendRepr::ScalarPair(s1, s2) => {
|
||||
scalar_allows_raw_init(s1) && scalar_allows_raw_init(s2)
|
||||
}
|
||||
BackendRepr::Vector { element: s, count } => count == 0 || scalar_allows_raw_init(s),
|
||||
BackendRepr::Memory { .. } => true, // Fields are checked below.
|
||||
};
|
||||
if !valid {
|
||||
// This is definitely not okay.
|
||||
return Ok(false);
|
||||
|
||||
@@ -794,8 +794,9 @@ fn ty_and_layout_for_variant(
|
||||
Some(fields) => FieldsShape::Union(fields),
|
||||
None => FieldsShape::Arbitrary { offsets: IndexVec::new(), memory_index: IndexVec::new() },
|
||||
},
|
||||
backend_repr: BackendRepr::Uninhabited,
|
||||
backend_repr: BackendRepr::Memory { sized: true },
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
align: tcx.data_layout.i8_align,
|
||||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
|
||||
@@ -1558,8 +1558,11 @@ fn type_may_have_niche_of_interest_to_backend(&self, ty: Ty<'tcx>) -> bool {
|
||||
return true;
|
||||
};
|
||||
|
||||
if layout.uninhabited {
|
||||
return true;
|
||||
}
|
||||
|
||||
match layout.backend_repr {
|
||||
BackendRepr::Uninhabited => true,
|
||||
BackendRepr::Scalar(a) => !a.is_always_valid(&self.ecx),
|
||||
BackendRepr::ScalarPair(a, b) => {
|
||||
!a.is_always_valid(&self.ecx) || !b.is_always_valid(&self.ecx)
|
||||
|
||||
@@ -202,7 +202,6 @@ impl<'tcx> Stable<'tcx> for rustc_abi::BackendRepr {
|
||||
|
||||
fn stable(&self, tables: &mut Tables<'_>) -> Self::T {
|
||||
match *self {
|
||||
rustc_abi::BackendRepr::Uninhabited => ValueAbi::Uninhabited,
|
||||
rustc_abi::BackendRepr::Scalar(scalar) => ValueAbi::Scalar(scalar.stable(tables)),
|
||||
rustc_abi::BackendRepr::ScalarPair(first, second) => {
|
||||
ValueAbi::ScalarPair(first.stable(tables), second.stable(tables))
|
||||
|
||||
@@ -80,7 +80,7 @@ fn should_use_fp_conv_helper<'a, Ty, C>(
|
||||
}
|
||||
}
|
||||
},
|
||||
BackendRepr::Vector { .. } | BackendRepr::Uninhabited => return Err(CannotUseFpConv),
|
||||
BackendRepr::Vector { .. } => return Err(CannotUseFpConv),
|
||||
BackendRepr::ScalarPair(..) | BackendRepr::Memory { .. } => match arg_layout.fields {
|
||||
FieldsShape::Primitive => {
|
||||
unreachable!("aggregates can't have `FieldsShape::Primitive`")
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
pub enum PassMode {
|
||||
/// Ignore the argument.
|
||||
///
|
||||
/// The argument is either uninhabited or a ZST.
|
||||
/// The argument is a ZST.
|
||||
Ignore,
|
||||
/// Pass the argument directly.
|
||||
///
|
||||
@@ -350,7 +350,6 @@ pub fn new(
|
||||
scalar_attrs: impl Fn(&TyAndLayout<'a, Ty>, Scalar, Size) -> ArgAttributes,
|
||||
) -> Self {
|
||||
let mode = match layout.backend_repr {
|
||||
BackendRepr::Uninhabited => PassMode::Ignore,
|
||||
BackendRepr::Scalar(scalar) => {
|
||||
PassMode::Direct(scalar_attrs(&layout, scalar, Size::ZERO))
|
||||
}
|
||||
@@ -737,7 +736,9 @@ pub fn adjust_for_rust_abi<C>(&mut self, cx: &C, abi: ExternAbi)
|
||||
// to 128-bit-sized vectors.
|
||||
"x86" if spec.rustc_abi == Some(RustcAbi::X86Sse2) => arg.layout.size.bits() <= 128,
|
||||
"x86_64" if spec.rustc_abi != Some(RustcAbi::X86Softfloat) => {
|
||||
arg.layout.size.bits() <= 128
|
||||
// FIXME once https://github.com/bytecodealliance/wasmtime/issues/10254 is fixed
|
||||
// accept vectors up to 128bit rather than vectors of exactly 128bit.
|
||||
arg.layout.size.bits() == 128
|
||||
}
|
||||
// So far, we haven't implemented this logic for any other target.
|
||||
_ => false,
|
||||
|
||||
@@ -86,7 +86,7 @@ fn should_use_fp_conv_helper<'a, Ty, C>(
|
||||
}
|
||||
}
|
||||
},
|
||||
BackendRepr::Vector { .. } | BackendRepr::Uninhabited => return Err(CannotUseFpConv),
|
||||
BackendRepr::Vector { .. } => return Err(CannotUseFpConv),
|
||||
BackendRepr::ScalarPair(..) | BackendRepr::Memory { .. } => match arg_layout.fields {
|
||||
FieldsShape::Primitive => {
|
||||
unreachable!("aggregates can't have `FieldsShape::Primitive`")
|
||||
|
||||
@@ -108,9 +108,7 @@ fn contains_vector<'a, Ty, C>(cx: &C, layout: TyAndLayout<'a, Ty>) -> bool
|
||||
Ty: TyAbiInterface<'a, C> + Copy,
|
||||
{
|
||||
match layout.backend_repr {
|
||||
BackendRepr::Uninhabited
|
||||
| BackendRepr::Scalar(_)
|
||||
| BackendRepr::ScalarPair(..) => false,
|
||||
BackendRepr::Scalar(_) | BackendRepr::ScalarPair(..) => false,
|
||||
BackendRepr::Vector { .. } => true,
|
||||
BackendRepr::Memory { .. } => {
|
||||
for i in 0..layout.fields.count() {
|
||||
|
||||
@@ -51,8 +51,6 @@ fn classify<'a, Ty, C>(
|
||||
}
|
||||
|
||||
let mut c = match layout.backend_repr {
|
||||
BackendRepr::Uninhabited => return Ok(()),
|
||||
|
||||
BackendRepr::Scalar(scalar) => match scalar.primitive() {
|
||||
Primitive::Int(..) | Primitive::Pointer(_) => Class::Int,
|
||||
Primitive::Float(_) => Class::Sse,
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
pub(crate) fn compute_abi_info<Ty>(cx: &impl HasTargetSpec, fn_abi: &mut FnAbi<'_, Ty>) {
|
||||
let fixup = |a: &mut ArgAbi<'_, Ty>, is_ret: bool| {
|
||||
match a.layout.backend_repr {
|
||||
BackendRepr::Uninhabited | BackendRepr::Memory { sized: false } => {}
|
||||
BackendRepr::Memory { sized: false } => {}
|
||||
BackendRepr::ScalarPair(..) | BackendRepr::Memory { sized: true } => {
|
||||
match a.layout.size.bits() {
|
||||
8 => a.cast_to(Reg::i8()),
|
||||
|
||||
-40
@@ -1,45 +1,5 @@
|
||||
use object::elf;
|
||||
|
||||
use crate::spec::{Cc, LinkerFlavor, Lld, RelocModel, Target, TargetOptions};
|
||||
|
||||
/// A base target for AVR devices using the GNU toolchain.
|
||||
///
|
||||
/// Requires GNU avr-gcc and avr-binutils on the host system.
|
||||
/// FIXME: Remove the second parameter when const string concatenation is possible.
|
||||
pub(crate) fn target(target_cpu: &'static str, mmcu: &'static str) -> Target {
|
||||
Target {
|
||||
arch: "avr".into(),
|
||||
metadata: crate::spec::TargetMetadata {
|
||||
description: None,
|
||||
tier: None,
|
||||
host_tools: None,
|
||||
std: None,
|
||||
},
|
||||
data_layout: "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8".into(),
|
||||
llvm_target: "avr-unknown-unknown".into(),
|
||||
pointer_width: 16,
|
||||
options: TargetOptions {
|
||||
env: "gnu".into(),
|
||||
|
||||
c_int_width: "16".into(),
|
||||
cpu: target_cpu.into(),
|
||||
exe_suffix: ".elf".into(),
|
||||
|
||||
linker: Some("avr-gcc".into()),
|
||||
eh_frame_header: false,
|
||||
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[mmcu]),
|
||||
late_link_args: TargetOptions::link_args(
|
||||
LinkerFlavor::Gnu(Cc::Yes, Lld::No),
|
||||
&["-lgcc"],
|
||||
),
|
||||
max_atomic_width: Some(16),
|
||||
atomic_cas: false,
|
||||
relocation_model: RelocModel::Static,
|
||||
..TargetOptions::default()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
/// Resolve the value of the EF_AVR_ARCH field for AVR ELF files, given the
|
||||
/// name of the target CPU / MCU.
|
||||
///
|
||||
@@ -1,7 +1,7 @@
|
||||
pub(crate) mod aix;
|
||||
pub(crate) mod android;
|
||||
pub(crate) mod apple;
|
||||
pub(crate) mod avr_gnu;
|
||||
pub(crate) mod avr;
|
||||
pub(crate) mod bpf;
|
||||
pub(crate) mod cygwin;
|
||||
pub(crate) mod dragonfly;
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
mod base;
|
||||
mod json;
|
||||
|
||||
pub use base::avr_gnu::ef_avr_arch;
|
||||
pub use base::avr::ef_avr_arch;
|
||||
|
||||
/// Linker is called through a C/C++ compiler.
|
||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
@@ -303,15 +303,16 @@ fn infer_cli_hints(cli: LinkerFlavorCli) -> (Option<Cc>, Option<Lld>) {
|
||||
}
|
||||
}
|
||||
|
||||
fn infer_linker_hints(linker_stem: &str) -> (Option<Cc>, Option<Lld>) {
|
||||
fn infer_linker_hints(linker_stem: &str) -> Result<Self, (Option<Cc>, Option<Lld>)> {
|
||||
// Remove any version postfix.
|
||||
let stem = linker_stem
|
||||
.rsplit_once('-')
|
||||
.and_then(|(lhs, rhs)| rhs.chars().all(char::is_numeric).then_some(lhs))
|
||||
.unwrap_or(linker_stem);
|
||||
|
||||
// GCC/Clang can have an optional target prefix.
|
||||
if stem == "emcc"
|
||||
if stem == "llvm-bitcode-linker" {
|
||||
Ok(Self::Llbc)
|
||||
} else if stem == "emcc" // GCC/Clang can have an optional target prefix.
|
||||
|| stem == "gcc"
|
||||
|| stem.ends_with("-gcc")
|
||||
|| stem == "g++"
|
||||
@@ -321,7 +322,7 @@ fn infer_linker_hints(linker_stem: &str) -> (Option<Cc>, Option<Lld>) {
|
||||
|| stem == "clang++"
|
||||
|| stem.ends_with("-clang++")
|
||||
{
|
||||
(Some(Cc::Yes), Some(Lld::No))
|
||||
Err((Some(Cc::Yes), Some(Lld::No)))
|
||||
} else if stem == "wasm-ld"
|
||||
|| stem.ends_with("-wasm-ld")
|
||||
|| stem == "ld.lld"
|
||||
@@ -329,11 +330,11 @@ fn infer_linker_hints(linker_stem: &str) -> (Option<Cc>, Option<Lld>) {
|
||||
|| stem == "rust-lld"
|
||||
|| stem == "lld-link"
|
||||
{
|
||||
(Some(Cc::No), Some(Lld::Yes))
|
||||
Err((Some(Cc::No), Some(Lld::Yes)))
|
||||
} else if stem == "ld" || stem.ends_with("-ld") || stem == "link" {
|
||||
(Some(Cc::No), Some(Lld::No))
|
||||
Err((Some(Cc::No), Some(Lld::No)))
|
||||
} else {
|
||||
(None, None)
|
||||
Err((None, None))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -357,7 +358,10 @@ pub fn with_cli_hints(self, cli: LinkerFlavorCli) -> LinkerFlavor {
|
||||
}
|
||||
|
||||
pub fn with_linker_hints(self, linker_stem: &str) -> LinkerFlavor {
|
||||
self.with_hints(LinkerFlavor::infer_linker_hints(linker_stem))
|
||||
match LinkerFlavor::infer_linker_hints(linker_stem) {
|
||||
Ok(linker_flavor) => linker_flavor,
|
||||
Err(hints) => self.with_hints(hints),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn check_compatibility(self, cli: LinkerFlavorCli) -> Option<String> {
|
||||
@@ -1797,7 +1801,7 @@ fn $module() {
|
||||
("riscv64gc-unknown-fuchsia", riscv64gc_unknown_fuchsia),
|
||||
("x86_64-unknown-fuchsia", x86_64_unknown_fuchsia),
|
||||
|
||||
("avr-unknown-gnu-atmega328", avr_unknown_gnu_atmega328),
|
||||
("avr-none", avr_none),
|
||||
|
||||
("x86_64-unknown-l4re-uclibc", x86_64_unknown_l4re_uclibc),
|
||||
|
||||
@@ -2001,7 +2005,7 @@ fn $module() {
|
||||
("x86_64-pc-nto-qnx710", x86_64_pc_nto_qnx710),
|
||||
("x86_64-pc-nto-qnx710_iosock", x86_64_pc_nto_qnx710_iosock),
|
||||
("x86_64-pc-nto-qnx800", x86_64_pc_nto_qnx800),
|
||||
("i586-pc-nto-qnx700", i586_pc_nto_qnx700),
|
||||
("i686-pc-nto-qnx700", i686_pc_nto_qnx700),
|
||||
|
||||
("aarch64-unknown-linux-ohos", aarch64_unknown_linux_ohos),
|
||||
("armv7-unknown-linux-ohos", armv7_unknown_linux_ohos),
|
||||
@@ -3062,7 +3066,10 @@ macro_rules! check_matches {
|
||||
&self.post_link_args,
|
||||
] {
|
||||
for (&flavor, flavor_args) in args {
|
||||
check!(!flavor_args.is_empty(), "linker flavor args must not be empty");
|
||||
check!(
|
||||
!flavor_args.is_empty() || self.arch == "avr",
|
||||
"linker flavor args must not be empty"
|
||||
);
|
||||
// Check that flavors mentioned in link args are compatible with the default flavor.
|
||||
match self.linker_flavor {
|
||||
LinkerFlavor::Gnu(..) => {
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
use crate::spec::{Cc, LinkerFlavor, Lld, RelocModel, Target, TargetOptions};
|
||||
|
||||
pub(crate) fn target() -> Target {
|
||||
Target {
|
||||
arch: "avr".into(),
|
||||
metadata: crate::spec::TargetMetadata {
|
||||
description: None,
|
||||
tier: None,
|
||||
host_tools: None,
|
||||
std: None,
|
||||
},
|
||||
data_layout: "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8".into(),
|
||||
llvm_target: "avr-unknown-unknown".into(),
|
||||
pointer_width: 16,
|
||||
options: TargetOptions {
|
||||
c_int_width: "16".into(),
|
||||
exe_suffix: ".elf".into(),
|
||||
linker: Some("avr-gcc".into()),
|
||||
eh_frame_header: false,
|
||||
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[]),
|
||||
late_link_args: TargetOptions::link_args(
|
||||
LinkerFlavor::Gnu(Cc::Yes, Lld::No),
|
||||
&["-lgcc"],
|
||||
),
|
||||
max_atomic_width: Some(16),
|
||||
atomic_cas: false,
|
||||
relocation_model: RelocModel::Static,
|
||||
need_explicit_cpu: true,
|
||||
..TargetOptions::default()
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
use crate::spec::{Target, base};
|
||||
|
||||
pub(crate) fn target() -> Target {
|
||||
base::avr_gnu::target("atmega328", "-mmcu=atmega328")
|
||||
}
|
||||
@@ -464,7 +464,7 @@ fn fn_arg_sanity_check<'tcx>(
|
||||
|
||||
match &arg.mode {
|
||||
PassMode::Ignore => {
|
||||
assert!(arg.layout.is_zst() || arg.layout.is_uninhabited());
|
||||
assert!(arg.layout.is_zst());
|
||||
}
|
||||
PassMode::Direct(_) => {
|
||||
// Here the Rust type is used to determine the actual ABI, so we have to be very
|
||||
@@ -472,9 +472,7 @@ fn fn_arg_sanity_check<'tcx>(
|
||||
// `layout.backend_repr` and ignore everything else. We should just reject
|
||||
//`Aggregate` entirely here, but some targets need to be fixed first.
|
||||
match arg.layout.backend_repr {
|
||||
BackendRepr::Uninhabited
|
||||
| BackendRepr::Scalar(_)
|
||||
| BackendRepr::Vector { .. } => {}
|
||||
BackendRepr::Scalar(_) | BackendRepr::Vector { .. } => {}
|
||||
BackendRepr::ScalarPair(..) => {
|
||||
panic!("`PassMode::Direct` used for ScalarPair type {}", arg.layout.ty)
|
||||
}
|
||||
|
||||
@@ -348,19 +348,17 @@ fn layout_of_uncached<'tcx>(
|
||||
.checked_mul(count, dl)
|
||||
.ok_or_else(|| error(cx, LayoutError::SizeOverflow(ty)))?;
|
||||
|
||||
let abi = if count != 0 && ty.is_privately_uninhabited(tcx, cx.typing_env) {
|
||||
BackendRepr::Uninhabited
|
||||
} else {
|
||||
BackendRepr::Memory { sized: true }
|
||||
};
|
||||
let abi = BackendRepr::Memory { sized: true };
|
||||
|
||||
let largest_niche = if count != 0 { element.largest_niche } else { None };
|
||||
let uninhabited = if count != 0 { element.uninhabited } else { false };
|
||||
|
||||
tcx.mk_layout(LayoutData {
|
||||
variants: Variants::Single { index: FIRST_VARIANT },
|
||||
fields: FieldsShape::Array { stride: element.size, count },
|
||||
backend_repr: abi,
|
||||
largest_niche,
|
||||
uninhabited,
|
||||
align: element.align,
|
||||
size,
|
||||
max_repr_align: None,
|
||||
@@ -375,6 +373,7 @@ fn layout_of_uncached<'tcx>(
|
||||
fields: FieldsShape::Array { stride: element.size, count: 0 },
|
||||
backend_repr: BackendRepr::Memory { sized: false },
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
align: element.align,
|
||||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
@@ -390,6 +389,7 @@ fn layout_of_uncached<'tcx>(
|
||||
fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
|
||||
backend_repr: BackendRepr::Memory { sized: false },
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
align: dl.i8_align,
|
||||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
@@ -555,6 +555,7 @@ fn layout_of_uncached<'tcx>(
|
||||
fields,
|
||||
backend_repr: abi,
|
||||
largest_niche: e_ly.largest_niche,
|
||||
uninhabited: false,
|
||||
size,
|
||||
align,
|
||||
max_repr_align: None,
|
||||
@@ -1014,13 +1015,8 @@ fn coroutine_layout<'tcx>(
|
||||
|
||||
size = size.align_to(align.abi);
|
||||
|
||||
let abi = if prefix.backend_repr.is_uninhabited()
|
||||
|| variants.iter().all(|v| v.backend_repr.is_uninhabited())
|
||||
{
|
||||
BackendRepr::Uninhabited
|
||||
} else {
|
||||
BackendRepr::Memory { sized: true }
|
||||
};
|
||||
let uninhabited = prefix.uninhabited || variants.iter().all(|v| v.is_uninhabited());
|
||||
let abi = BackendRepr::Memory { sized: true };
|
||||
|
||||
// this is similar to how ReprOptions populates its field_shuffle_seed
|
||||
let def_hash = tcx.def_path_hash(def_id).0.to_smaller_hash();
|
||||
@@ -1041,6 +1037,7 @@ fn coroutine_layout<'tcx>(
|
||||
// See <https://github.com/rust-lang/rust/issues/63818>, <https://github.com/rust-lang/miri/issues/3780>.
|
||||
// FIXME: Remove when <https://github.com/rust-lang/rust/issues/125735> is implemented and aliased coroutine fields are wrapped in `UnsafePinned`.
|
||||
largest_niche: None,
|
||||
uninhabited,
|
||||
size,
|
||||
align,
|
||||
max_repr_align: None,
|
||||
|
||||
@@ -10,7 +10,11 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou
|
||||
|
||||
// Type-level uninhabitedness should always imply ABI uninhabitedness.
|
||||
if layout.ty.is_privately_uninhabited(tcx, cx.typing_env) {
|
||||
assert!(layout.is_uninhabited());
|
||||
assert!(
|
||||
layout.is_uninhabited(),
|
||||
"{:?} is type-level uninhabited but not ABI-uninhabited?",
|
||||
layout.ty
|
||||
);
|
||||
}
|
||||
|
||||
if layout.size.bytes() % layout.align.abi.bytes() != 0 {
|
||||
@@ -71,7 +75,7 @@ fn check_layout_abi<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayout<'tcx>) {
|
||||
let Some((align, size)) = align.zip(size) else {
|
||||
assert_matches!(
|
||||
layout.layout.backend_repr(),
|
||||
BackendRepr::Uninhabited | BackendRepr::Memory { .. },
|
||||
BackendRepr::Memory { .. },
|
||||
"ABI unexpectedly missing alignment and/or size in {layout:#?}"
|
||||
);
|
||||
return;
|
||||
@@ -235,7 +239,7 @@ fn check_layout_abi<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayout<'tcx>) {
|
||||
assert!(align >= element.align(cx).abi); // just sanity-checking `vector_align`.
|
||||
// FIXME: Do some kind of check of the inner type, like for Scalar and ScalarPair.
|
||||
}
|
||||
BackendRepr::Uninhabited | BackendRepr::Memory { .. } => {} // Nothing to check.
|
||||
BackendRepr::Memory { .. } => {} // Nothing to check.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -291,8 +295,8 @@ fn check_layout_abi<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayout<'tcx>) {
|
||||
|| variant.is_uninhabited()
|
||||
{
|
||||
// These are never actually accessed anyway, so we can skip the coherence check
|
||||
// for them. They also fail that check, since they have
|
||||
// `Aggregate`/`Uninhabited` ABI even when the main type is
|
||||
// for them. They also fail that check, since they may have
|
||||
// a different ABI even when the main type is
|
||||
// `Scalar`/`ScalarPair`. (Note that sometimes, variants with fields have size
|
||||
// 0, and sometimes, variants without fields have non-0 size.)
|
||||
continue;
|
||||
@@ -306,7 +310,6 @@ fn check_layout_abi<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayout<'tcx>) {
|
||||
(BackendRepr::ScalarPair(a1, b1), BackendRepr::ScalarPair(a2, b2)) => {
|
||||
scalar_coherent(a1, a2) && scalar_coherent(b1, b2)
|
||||
}
|
||||
(BackendRepr::Uninhabited, _) => true,
|
||||
(BackendRepr::Memory { .. }, _) => true,
|
||||
_ => false,
|
||||
};
|
||||
|
||||
@@ -227,7 +227,6 @@ pub enum TagEncoding {
|
||||
/// in terms of categories of C types there are ABI rules for.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize)]
|
||||
pub enum ValueAbi {
|
||||
Uninhabited,
|
||||
Scalar(Scalar),
|
||||
ScalarPair(Scalar, Scalar),
|
||||
Vector {
|
||||
@@ -244,10 +243,7 @@ impl ValueAbi {
|
||||
/// Returns `true` if the layout corresponds to an unsized type.
|
||||
pub fn is_unsized(&self) -> bool {
|
||||
match *self {
|
||||
ValueAbi::Uninhabited
|
||||
| ValueAbi::Scalar(_)
|
||||
| ValueAbi::ScalarPair(..)
|
||||
| ValueAbi::Vector { .. } => false,
|
||||
ValueAbi::Scalar(_) | ValueAbi::ScalarPair(..) | ValueAbi::Vector { .. } => false,
|
||||
ValueAbi::Aggregate { sized } => !sized,
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -793,12 +793,12 @@
|
||||
# C compiler to be used to compile C code. Note that the
|
||||
# default value is platform specific, and if not specified it may also depend on
|
||||
# what platform is crossing to what platform.
|
||||
# See `src/bootstrap/cc_detect.rs` for details.
|
||||
# See `src/bootstrap/src/utils/cc_detect.rs` for details.
|
||||
#cc = "cc" (path)
|
||||
|
||||
# C++ compiler to be used to compile C++ code (e.g. LLVM and our LLVM shims).
|
||||
# This is only used for host targets.
|
||||
# See `src/bootstrap/cc_detect.rs` for details.
|
||||
# See `src/bootstrap/src/utils/cc_detect.rs` for details.
|
||||
#cxx = "c++" (path)
|
||||
|
||||
# Archiver to be used to assemble static libraries compiled from C/C++ code.
|
||||
|
||||
@@ -163,14 +163,14 @@ pub const fn midpoint(self, rhs: $SelfT) -> $SelfT {
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(num_midpoint_signed)]
|
||||
#[doc = concat!("assert_eq!(0", stringify!($SelfT), ".midpoint(4), 2);")]
|
||||
#[doc = concat!("assert_eq!((-1", stringify!($SelfT), ").midpoint(2), 0);")]
|
||||
#[doc = concat!("assert_eq!((-7", stringify!($SelfT), ").midpoint(0), -3);")]
|
||||
#[doc = concat!("assert_eq!(0", stringify!($SelfT), ".midpoint(-7), -3);")]
|
||||
#[doc = concat!("assert_eq!(0", stringify!($SelfT), ".midpoint(7), 3);")]
|
||||
/// ```
|
||||
#[unstable(feature = "num_midpoint_signed", issue = "110840")]
|
||||
#[stable(feature = "num_midpoint_signed", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[rustc_const_stable(feature = "num_midpoint_signed", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
@@ -215,14 +215,14 @@ pub const fn midpoint(self, rhs: $SelfT) -> $SelfT {
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(num_midpoint_signed)]
|
||||
#[doc = concat!("assert_eq!(0", stringify!($SelfT), ".midpoint(4), 2);")]
|
||||
#[doc = concat!("assert_eq!((-1", stringify!($SelfT), ").midpoint(2), 0);")]
|
||||
#[doc = concat!("assert_eq!((-7", stringify!($SelfT), ").midpoint(0), -3);")]
|
||||
#[doc = concat!("assert_eq!(0", stringify!($SelfT), ".midpoint(-7), -3);")]
|
||||
#[doc = concat!("assert_eq!(0", stringify!($SelfT), ".midpoint(7), 3);")]
|
||||
/// ```
|
||||
#[unstable(feature = "num_midpoint_signed", issue = "110840")]
|
||||
#[stable(feature = "num_midpoint_signed", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[rustc_const_stable(feature = "num_midpoint_signed", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
||||
@@ -63,7 +63,6 @@
|
||||
#![feature(maybe_uninit_write_slice)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(never_type)]
|
||||
#![feature(num_midpoint_signed)]
|
||||
#![feature(numfmt)]
|
||||
#![feature(pattern)]
|
||||
#![feature(pointer_is_aligned_to)]
|
||||
|
||||
@@ -204,7 +204,7 @@ pub fn NtCreateKeyedEvent(
|
||||
pub fn NtReleaseKeyedEvent(
|
||||
EventHandle: HANDLE,
|
||||
Key: *const c_void,
|
||||
Alertable: BOOLEAN,
|
||||
Alertable: bool,
|
||||
Timeout: *mut i64
|
||||
) -> NTSTATUS {
|
||||
panic!("keyed events not available")
|
||||
@@ -213,7 +213,7 @@ pub fn NtReleaseKeyedEvent(
|
||||
pub fn NtWaitForKeyedEvent(
|
||||
EventHandle: HANDLE,
|
||||
Key: *const c_void,
|
||||
Alertable: BOOLEAN,
|
||||
Alertable: bool,
|
||||
Timeout: *mut i64
|
||||
) -> NTSTATUS {
|
||||
panic!("keyed events not available")
|
||||
|
||||
@@ -14,7 +14,7 @@ pub fn fill_bytes(mut bytes: &mut [u8]) {
|
||||
while !bytes.is_empty() {
|
||||
let len = bytes.len().try_into().unwrap_or(u32::MAX);
|
||||
let ret = unsafe { c::RtlGenRandom(bytes.as_mut_ptr().cast(), len) };
|
||||
assert_ne!(ret, 0, "failed to generate random data");
|
||||
assert!(ret, "failed to generate random data");
|
||||
bytes = &mut bytes[len as usize..];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ pub fn lock(&self) {
|
||||
|
||||
#[inline]
|
||||
pub fn try_lock(&self) -> bool {
|
||||
unsafe { c::TryAcquireSRWLockExclusive(raw(self)) != 0 }
|
||||
unsafe { c::TryAcquireSRWLockExclusive(raw(self)) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
||||
@@ -195,7 +195,7 @@ mod keyed_events {
|
||||
|
||||
pub unsafe fn park(parker: Pin<&Parker>) {
|
||||
// Wait for unpark() to produce this event.
|
||||
c::NtWaitForKeyedEvent(keyed_event_handle(), parker.ptr(), 0, ptr::null_mut());
|
||||
c::NtWaitForKeyedEvent(keyed_event_handle(), parker.ptr(), false, ptr::null_mut());
|
||||
// Set the state back to EMPTY (from either PARKED or NOTIFIED).
|
||||
// Note that we don't just write EMPTY, but use swap() to also
|
||||
// include an acquire-ordered read to synchronize with unpark()'s
|
||||
@@ -218,7 +218,7 @@ pub unsafe fn park_timeout(parker: Pin<&Parker>, timeout: Duration) {
|
||||
|
||||
// Wait for unpark() to produce this event.
|
||||
let unparked =
|
||||
c::NtWaitForKeyedEvent(handle, parker.ptr(), 0, &mut timeout) == c::STATUS_SUCCESS;
|
||||
c::NtWaitForKeyedEvent(handle, parker.ptr(), false, &mut timeout) == c::STATUS_SUCCESS;
|
||||
|
||||
// Set the state back to EMPTY (from either PARKED or NOTIFIED).
|
||||
let prev_state = parker.state.swap(EMPTY, Acquire);
|
||||
@@ -228,7 +228,7 @@ pub unsafe fn park_timeout(parker: Pin<&Parker>, timeout: Duration) {
|
||||
// was set to NOTIFIED, which means we *just* missed an
|
||||
// unpark(), which is now blocked on us to wait for it.
|
||||
// Wait for it to consume the event and unblock that thread.
|
||||
c::NtWaitForKeyedEvent(handle, parker.ptr(), 0, ptr::null_mut());
|
||||
c::NtWaitForKeyedEvent(handle, parker.ptr(), false, ptr::null_mut());
|
||||
}
|
||||
}
|
||||
pub unsafe fn unpark(parker: Pin<&Parker>) {
|
||||
@@ -239,7 +239,7 @@ pub unsafe fn unpark(parker: Pin<&Parker>) {
|
||||
// To prevent this thread from blocking indefinitely in that case,
|
||||
// park_impl() will, after seeing the state set to NOTIFIED after
|
||||
// waking up, call NtWaitForKeyedEvent again to unblock us.
|
||||
c::NtReleaseKeyedEvent(keyed_event_handle(), parker.ptr(), 0, ptr::null_mut());
|
||||
c::NtReleaseKeyedEvent(keyed_event_handle(), parker.ptr(), false, ptr::null_mut());
|
||||
}
|
||||
|
||||
fn keyed_event_handle() -> c::HANDLE {
|
||||
|
||||
@@ -1029,6 +1029,17 @@ fn run(self, builder: &Builder<'_>) -> GeneratedTarball {
|
||||
],
|
||||
plain_dst_src,
|
||||
);
|
||||
// We keep something in src/gcc because it is a registered submodule,
|
||||
// and if it misses completely it can cause issues elsewhere
|
||||
// (see https://github.com/rust-lang/rust/issues/137332).
|
||||
// We can also let others know why is the source code missing.
|
||||
if !builder.config.dry_run() {
|
||||
builder.create_dir(&plain_dst_src.join("src/gcc"));
|
||||
t!(std::fs::write(
|
||||
plain_dst_src.join("src/gcc/notice.txt"),
|
||||
"The GCC source code is not included due to unclear licensing implications\n"
|
||||
));
|
||||
}
|
||||
|
||||
// Copy the files normally
|
||||
for item in &src_files {
|
||||
|
||||
@@ -2767,7 +2767,7 @@ pub fn git_config(&self) -> GitConfig<'_> {
|
||||
),
|
||||
)]
|
||||
pub(crate) fn update_submodule(&self, relative_path: &str) {
|
||||
if !self.submodules() {
|
||||
if self.rust_info.is_from_tarball() || !self.submodules() {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -481,6 +481,10 @@ pub fn new(mut config: Config) -> Build {
|
||||
),
|
||||
)]
|
||||
pub fn require_submodule(&self, submodule: &str, err_hint: Option<&str>) {
|
||||
if self.rust_info().is_from_tarball() {
|
||||
return;
|
||||
}
|
||||
|
||||
// When testing bootstrap itself, it is much faster to ignore
|
||||
// submodules. Almost all Steps work fine without their submodules.
|
||||
if cfg!(test) && !self.config.submodules() {
|
||||
@@ -488,7 +492,7 @@ pub fn require_submodule(&self, submodule: &str, err_hint: Option<&str>) {
|
||||
}
|
||||
self.config.update_submodule(submodule);
|
||||
let absolute_path = self.config.src.join(submodule);
|
||||
if dir_is_empty(&absolute_path) {
|
||||
if !absolute_path.exists() || dir_is_empty(&absolute_path) {
|
||||
let maybe_enable = if !self.config.submodules()
|
||||
&& self.config.rust_info.is_managed_git_subrepository()
|
||||
{
|
||||
|
||||
@@ -301,7 +301,7 @@ target | std | host | notes
|
||||
[`armv8r-none-eabihf`](platform-support/armv8r-none-eabihf.md) | * | | Bare Armv8-R, hardfloat
|
||||
[`armv7a-nuttx-eabi`](platform-support/nuttx.md) | ✓ | | ARMv7-A with NuttX
|
||||
[`armv7a-nuttx-eabihf`](platform-support/nuttx.md) | ✓ | | ARMv7-A with NuttX, hardfloat
|
||||
`avr-unknown-gnu-atmega328` | * | | AVR. Requires `-Z build-std=core`
|
||||
`avr-none` | * | | AVR; requires `-Zbuild-std=core` and `-Ctarget-cpu=...`
|
||||
`bpfeb-unknown-none` | * | | BPF (big endian)
|
||||
`bpfel-unknown-none` | * | | BPF (little endian)
|
||||
`csky-unknown-linux-gnuabiv2` | ✓ | | C-SKY abiv2 Linux (little endian)
|
||||
@@ -309,10 +309,10 @@ target | std | host | notes
|
||||
[`hexagon-unknown-linux-musl`](platform-support/hexagon-unknown-linux-musl.md) | ✓ | | Hexagon Linux with musl 1.2.3
|
||||
[`hexagon-unknown-none-elf`](platform-support/hexagon-unknown-none-elf.md)| * | | Bare Hexagon (v60+, HVX)
|
||||
[`i386-apple-ios`](platform-support/apple-ios.md) | ✓ | | 32-bit x86 iOS (Penryn) [^x86_32-floats-return-ABI]
|
||||
[`i586-pc-nto-qnx700`](platform-support/nto-qnx.md) | * | | 32-bit x86 QNX Neutrino 7.0 RTOS (Pentium 4) [^x86_32-floats-return-ABI]
|
||||
[`i586-unknown-netbsd`](platform-support/netbsd.md) | ✓ | | 32-bit x86 (original Pentium) [^x86_32-floats-x87]
|
||||
[`i586-unknown-redox`](platform-support/redox.md) | ✓ | | 32-bit x86 Redox OS (PentiumPro) [^x86_32-floats-x87]
|
||||
[`i686-apple-darwin`](platform-support/apple-darwin.md) | ✓ | ✓ | 32-bit macOS (10.12+, Sierra+, Penryn) [^x86_32-floats-return-ABI]
|
||||
[`i686-pc-nto-qnx700`](platform-support/nto-qnx.md) | * | | 32-bit x86 QNX Neutrino 7.0 RTOS (Pentium 4) [^x86_32-floats-return-ABI]
|
||||
`i686-unknown-haiku` | ✓ | ✓ | 32-bit Haiku (Pentium 4) [^x86_32-floats-return-ABI]
|
||||
[`i686-unknown-hurd-gnu`](platform-support/hurd.md) | ✓ | ✓ | 32-bit GNU/Hurd (Pentium 4) [^x86_32-floats-return-ABI]
|
||||
[`i686-unknown-netbsd`](platform-support/netbsd.md) | ✓ | ✓ | NetBSD/i386 (Pentium 4) [^x86_32-floats-return-ABI]
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
# `avr-none`
|
||||
|
||||
Series of microcontrollers from Atmel: ATmega8, ATmega328p etc.
|
||||
|
||||
**Tier: 3**
|
||||
|
||||
## Target maintainers
|
||||
|
||||
- [Patryk Wychowaniec](https://github.com/Patryk27) <pwychowaniec@pm.me>
|
||||
|
||||
## Requirements
|
||||
|
||||
This target is only cross-compiled; x86-64 Linux, x86-64 macOS and aarch64 macOS
|
||||
hosts are confirmed to work, but in principle any machine able to run rustc and
|
||||
avr-gcc should be good.
|
||||
|
||||
Compiling for this target requires `avr-gcc` installed, because a couple of
|
||||
intrinsics (like 32-bit multiplication) rely on [`libgcc`](https://github.com/gcc-mirror/gcc/blob/3269a722b7a03613e9c4e2862bc5088c4a17cc11/libgcc/config/avr/lib1funcs.S)
|
||||
and can't be provided through `compiler-builtins` yet. This is a limitation that
|
||||
[we hope to lift in the future](https://github.com/rust-lang/compiler-builtins/issues/711).
|
||||
|
||||
You'll also need to setup the `.cargo/config` file - see below for details.
|
||||
|
||||
## Building the target
|
||||
|
||||
Rust comes with AVR support enabled, you don't have to rebuild the compiler.
|
||||
|
||||
## Building Rust programs
|
||||
|
||||
Install `avr-gcc`:
|
||||
|
||||
```console
|
||||
# Ubuntu:
|
||||
$ sudo apt-get install gcc-avr
|
||||
|
||||
# Mac:
|
||||
$ brew tap osx-cross/avr && brew install avr-gcc
|
||||
|
||||
# NixOS (takes a couple of minutes, since it's not provided through Hydra):
|
||||
$ nix shell nixpkgs#pkgsCross.avr.buildPackages.gcc11
|
||||
```
|
||||
|
||||
... setup `.cargo/config` for your project:
|
||||
|
||||
```toml
|
||||
[build]
|
||||
target = "avr-none"
|
||||
rustflags = ["-C", "target-cpu=atmega328p"]
|
||||
|
||||
[unstable]
|
||||
build-std = ["core"]
|
||||
```
|
||||
|
||||
... and then simply run:
|
||||
|
||||
```console
|
||||
$ cargo build --release
|
||||
```
|
||||
|
||||
The final binary will be placed into
|
||||
`./target/avr-none/release/your-project.elf`.
|
||||
|
||||
Note that since AVRs have rather small amounts of registers, ROM and RAM, it's
|
||||
recommended to always use `--release` to avoid running out of space.
|
||||
|
||||
Also, please note that specifying `-C target-cpu` is required - here's a list of
|
||||
the possible variants:
|
||||
|
||||
https://github.com/llvm/llvm-project/blob/093d4db2f3c874d4683fb01194b00dbb20e5c713/clang/lib/Basic/Targets/AVR.cpp#L32
|
||||
|
||||
## Testing
|
||||
|
||||
You can use [`simavr`](https://github.com/buserror/simavr) to emulate the
|
||||
resulting firmware on your machine:
|
||||
|
||||
```console
|
||||
$ simavr -m atmega328p ./target/avr-none/release/your-project.elf
|
||||
```
|
||||
|
||||
Alternatively, if you want to write a couple of actual `#[test]`s, you can use
|
||||
[`avr-tester`](https://github.com/Patryk27/avr-tester).
|
||||
@@ -31,7 +31,7 @@ Currently, the following QNX versions and compilation targets are supported:
|
||||
| `aarch64-unknown-nto-qnx710_iosock` | QNX Neutrino 7.1 with io-sock | AArch64 | ? | ✓ |
|
||||
| `x86_64-pc-nto-qnx710_iosock` | QNX Neutrino 7.1 with io-sock | x86_64 | ? | ✓ |
|
||||
| `aarch64-unknown-nto-qnx700` | QNX Neutrino 7.0 | AArch64 | ? | ✓ |
|
||||
| `i586-pc-nto-qnx700` | QNX Neutrino 7.0 | x86 | | ✓ |
|
||||
| `i686-pc-nto-qnx700` | QNX Neutrino 7.0 | x86 | | ✓ |
|
||||
|
||||
On QNX Neutrino 7.0 and 7.1, `io-pkt` is used as network stack by default.
|
||||
QNX Neutrino 7.1 includes the optional network stack `io-sock`.
|
||||
|
||||
@@ -129,6 +129,8 @@ As of the time of this writing the proposals that are enabled by default (the
|
||||
* `mutable-globals`
|
||||
* `reference-types`
|
||||
* `sign-ext`
|
||||
* `nontrapping-fptoint` (Rust 1.87.0+, LLVM 20+)
|
||||
* `bulk-memory` (Rust 1.87.0+, LLVM 20+)
|
||||
|
||||
If you're compiling WebAssembly code for an engine that does not support a
|
||||
feature in LLVM's default feature set then the feature must be disabled at
|
||||
|
||||
@@ -465,7 +465,10 @@ fn profiler_runtime() {
|
||||
#[test]
|
||||
fn asm_support() {
|
||||
let asms = [
|
||||
#[cfg(bootstrap)]
|
||||
("avr-unknown-gnu-atmega328", false),
|
||||
#[cfg(not(bootstrap))]
|
||||
("avr-none", false),
|
||||
("i686-unknown-netbsd", true),
|
||||
("riscv32gc-unknown-linux-gnu", true),
|
||||
("riscv64imac-unknown-none-elf", true),
|
||||
|
||||
@@ -27,6 +27,10 @@ pub struct Args {
|
||||
#[arg(long)]
|
||||
target_cpu: Option<String>,
|
||||
|
||||
/// The target features
|
||||
#[arg(long)]
|
||||
target_feature: Option<String>,
|
||||
|
||||
/// Write output to the filename
|
||||
#[arg(short, long)]
|
||||
output: PathBuf,
|
||||
@@ -49,7 +53,7 @@ fn main() -> anyhow::Result<()> {
|
||||
|
||||
let args = Args::parse();
|
||||
|
||||
let mut linker = Session::new(args.target, args.target_cpu, args.output);
|
||||
let mut linker = Session::new(args.target, args.target_cpu, args.target_feature, args.output);
|
||||
|
||||
linker.add_exported_symbols(args.export_symbol);
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
pub struct Session {
|
||||
target: Target,
|
||||
cpu: Option<String>,
|
||||
feature: Option<String>,
|
||||
symbols: Vec<String>,
|
||||
|
||||
/// A file that `llvm-link` supports, like a bitcode file or an archive.
|
||||
@@ -21,7 +22,12 @@ pub struct Session {
|
||||
}
|
||||
|
||||
impl Session {
|
||||
pub fn new(target: crate::Target, cpu: Option<String>, out_path: PathBuf) -> Self {
|
||||
pub fn new(
|
||||
target: crate::Target,
|
||||
cpu: Option<String>,
|
||||
feature: Option<String>,
|
||||
out_path: PathBuf,
|
||||
) -> Self {
|
||||
let link_path = out_path.with_extension("o");
|
||||
let opt_path = out_path.with_extension("optimized.o");
|
||||
let sym_path = out_path.with_extension("symbols.txt");
|
||||
@@ -29,6 +35,7 @@ pub fn new(target: crate::Target, cpu: Option<String>, out_path: PathBuf) -> Sel
|
||||
Session {
|
||||
target,
|
||||
cpu,
|
||||
feature,
|
||||
symbols: Vec::new(),
|
||||
files: Vec::new(),
|
||||
link_path,
|
||||
@@ -134,6 +141,10 @@ fn compile(&mut self) -> anyhow::Result<()> {
|
||||
lcc_command.arg("--mcpu").arg(mcpu);
|
||||
}
|
||||
|
||||
if let Some(mattr) = &self.feature {
|
||||
lcc_command.arg(&format!("--mattr={}", mattr));
|
||||
}
|
||||
|
||||
let lcc_output = lcc_command
|
||||
.arg(&self.opt_path)
|
||||
.arg("-o").arg(&self.out_path)
|
||||
|
||||
@@ -253,6 +253,13 @@ pub fn target<S: AsRef<str>>(&mut self, target: S) -> &mut Self {
|
||||
self
|
||||
}
|
||||
|
||||
/// Specify the target CPU.
|
||||
pub fn target_cpu<S: AsRef<str>>(&mut self, target_cpu: S) -> &mut Self {
|
||||
let target_cpu = target_cpu.as_ref();
|
||||
self.cmd.arg(format!("-Ctarget-cpu={target_cpu}"));
|
||||
self
|
||||
}
|
||||
|
||||
/// Specify the crate type.
|
||||
pub fn crate_type(&mut self, crate_type: &str) -> &mut Self {
|
||||
self.cmd.arg("--crate-type");
|
||||
|
||||
@@ -194,6 +194,7 @@ fn layout_of_simd_ty(
|
||||
fields,
|
||||
backend_repr: BackendRepr::Vector { element: e_abi, count: e_len },
|
||||
largest_niche: e_ly.largest_niche,
|
||||
uninhabited: false,
|
||||
size,
|
||||
align,
|
||||
max_repr_align: None,
|
||||
@@ -297,20 +298,17 @@ pub fn layout_of_ty_query(
|
||||
.checked_mul(count, dl)
|
||||
.ok_or(LayoutError::BadCalc(LayoutCalculatorError::SizeOverflow))?;
|
||||
|
||||
let backend_repr =
|
||||
if count != 0 && matches!(element.backend_repr, BackendRepr::Uninhabited) {
|
||||
BackendRepr::Uninhabited
|
||||
} else {
|
||||
BackendRepr::Memory { sized: true }
|
||||
};
|
||||
let backend_repr = BackendRepr::Memory { sized: true };
|
||||
|
||||
let largest_niche = if count != 0 { element.largest_niche } else { None };
|
||||
let uninhabited = if count != 0 { element.uninhabited } else { false };
|
||||
|
||||
Layout {
|
||||
variants: Variants::Single { index: struct_variant_idx() },
|
||||
fields: FieldsShape::Array { stride: element.size, count },
|
||||
backend_repr,
|
||||
largest_niche,
|
||||
uninhabited,
|
||||
align: element.align,
|
||||
size,
|
||||
max_repr_align: None,
|
||||
@@ -325,6 +323,7 @@ pub fn layout_of_ty_query(
|
||||
fields: FieldsShape::Array { stride: element.size, count: 0 },
|
||||
backend_repr: BackendRepr::Memory { sized: false },
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
align: element.align,
|
||||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
@@ -337,6 +336,7 @@ pub fn layout_of_ty_query(
|
||||
fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
|
||||
backend_repr: BackendRepr::Memory { sized: false },
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
align: dl.i8_align,
|
||||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
"xtensa_esp32s2_espidf",
|
||||
"xtensa_esp32s3_none_elf",
|
||||
"xtensa_esp32s3_espidf",
|
||||
"i586_pc_nto_qnx700", // Renamed to i686-pc-nto-qnx700, see https://github.com/rust-lang/rust/issues/136495
|
||||
];
|
||||
|
||||
pub fn check(root_path: &Path, bad: &mut bool) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//@ add-core-stubs
|
||||
//@ assembly-output: emit-asm
|
||||
//@ compile-flags: --target avr-unknown-gnu-atmega328
|
||||
//@ compile-flags: --target avr-none -C target-cpu=atmega328p
|
||||
//@ needs-llvm-components: avr
|
||||
|
||||
#![feature(no_core, asm_experimental_arch)]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//@ add-core-stubs
|
||||
//@ assembly-output: emit-asm
|
||||
//@ compile-flags: --target avr-unknown-gnu-atmega328
|
||||
//@ compile-flags: --target avr-none -C target-cpu=atmega328p
|
||||
//@ needs-llvm-components: avr
|
||||
|
||||
#![feature(no_core, asm_experimental_arch)]
|
||||
|
||||
@@ -216,9 +216,9 @@
|
||||
//@ revisions: hexagon_unknown_none_elf
|
||||
//@ [hexagon_unknown_none_elf] compile-flags: --target hexagon-unknown-none-elf
|
||||
//@ [hexagon_unknown_none_elf] needs-llvm-components: hexagon
|
||||
//@ revisions: i586_pc_nto_qnx700
|
||||
//@ [i586_pc_nto_qnx700] compile-flags: --target i586-pc-nto-qnx700
|
||||
//@ [i586_pc_nto_qnx700] needs-llvm-components: x86
|
||||
//@ revisions: i686_pc_nto_qnx700
|
||||
//@ [i686_pc_nto_qnx700] compile-flags: --target i686-pc-nto-qnx700
|
||||
//@ [i686_pc_nto_qnx700] needs-llvm-components: x86
|
||||
//@ revisions: i586_unknown_linux_gnu
|
||||
//@ [i586_unknown_linux_gnu] compile-flags: --target i586-unknown-linux-gnu
|
||||
//@ [i586_unknown_linux_gnu] needs-llvm-components: x86
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
//@ revisions: arm64ec_pc_windows_msvc
|
||||
//@ [arm64ec_pc_windows_msvc] compile-flags: --target arm64ec-pc-windows-msvc
|
||||
//@ [arm64ec_pc_windows_msvc] needs-llvm-components: aarch64
|
||||
//@ revisions: avr_unknown_gnu_atmega328
|
||||
//@ [avr_unknown_gnu_atmega328] compile-flags: --target avr-unknown-gnu-atmega328
|
||||
//@ [avr_unknown_gnu_atmega328] needs-llvm-components: avr
|
||||
//@ revisions: avr_none
|
||||
//@ [avr_none] compile-flags: --target avr-none -C target-cpu=atmega328p
|
||||
//@ [avr_none] needs-llvm-components: avr
|
||||
//@ revisions: bpfeb_unknown_none
|
||||
//@ [bpfeb_unknown_none] compile-flags: --target bpfeb-unknown-none
|
||||
//@ [bpfeb_unknown_none] needs-llvm-components: bpf
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//@ add-core-stubs
|
||||
//@ assembly-output: emit-asm
|
||||
//@ compile-flags: --target avr-unknown-gnu-atmega328
|
||||
//@ compile-flags: --target avr-none -C target-cpu=atmega328p
|
||||
//@ needs-llvm-components: avr
|
||||
|
||||
#![crate_type = "rlib"]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//@ compile-flags: -Copt-level=3 --target=avr-unknown-gnu-atmega328 --crate-type=rlib -C panic=abort
|
||||
//@ compile-flags: -Copt-level=3 --target=avr-none -C target-cpu=atmega328p --crate-type=rlib -C panic=abort
|
||||
//@ needs-llvm-components: avr
|
||||
|
||||
// This test validates that function pointers can be stored in global variables
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
//@ compile-flags: -Copt-level=3
|
||||
|
||||
// See https://github.com/rust-lang/rust/issues/135802
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
enum Void {}
|
||||
|
||||
// Should be ABI-compatible with T, but wasn't prior to the PR adding this test.
|
||||
#[repr(transparent)]
|
||||
struct NoReturn<T>(T, Void);
|
||||
|
||||
// Returned by invisible reference (in most ABIs)
|
||||
#[allow(dead_code)]
|
||||
struct Large(u64, u64, u64);
|
||||
|
||||
extern "Rust" {
|
||||
fn opaque() -> NoReturn<Large>;
|
||||
fn opaque_with_arg(rsi: u32) -> NoReturn<Large>;
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test_uninhabited_ret_by_ref
|
||||
#[no_mangle]
|
||||
pub fn test_uninhabited_ret_by_ref() {
|
||||
// CHECK: %_1 = alloca [24 x i8], align {{8|4}}
|
||||
// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %_1)
|
||||
// CHECK-NEXT: call void @opaque(ptr noalias nocapture noundef nonnull sret([24 x i8]) align {{8|4}} dereferenceable(24) %_1) #2
|
||||
// CHECK-NEXT: unreachable
|
||||
unsafe {
|
||||
opaque();
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test_uninhabited_ret_by_ref_with_arg
|
||||
#[no_mangle]
|
||||
pub fn test_uninhabited_ret_by_ref_with_arg(rsi: u32) {
|
||||
// CHECK: %_2 = alloca [24 x i8], align {{8|4}}
|
||||
// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %_2)
|
||||
// CHECK-NEXT: call void @opaque_with_arg(ptr noalias nocapture noundef nonnull sret([24 x i8]) align {{8|4}} dereferenceable(24) %_2, i32 noundef %rsi) #2
|
||||
// CHECK-NEXT: unreachable
|
||||
unsafe {
|
||||
opaque_with_arg(rsi);
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,12 @@ fn main() {
|
||||
.input("avr-rjmp-offsets.rs")
|
||||
.opt_level("s")
|
||||
.panic("abort")
|
||||
.target("avr-unknown-gnu-atmega328")
|
||||
.target("avr-none")
|
||||
// rust-lld has some troubles understanding the -mmcu flag, so for the
|
||||
// time being let's tell rustc to emit binary that's compatible with the
|
||||
// target CPU that lld defaults to, i.e. just `avr` (that's simply the
|
||||
// minimal common instruction set across all AVRs)
|
||||
.target_cpu("avr")
|
||||
// normally one links with `avr-gcc`, but this is not available in CI,
|
||||
// hence this test diverges from the default behavior to enable linking
|
||||
// at all, which is necessary for the test (to resolve the labels). To
|
||||
@@ -49,6 +54,7 @@ fn main() {
|
||||
// of the Rust compiler did produce a label `rjmp .-4` (misses the first
|
||||
// instruction in the loop).
|
||||
assert!(disassembly.contains("<main>"), "no main function in output");
|
||||
|
||||
disassembly
|
||||
.trim()
|
||||
.lines()
|
||||
|
||||
@@ -17,6 +17,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -45,6 +46,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -17,6 +17,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -56,6 +57,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -17,6 +17,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -56,6 +57,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -17,6 +17,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -56,6 +57,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -17,6 +17,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -45,6 +46,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -17,6 +17,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -56,6 +57,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -20,6 +20,7 @@ error: fn_abi_of(test) = FnAbi {
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -67,6 +68,7 @@ error: fn_abi_of(test) = FnAbi {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -125,6 +127,7 @@ error: fn_abi_of(TestFnPtr) = FnAbi {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -163,6 +166,7 @@ error: fn_abi_of(TestFnPtr) = FnAbi {
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -213,6 +217,7 @@ error: fn_abi_of(test_generic) = FnAbi {
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -248,6 +253,7 @@ error: fn_abi_of(test_generic) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -297,6 +303,7 @@ error: ABIs are not compatible
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -332,6 +339,7 @@ error: ABIs are not compatible
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -369,6 +377,7 @@ error: ABIs are not compatible
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -404,6 +413,7 @@ error: ABIs are not compatible
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -444,6 +454,7 @@ error: ABIs are not compatible
|
||||
count: 32,
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -483,6 +494,7 @@ error: ABIs are not compatible
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -517,6 +529,7 @@ error: ABIs are not compatible
|
||||
count: 32,
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -556,6 +569,7 @@ error: ABIs are not compatible
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -598,6 +612,7 @@ error: ABIs are not compatible
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -633,6 +648,7 @@ error: ABIs are not compatible
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -670,6 +686,7 @@ error: ABIs are not compatible
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -705,6 +722,7 @@ error: ABIs are not compatible
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -748,6 +766,7 @@ error: ABIs are not compatible
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -783,6 +802,7 @@ error: ABIs are not compatible
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -820,6 +840,7 @@ error: ABIs are not compatible
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -855,6 +876,7 @@ error: ABIs are not compatible
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -923,6 +945,7 @@ error: fn_abi_of(assoc_test) = FnAbi {
|
||||
valid_range: $NON_NULL,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -960,6 +983,7 @@ error: fn_abi_of(assoc_test) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -17,6 +17,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -45,6 +46,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//@ needs-llvm-components: avr
|
||||
//@ compile-flags: --target=avr-unknown-gnu-atmega328 --crate-type=rlib
|
||||
//@ compile-flags: --target=avr-none -C target-cpu=atmega328p --crate-type=rlib
|
||||
#![no_core]
|
||||
#![feature(no_core, lang_items)]
|
||||
#[lang="sized"]
|
||||
|
||||
@@ -31,6 +31,7 @@ error: layout_of(E) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -56,6 +57,7 @@ error: layout_of(E) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -69,7 +71,9 @@ error: layout_of(E) = Layout {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Memory {
|
||||
sized: true,
|
||||
},
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(4 bytes),
|
||||
@@ -83,6 +87,7 @@ error: layout_of(E) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -136,6 +141,7 @@ error: layout_of(S) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -161,6 +167,7 @@ error: layout_of(U) = Layout {
|
||||
2,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -213,6 +220,7 @@ error: layout_of(Result<i32, i32>) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -255,6 +263,7 @@ error: layout_of(Result<i32, i32>) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -293,6 +302,7 @@ error: layout_of(Result<i32, i32>) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -328,6 +338,7 @@ error: layout_of(i32) = Layout {
|
||||
),
|
||||
fields: Primitive,
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -353,6 +364,7 @@ error: layout_of(V) = Layout {
|
||||
2,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -378,6 +390,7 @@ error: layout_of(W) = Layout {
|
||||
2,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -403,6 +416,7 @@ error: layout_of(Y) = Layout {
|
||||
2,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -428,6 +442,7 @@ error: layout_of(P1) = Layout {
|
||||
1,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -453,6 +468,7 @@ error: layout_of(P2) = Layout {
|
||||
1,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -478,6 +494,7 @@ error: layout_of(P3) = Layout {
|
||||
1,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -503,6 +520,7 @@ error: layout_of(P4) = Layout {
|
||||
1,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -533,6 +551,7 @@ error: layout_of(P5) = Layout {
|
||||
2,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -563,6 +582,7 @@ error: layout_of(MaybeUninit<u8>) = Layout {
|
||||
2,
|
||||
),
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -31,6 +31,7 @@ error: layout_of(A) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -56,6 +57,7 @@ error: layout_of(A) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -107,6 +109,7 @@ error: layout_of(B) = Layout {
|
||||
valid_range: 255..=255,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -132,6 +135,7 @@ error: layout_of(B) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -183,6 +187,7 @@ error: layout_of(C) = Layout {
|
||||
valid_range: 256..=256,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -208,6 +213,7 @@ error: layout_of(C) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -259,6 +265,7 @@ error: layout_of(P) = Layout {
|
||||
valid_range: 268435456..=268435456,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -284,6 +291,7 @@ error: layout_of(P) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -335,6 +343,7 @@ error: layout_of(T) = Layout {
|
||||
valid_range: 2164260864..=2164260864,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -360,6 +369,7 @@ error: layout_of(T) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -37,6 +37,7 @@ error: layout_of(MissingPayloadField) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -78,6 +79,7 @@ error: layout_of(MissingPayloadField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -99,6 +101,7 @@ error: layout_of(MissingPayloadField) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -157,6 +160,7 @@ error: layout_of(CommonPayloadField) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -199,6 +203,7 @@ error: layout_of(CommonPayloadField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -237,6 +242,7 @@ error: layout_of(CommonPayloadField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -294,6 +300,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -335,6 +342,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -372,6 +380,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -429,6 +438,7 @@ error: layout_of(NicheFirst) = Layout {
|
||||
valid_range: 0..=4,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -486,6 +496,7 @@ error: layout_of(NicheFirst) = Layout {
|
||||
valid_range: 0..=2,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -507,6 +518,7 @@ error: layout_of(NicheFirst) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -528,6 +540,7 @@ error: layout_of(NicheFirst) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 2,
|
||||
},
|
||||
@@ -585,6 +598,7 @@ error: layout_of(NicheSecond) = Layout {
|
||||
valid_range: 0..=4,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -642,6 +656,7 @@ error: layout_of(NicheSecond) = Layout {
|
||||
valid_range: 0..=2,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -663,6 +678,7 @@ error: layout_of(NicheSecond) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -684,6 +700,7 @@ error: layout_of(NicheSecond) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 2,
|
||||
},
|
||||
|
||||
@@ -25,6 +25,7 @@ error: layout_of(Aligned1) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -50,6 +51,7 @@ error: layout_of(Aligned1) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -73,6 +75,7 @@ error: layout_of(Aligned1) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -128,6 +131,7 @@ error: layout_of(Aligned2) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -153,6 +157,7 @@ error: layout_of(Aligned2) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -176,6 +181,7 @@ error: layout_of(Aligned2) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
|
||||
@@ -31,6 +31,7 @@ error: layout_of(A) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -56,6 +57,7 @@ error: layout_of(A) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -107,6 +109,7 @@ error: layout_of(B) = Layout {
|
||||
valid_range: 255..=255,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -132,6 +135,7 @@ error: layout_of(B) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -183,6 +187,7 @@ error: layout_of(C) = Layout {
|
||||
valid_range: 256..=256,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -208,6 +213,7 @@ error: layout_of(C) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -259,6 +265,7 @@ error: layout_of(P) = Layout {
|
||||
valid_range: 268435456..=268435456,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -284,6 +291,7 @@ error: layout_of(P) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -335,6 +343,7 @@ error: layout_of(T) = Layout {
|
||||
valid_range: 2164260864..=2164260864,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -360,6 +369,7 @@ error: layout_of(T) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -25,6 +25,7 @@ error: layout_of(Result<[u32; 0], bool>) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -54,6 +55,7 @@ error: layout_of(Result<[u32; 0], bool>) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -88,6 +90,7 @@ error: layout_of(Result<[u32; 0], bool>) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -133,6 +136,7 @@ error: layout_of(MultipleAlignments) = Layout {
|
||||
valid_range: 0..=2,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -162,6 +166,7 @@ error: layout_of(MultipleAlignments) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -187,6 +192,7 @@ error: layout_of(MultipleAlignments) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -221,6 +227,7 @@ error: layout_of(MultipleAlignments) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 2,
|
||||
},
|
||||
@@ -266,6 +273,7 @@ error: layout_of(Result<[u32; 0], Packed<NonZero<u16>>>) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -295,6 +303,7 @@ error: layout_of(Result<[u32; 0], Packed<NonZero<u16>>>) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -329,6 +338,7 @@ error: layout_of(Result<[u32; 0], Packed<NonZero<u16>>>) = Layout {
|
||||
valid_range: 1..=65535,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -374,6 +384,7 @@ error: layout_of(Result<[u32; 0], Packed<U16IsZero>>) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -407,6 +418,7 @@ error: layout_of(Result<[u32; 0], Packed<U16IsZero>>) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -441,6 +453,7 @@ error: layout_of(Result<[u32; 0], Packed<U16IsZero>>) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//@ revisions: avr msp430
|
||||
//
|
||||
//@ [avr] needs-llvm-components: avr
|
||||
//@ [avr] compile-flags: --target=avr-unknown-gnu-atmega328 --crate-type=rlib
|
||||
//@ [avr] compile-flags: --target=avr-none -C target-cpu=atmega328p --crate-type=rlib
|
||||
//@ [msp430] needs-llvm-components: msp430
|
||||
//@ [msp430] compile-flags: --target=msp430-none-elf --crate-type=rlib
|
||||
#![feature(no_core, lang_items, intrinsics, staged_api, rustc_attrs)]
|
||||
|
||||
@@ -4,7 +4,15 @@ error: layout_of(Univariant) = Layout {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(0 bytes),
|
||||
@@ -23,6 +31,7 @@ error: layout_of(Univariant) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: true,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -40,7 +49,15 @@ error: layout_of(Univariant) = Layout {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(4 bytes),
|
||||
@@ -50,6 +67,7 @@ error: layout_of(Univariant) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -107,6 +125,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -119,12 +138,26 @@ error: layout_of(TwoVariants) = Layout {
|
||||
tag_field: 0,
|
||||
variants: [
|
||||
Layout {
|
||||
size: Size(4 bytes),
|
||||
size: Size(8 bytes),
|
||||
align: AbiAndPrefAlign {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: ScalarPair(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
Union {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(4 bytes),
|
||||
@@ -134,6 +167,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -171,6 +205,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -216,6 +251,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -233,7 +269,9 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
abi: Align(8 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Memory {
|
||||
sized: true,
|
||||
},
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(8 bytes),
|
||||
@@ -245,6 +283,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -272,6 +311,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
|
||||
@@ -4,7 +4,15 @@ error: layout_of(Univariant) = Layout {
|
||||
abi: Align(1 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(0 bytes),
|
||||
@@ -23,6 +31,7 @@ error: layout_of(Univariant) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: true,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -40,7 +49,15 @@ error: layout_of(Univariant) = Layout {
|
||||
abi: Align(1 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(1 bytes),
|
||||
@@ -50,6 +67,7 @@ error: layout_of(Univariant) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -107,6 +125,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -119,12 +138,26 @@ error: layout_of(TwoVariants) = Layout {
|
||||
tag_field: 0,
|
||||
variants: [
|
||||
Layout {
|
||||
size: Size(1 bytes),
|
||||
size: Size(2 bytes),
|
||||
align: AbiAndPrefAlign {
|
||||
abi: Align(1 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: ScalarPair(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
Union {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(1 bytes),
|
||||
@@ -134,6 +167,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -171,6 +205,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -216,6 +251,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -233,7 +269,9 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
abi: Align(8 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Memory {
|
||||
sized: true,
|
||||
},
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(8 bytes),
|
||||
@@ -245,6 +283,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -272,6 +311,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
|
||||
@@ -4,7 +4,15 @@ error: layout_of(Univariant) = Layout {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(0 bytes),
|
||||
@@ -23,6 +31,7 @@ error: layout_of(Univariant) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: true,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -40,7 +49,15 @@ error: layout_of(Univariant) = Layout {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(4 bytes),
|
||||
@@ -50,6 +67,7 @@ error: layout_of(Univariant) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -107,6 +125,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -119,12 +138,26 @@ error: layout_of(TwoVariants) = Layout {
|
||||
tag_field: 0,
|
||||
variants: [
|
||||
Layout {
|
||||
size: Size(4 bytes),
|
||||
size: Size(8 bytes),
|
||||
align: AbiAndPrefAlign {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: ScalarPair(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
Union {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(4 bytes),
|
||||
@@ -134,6 +167,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -171,6 +205,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -216,6 +251,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -233,7 +269,9 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
abi: Align(8 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Memory {
|
||||
sized: true,
|
||||
},
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(8 bytes),
|
||||
@@ -245,6 +283,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -272,6 +311,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
|
||||
@@ -4,7 +4,15 @@ error: layout_of(Univariant) = Layout {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(0 bytes),
|
||||
@@ -23,6 +31,7 @@ error: layout_of(Univariant) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: true,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -40,7 +49,15 @@ error: layout_of(Univariant) = Layout {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(4 bytes),
|
||||
@@ -50,6 +67,7 @@ error: layout_of(Univariant) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -107,6 +125,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -119,12 +138,26 @@ error: layout_of(TwoVariants) = Layout {
|
||||
tag_field: 0,
|
||||
variants: [
|
||||
Layout {
|
||||
size: Size(4 bytes),
|
||||
size: Size(8 bytes),
|
||||
align: AbiAndPrefAlign {
|
||||
abi: Align(4 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: ScalarPair(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I32,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
Union {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(4 bytes),
|
||||
@@ -134,6 +167,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -171,6 +205,7 @@ error: layout_of(TwoVariants) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -216,6 +251,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -233,7 +269,9 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
abi: Align(8 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Memory {
|
||||
sized: true,
|
||||
},
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(8 bytes),
|
||||
@@ -245,6 +283,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -272,6 +311,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
|
||||
@@ -4,7 +4,15 @@ error: layout_of(UnivariantU8) = Layout {
|
||||
abi: Align(1 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(0 bytes),
|
||||
@@ -23,6 +31,7 @@ error: layout_of(UnivariantU8) = Layout {
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
uninhabited: true,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -40,7 +49,15 @@ error: layout_of(UnivariantU8) = Layout {
|
||||
abi: Align(1 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Scalar(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=0,
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(1 bytes),
|
||||
@@ -50,6 +67,7 @@ error: layout_of(UnivariantU8) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -107,6 +125,7 @@ error: layout_of(TwoVariantsU8) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -119,12 +138,26 @@ error: layout_of(TwoVariantsU8) = Layout {
|
||||
tag_field: 0,
|
||||
variants: [
|
||||
Layout {
|
||||
size: Size(1 bytes),
|
||||
size: Size(2 bytes),
|
||||
align: AbiAndPrefAlign {
|
||||
abi: Align(1 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: ScalarPair(
|
||||
Initialized {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
Union {
|
||||
value: Int(
|
||||
I8,
|
||||
false,
|
||||
),
|
||||
},
|
||||
),
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(1 bytes),
|
||||
@@ -134,6 +167,7 @@ error: layout_of(TwoVariantsU8) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -171,6 +205,7 @@ error: layout_of(TwoVariantsU8) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -216,6 +251,7 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout {
|
||||
valid_range: 0..=1,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -233,7 +269,9 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout {
|
||||
abi: Align(8 bytes),
|
||||
pref: $SOME_ALIGN,
|
||||
},
|
||||
abi: Uninhabited,
|
||||
abi: Memory {
|
||||
sized: true,
|
||||
},
|
||||
fields: Arbitrary {
|
||||
offsets: [
|
||||
Size(8 bytes),
|
||||
@@ -245,6 +283,7 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: true,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -272,6 +311,7 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
|
||||
@@ -31,6 +31,7 @@ error: layout_of(NonZero<u32>) = Layout {
|
||||
valid_range: 1..=4294967295,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -69,6 +70,7 @@ error: layout_of((u32) is 1..=) = Layout {
|
||||
valid_range: 1..=4294967295,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -105,6 +107,7 @@ error: layout_of(Option<(u32) is 1..=>) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -134,6 +137,7 @@ error: layout_of(Option<(u32) is 1..=>) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -174,6 +178,7 @@ error: layout_of(Option<(u32) is 1..=>) = Layout {
|
||||
valid_range: 1..=4294967295,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -216,6 +221,7 @@ error: layout_of(Option<NonZero<u32>>) = Layout {
|
||||
],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Multiple {
|
||||
tag: Initialized {
|
||||
value: Int(
|
||||
@@ -245,6 +251,7 @@ error: layout_of(Option<NonZero<u32>>) = Layout {
|
||||
memory_index: [],
|
||||
},
|
||||
largest_niche: None,
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
@@ -285,6 +292,7 @@ error: layout_of(Option<NonZero<u32>>) = Layout {
|
||||
valid_range: 1..=4294967295,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 1,
|
||||
},
|
||||
@@ -336,6 +344,7 @@ error: layout_of(NonZeroU32New) = Layout {
|
||||
valid_range: 1..=4294967295,
|
||||
},
|
||||
),
|
||||
uninhabited: false,
|
||||
variants: Single {
|
||||
index: 0,
|
||||
},
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
//@ run-pass
|
||||
//@ needs-unwind
|
||||
// See https://github.com/rust-lang/rust/issues/135802
|
||||
|
||||
enum Void {}
|
||||
|
||||
// Should be ABI-compatible with T, but wasn't prior to the PR adding this test.
|
||||
#[repr(transparent)]
|
||||
struct NoReturn<T>(T, Void);
|
||||
|
||||
// Returned by invisible reference (in most ABIs)
|
||||
#[allow(dead_code)]
|
||||
struct Large(u64, u64, u64);
|
||||
|
||||
// Prior to the PR adding this test, this function had a different ABI than
|
||||
// `fn() -> Large` (on `x86_64-unknown-linux-gnu` at least), so calling it as `fn() -> Large`
|
||||
// would pass the return place pointer in rdi and `correct` in rsi, but the function
|
||||
// would expect `correct` in rdi.
|
||||
fn never(correct: &mut bool) -> NoReturn<Large> {
|
||||
*correct = true;
|
||||
panic!("catch this")
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut correct = false;
|
||||
let never: fn(&mut bool) -> NoReturn<Large> = never;
|
||||
// Safety: `NoReturn<Large>` is a `repr(transparent)` wrapper around `Large`,
|
||||
// so they should be ABI-compatible.
|
||||
let never: fn(&mut bool) -> Large = unsafe { std::mem::transmute(never) };
|
||||
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| never(&mut correct)));
|
||||
assert!(result.is_err(), "function should have panicked");
|
||||
assert!(correct, "function should have stored `true` into `correct`");
|
||||
}
|
||||
Reference in New Issue
Block a user