Auto merge of #15691 - Veykril:rustc_abi, r=Veykril

Update rustc_abi dependency

cc https://github.com/rust-lang/rust/pull/116269
diff --git a/Cargo.lock b/Cargo.lock
index 476c047..2a56bdd 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -609,27 +609,6 @@
 ]
 
 [[package]]
-name = "hkalbasi-rustc-ap-rustc_abi"
-version = "0.0.20221221"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adabaadad9aa7576f97af02241cdf5554d62fb3d51a84cb05d77ba28edd3013f"
-dependencies = [
- "bitflags 1.3.2",
- "hkalbasi-rustc-ap-rustc_index",
- "tracing",
-]
-
-[[package]]
-name = "hkalbasi-rustc-ap-rustc_index"
-version = "0.0.20221221"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4d3c48474e09afb0f5efbd6f758e05411699301a113c47d454d28ec7059d00e"
-dependencies = [
- "arrayvec",
- "smallvec",
-]
-
-[[package]]
 name = "home"
 version = "0.5.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1474,10 +1453,21 @@
 ]
 
 [[package]]
-name = "ra-ap-rustc_index"
-version = "0.10.0"
+name = "ra-ap-rustc_abi"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07b5fa61d34da18e148dc3a81f654488ea07f40938d8aefb17f8b64bb78c6120"
+checksum = "a51b7a02377b3246ec5c095b852b5cf1678bd9ed6b572b2a79efbf7ad711c292"
+dependencies = [
+ "bitflags 1.3.2",
+ "ra-ap-rustc_index",
+ "tracing",
+]
+
+[[package]]
+name = "ra-ap-rustc_index"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "643ca3609870b1778d9cd1f2a8e4ccb4af0f48f3637cc257a09494d087bd93dc"
 dependencies = [
  "arrayvec",
  "smallvec",
@@ -1485,9 +1475,9 @@
 
 [[package]]
 name = "ra-ap-rustc_lexer"
-version = "0.10.0"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2e2f6b48422e4eed5218277ab7cc9733e60dd8f3167f4f36a49a0cafe4dc195"
+checksum = "30ffd24f9ba4f1d25ff27ca1469b8d22a3bdfb12cf644fc8bfcb63121fa5da6b"
 dependencies = [
  "unicode-properties",
  "unicode-xid",
@@ -1495,9 +1485,9 @@
 
 [[package]]
 name = "ra-ap-rustc_parse_format"
-version = "0.10.0"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3c7369ad01cc79f9e3513c9f6a6326f6b980100e4862a7ac71b9991c88108bb"
+checksum = "207b5ac1a21d4926695e03b605ffb9f63d4968e0488e9197c04c512c37303aa7"
 dependencies = [
  "ra-ap-rustc_index",
  "ra-ap-rustc_lexer",
@@ -1623,8 +1613,8 @@
 name = "rustc-dependencies"
 version = "0.0.0"
 dependencies = [
- "hkalbasi-rustc-ap-rustc_abi",
- "hkalbasi-rustc-ap-rustc_index",
+ "ra-ap-rustc_abi",
+ "ra-ap-rustc_index",
  "ra-ap-rustc_lexer",
  "ra-ap-rustc_parse_format",
 ]
diff --git a/crates/hir-def/src/data/adt.rs b/crates/hir-def/src/data/adt.rs
index b163112..76c8d9a 100644
--- a/crates/hir-def/src/data/adt.rs
+++ b/crates/hir-def/src/data/adt.rs
@@ -178,7 +178,7 @@
         }
     }
 
-    Some(ReprOptions { int, align: max_align, pack: min_pack, flags, field_shuffle_seed: 0 })
+    Some(ReprOptions { int, align: max_align, pack: min_pack, flags })
 }
 
 impl StructData {
diff --git a/crates/hir-ty/src/layout.rs b/crates/hir-ty/src/layout.rs
index ee55895..603e58f 100644
--- a/crates/hir-ty/src/layout.rs
+++ b/crates/hir-ty/src/layout.rs
@@ -9,6 +9,10 @@
     LocalEnumVariantId, LocalFieldId, StructId,
 };
 use la_arena::{Idx, RawIdx};
+use rustc_dependencies::{
+    abi::AddressSpace,
+    index::{IndexSlice, IndexVec},
+};
 use stdx::never;
 use triomphe::Arc;
 
@@ -34,7 +38,7 @@
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct RustcEnumVariantIdx(pub LocalEnumVariantId);
 
-impl rustc_dependencies::index::vec::Idx for RustcEnumVariantIdx {
+impl rustc_dependencies::index::Idx for RustcEnumVariantIdx {
     fn new(idx: usize) -> Self {
         RustcEnumVariantIdx(Idx::from_raw(RawIdx::from(idx as u32)))
     }
@@ -44,9 +48,28 @@
     }
 }
 
-pub type Layout = LayoutS<RustcEnumVariantIdx>;
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub struct RustcFieldIdx(pub LocalFieldId);
+
+impl RustcFieldIdx {
+    pub fn new(idx: usize) -> Self {
+        RustcFieldIdx(Idx::from_raw(RawIdx::from(idx as u32)))
+    }
+}
+
+impl rustc_dependencies::index::Idx for RustcFieldIdx {
+    fn new(idx: usize) -> Self {
+        RustcFieldIdx(Idx::from_raw(RawIdx::from(idx as u32)))
+    }
+
+    fn index(self) -> usize {
+        u32::from(self.0.into_raw()) as usize
+    }
+}
+
+pub type Layout = LayoutS<RustcFieldIdx, RustcEnumVariantIdx>;
 pub type TagEncoding = hir_def::layout::TagEncoding<RustcEnumVariantIdx>;
-pub type Variants = hir_def::layout::Variants<RustcEnumVariantIdx>;
+pub type Variants = hir_def::layout::Variants<RustcFieldIdx, RustcEnumVariantIdx>;
 
 #[derive(Debug, PartialEq, Eq, Clone)]
 pub enum LayoutError {
@@ -66,7 +89,7 @@
 impl<'a> LayoutCalculator for LayoutCx<'a> {
     type TargetDataLayoutRef = &'a TargetDataLayout;
 
-    fn delay_bug(&self, txt: &str) {
+    fn delay_bug(&self, txt: String) {
         never!("{}", txt);
     }
 
@@ -145,6 +168,8 @@
         largest_niche: e_ly.largest_niche,
         size,
         align,
+        max_repr_align: None,
+        unadjusted_abi_align: align.abi,
     }))
 }
 
@@ -230,7 +255,7 @@
                 .map(|k| db.layout_of_ty(k.assert_ty_ref(Interner).clone(), trait_env.clone()))
                 .collect::<Result<Vec<_>, _>>()?;
             let fields = fields.iter().map(|it| &**it).collect::<Vec<_>>();
-            let fields = fields.iter().collect::<Vec<_>>();
+            let fields = fields.iter().collect::<IndexVec<_, _>>();
             cx.univariant(dl, &fields, &ReprOptions::default(), kind).ok_or(LayoutError::Unknown)?
         }
         TyKind::Array(element, count) => {
@@ -255,6 +280,8 @@
                 largest_niche,
                 align: element.align,
                 size,
+                max_repr_align: None,
+                unadjusted_abi_align: element.align.abi,
             }
         }
         TyKind::Slice(element) => {
@@ -266,11 +293,23 @@
                 largest_niche: None,
                 align: element.align,
                 size: Size::ZERO,
+                max_repr_align: None,
+                unadjusted_abi_align: element.align.abi,
             }
         }
+        TyKind::Str => Layout {
+            variants: Variants::Single { index: struct_variant_idx() },
+            fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
+            abi: Abi::Aggregate { sized: false },
+            largest_niche: None,
+            align: dl.i8_align,
+            size: Size::ZERO,
+            max_repr_align: None,
+            unadjusted_abi_align: dl.i8_align.abi,
+        },
         // Potentially-wide pointers.
         TyKind::Ref(_, _, pointee) | TyKind::Raw(_, pointee) => {
-            let mut data_ptr = scalar_unit(dl, Primitive::Pointer);
+            let mut data_ptr = scalar_unit(dl, Primitive::Pointer(AddressSpace::DATA));
             if matches!(ty.kind(Interner), TyKind::Ref(..)) {
                 data_ptr.valid_range_mut().start = 1;
             }
@@ -294,7 +333,7 @@
                     scalar_unit(dl, Primitive::Int(dl.ptr_sized_integer(), false))
                 }
                 TyKind::Dyn(..) => {
-                    let mut vtable = scalar_unit(dl, Primitive::Pointer);
+                    let mut vtable = scalar_unit(dl, Primitive::Pointer(AddressSpace::DATA));
                     vtable.valid_range_mut().start = 1;
                     vtable
                 }
@@ -308,22 +347,7 @@
             cx.scalar_pair(data_ptr, metadata)
         }
         TyKind::FnDef(_, _) => layout_of_unit(&cx, dl)?,
-        TyKind::Str => Layout {
-            variants: Variants::Single { index: struct_variant_idx() },
-            fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
-            abi: Abi::Aggregate { sized: false },
-            largest_niche: None,
-            align: dl.i8_align,
-            size: Size::ZERO,
-        },
-        TyKind::Never => Layout {
-            variants: Variants::Single { index: struct_variant_idx() },
-            fields: FieldsShape::Primitive,
-            abi: Abi::Uninhabited,
-            largest_niche: None,
-            align: dl.i8_align,
-            size: Size::ZERO,
-        },
+        TyKind::Never => cx.layout_of_never_type(),
         TyKind::Dyn(_) | TyKind::Foreign(_) => {
             let mut unit = layout_of_unit(&cx, dl)?;
             match unit.abi {
@@ -333,7 +357,7 @@
             unit
         }
         TyKind::Function(_) => {
-            let mut ptr = scalar_unit(dl, Primitive::Pointer);
+            let mut ptr = scalar_unit(dl, Primitive::Pointer(dl.instruction_address_space));
             ptr.valid_range_mut().start = 1;
             Layout::scalar(dl, ptr)
         }
@@ -363,7 +387,7 @@
                 })
                 .collect::<Result<Vec<_>, _>>()?;
             let fields = fields.iter().map(|it| &**it).collect::<Vec<_>>();
-            let fields = fields.iter().collect::<Vec<_>>();
+            let fields = fields.iter().collect::<IndexVec<_, _>>();
             cx.univariant(dl, &fields, &ReprOptions::default(), StructKind::AlwaysSized)
                 .ok_or(LayoutError::Unknown)?
         }
@@ -398,9 +422,9 @@
 }
 
 fn layout_of_unit(cx: &LayoutCx<'_>, dl: &TargetDataLayout) -> Result<Layout, LayoutError> {
-    cx.univariant::<RustcEnumVariantIdx, &&Layout>(
+    cx.univariant::<RustcFieldIdx, RustcEnumVariantIdx, &&Layout>(
         dl,
-        &[],
+        IndexSlice::empty(),
         &ReprOptions::default(),
         StructKind::AlwaysSized,
     )
diff --git a/crates/hir-ty/src/layout/adt.rs b/crates/hir-ty/src/layout/adt.rs
index c2778b9..5e713c1 100644
--- a/crates/hir-ty/src/layout/adt.rs
+++ b/crates/hir-ty/src/layout/adt.rs
@@ -8,6 +8,7 @@
     AdtId, EnumVariantId, LocalEnumVariantId, VariantId,
 };
 use la_arena::RawIdx;
+use rustc_dependencies::index::IndexVec;
 use smallvec::SmallVec;
 use triomphe::Arc;
 
@@ -20,8 +21,8 @@
 
 use super::LayoutCx;
 
-pub(crate) fn struct_variant_idx() -> RustcEnumVariantIdx {
-    RustcEnumVariantIdx(LocalEnumVariantId::from_raw(RawIdx::from(0)))
+pub(crate) const fn struct_variant_idx() -> RustcEnumVariantIdx {
+    RustcEnumVariantIdx(LocalEnumVariantId::from_raw(RawIdx::from_u32(0)))
 }
 
 pub fn layout_of_adt_query(
@@ -74,7 +75,7 @@
         .iter()
         .map(|it| it.iter().map(|it| &**it).collect::<Vec<_>>())
         .collect::<SmallVec<[_; 1]>>();
-    let variants = variants.iter().map(|it| it.iter().collect()).collect();
+    let variants = variants.iter().map(|it| it.iter().collect()).collect::<IndexVec<_, _>>();
     let result = if matches!(def, AdtId::UnionId(..)) {
         cx.layout_of_union(&repr, &variants).ok_or(LayoutError::Unknown)?
     } else {
@@ -105,7 +106,7 @@
                 && variants
                     .iter()
                     .next()
-                    .and_then(|it| it.last().map(|it| !it.is_unsized()))
+                    .and_then(|it| it.iter().last().map(|it| !it.is_unsized()))
                     .unwrap_or(true),
         )
         .ok_or(LayoutError::SizeOverflow)?
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 8246297..2883229 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -64,7 +64,7 @@
     consteval::{try_const_usize, unknown_const_as_generic, ConstEvalError, ConstExt},
     diagnostics::BodyValidationDiagnostic,
     known_const_to_ast,
-    layout::{Layout as TyLayout, RustcEnumVariantIdx, TagEncoding},
+    layout::{Layout as TyLayout, RustcEnumVariantIdx, RustcFieldIdx, TagEncoding},
     method_resolution::{self, TyFingerprint},
     mir::{self, interpret_mir},
     primitive::UintTy,
@@ -4540,15 +4540,31 @@
         Some(self.0.largest_niche?.available(&*self.1))
     }
 
-    pub fn field_offset(&self, idx: usize) -> Option<u64> {
+    pub fn field_offset(&self, field: Field) -> Option<u64> {
         match self.0.fields {
             layout::FieldsShape::Primitive => None,
             layout::FieldsShape::Union(_) => Some(0),
             layout::FieldsShape::Array { stride, count } => {
-                let i = u64::try_from(idx).ok()?;
+                let i = u64::try_from(field.index()).ok()?;
                 (i < count).then_some((stride * i).bytes())
             }
-            layout::FieldsShape::Arbitrary { ref offsets, .. } => Some(offsets.get(idx)?.bytes()),
+            layout::FieldsShape::Arbitrary { ref offsets, .. } => {
+                Some(offsets.get(RustcFieldIdx(field.id))?.bytes())
+            }
+        }
+    }
+
+    pub fn tuple_field_offset(&self, field: usize) -> Option<u64> {
+        match self.0.fields {
+            layout::FieldsShape::Primitive => None,
+            layout::FieldsShape::Union(_) => Some(0),
+            layout::FieldsShape::Array { stride, count } => {
+                let i = u64::try_from(field).ok()?;
+                (i < count).then_some((stride * i).bytes())
+            }
+            layout::FieldsShape::Arbitrary { ref offsets, .. } => {
+                Some(offsets.get(RustcFieldIdx::new(field))?.bytes())
+            }
         }
     }
 
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs
index f72ce37..d0a02fd 100644
--- a/crates/ide/src/hover/render.rs
+++ b/crates/ide/src/hover/render.rs
@@ -402,10 +402,9 @@
             |&it| it.layout(db),
             |_| {
                 let var_def = it.parent_def(db);
-                let id = it.index();
                 match var_def {
                     hir::VariantDef::Struct(s) => {
-                        Adt::from(s).layout(db).ok().and_then(|layout| layout.field_offset(id))
+                        Adt::from(s).layout(db).ok().and_then(|layout| layout.field_offset(it))
                     }
                     _ => None,
                 }
diff --git a/crates/ide/src/view_memory_layout.rs b/crates/ide/src/view_memory_layout.rs
index 2f6332a..3802978 100644
--- a/crates/ide/src/view_memory_layout.rs
+++ b/crates/ide/src/view_memory_layout.rs
@@ -55,6 +55,7 @@
     }
 }
 
+#[derive(Copy, Clone)]
 enum FieldOrTupleIdx {
     Field(Field),
     TupleIdx(usize),
@@ -71,13 +72,6 @@
             FieldOrTupleIdx::TupleIdx(i) => format!(".{i}").to_owned(),
         }
     }
-
-    fn index(&self) -> usize {
-        match *self {
-            FieldOrTupleIdx::Field(f) => f.index(),
-            FieldOrTupleIdx::TupleIdx(i) => i,
-        }
-    }
 }
 
 // Feature: View Memory Layout
@@ -138,7 +132,10 @@
             return;
         }
 
-        fields.sort_by_key(|(f, _)| layout.field_offset(f.index()).unwrap());
+        fields.sort_by_key(|&(f, _)| match f {
+            FieldOrTupleIdx::Field(f) => layout.field_offset(f).unwrap_or(0),
+            FieldOrTupleIdx::TupleIdx(f) => layout.tuple_field_offset(f).unwrap_or(0),
+        });
 
         let children_start = nodes.len();
         nodes[parent_idx].children_start = children_start as i64;
@@ -151,7 +148,10 @@
                     typename: child_ty.display(db).to_string(),
                     size: child_layout.size(),
                     alignment: child_layout.align(),
-                    offset: layout.field_offset(field.index()).unwrap_or(0),
+                    offset: match *field {
+                        FieldOrTupleIdx::Field(f) => layout.field_offset(f).unwrap_or(0),
+                        FieldOrTupleIdx::TupleIdx(f) => layout.tuple_field_offset(f).unwrap_or(0),
+                    },
                     parent_idx: parent_idx as i64,
                     children_start: -1,
                     children_len: 0,
diff --git a/crates/rustc-dependencies/Cargo.toml b/crates/rustc-dependencies/Cargo.toml
index 5c5a3cd..7ead3d8 100644
--- a/crates/rustc-dependencies/Cargo.toml
+++ b/crates/rustc-dependencies/Cargo.toml
@@ -11,12 +11,10 @@
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-ra-ap-rustc_lexer = { version = "0.10.0" }
-ra-ap-rustc_parse_format = { version = "0.10.0", default-features = false }
-
-# Upstream broke this for us so we can't update it
-hkalbasi-rustc-ap-rustc_abi = { version = "0.0.20221221", default-features = false }
-hkalbasi-rustc-ap-rustc_index = { version = "0.0.20221221", default-features = false }
+ra-ap-rustc_lexer = { version = "0.14.0" }
+ra-ap-rustc_parse_format = { version = "0.14.0", default-features = false }
+ra-ap-rustc_index = { version = "0.14.0", default-features = false }
+ra-ap-rustc_abi = { version = "0.14.0", default-features = false }
 
 [features]
 in-rust-tree = []
diff --git a/crates/rustc-dependencies/src/lib.rs b/crates/rustc-dependencies/src/lib.rs
index c1d3f05..13fcbc4 100644
--- a/crates/rustc-dependencies/src/lib.rs
+++ b/crates/rustc-dependencies/src/lib.rs
@@ -6,34 +6,43 @@
 #[cfg(feature = "in-rust-tree")]
 extern crate rustc_lexer;
 
-#[cfg(feature = "in-rust-tree")]
 pub mod lexer {
-    pub use ::rustc_lexer::*;
-}
-
-#[cfg(not(feature = "in-rust-tree"))]
-pub mod lexer {
+    #[cfg(not(feature = "in-rust-tree"))]
     pub use ::ra_ap_rustc_lexer::*;
+
+    #[cfg(feature = "in-rust-tree")]
+    pub use ::rustc_lexer::*;
 }
 
 #[cfg(feature = "in-rust-tree")]
 extern crate rustc_parse_format;
 
-#[cfg(feature = "in-rust-tree")]
 pub mod parse_format {
+    #[cfg(not(feature = "in-rust-tree"))]
+    pub use ::ra_ap_rustc_parse_format::*;
+
+    #[cfg(feature = "in-rust-tree")]
     pub use ::rustc_parse_format::*;
 }
 
-#[cfg(not(feature = "in-rust-tree"))]
-pub mod parse_format {
-    pub use ::ra_ap_rustc_parse_format::*;
+#[cfg(feature = "in-rust-tree")]
+extern crate rustc_abi;
+
+pub mod abi {
+    #[cfg(not(feature = "in-rust-tree"))]
+    pub use ::ra_ap_rustc_abi::*;
+
+    #[cfg(feature = "in-rust-tree")]
+    pub use ::rustc_abi::*;
 }
 
-// Upstream broke this for us so we can't update it
-pub mod abi {
-    pub use ::hkalbasi_rustc_ap_rustc_abi::*;
-}
+#[cfg(feature = "in-rust-tree")]
+extern crate rustc_index;
 
 pub mod index {
-    pub use ::hkalbasi_rustc_ap_rustc_index::*;
+    #[cfg(not(feature = "in-rust-tree"))]
+    pub use ::ra_ap_rustc_index::*;
+
+    #[cfg(feature = "in-rust-tree")]
+    pub use ::rustc_index::*;
 }