mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 14:03:35 +00:00
Update rustc_abi dependency
This commit is contained in:
parent
65532e417d
commit
40acc5250f
9 changed files with 135 additions and 98 deletions
50
Cargo.lock
generated
50
Cargo.lock
generated
|
@ -608,27 +608,6 @@ dependencies = [
|
||||||
"typed-arena",
|
"typed-arena",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[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]]
|
[[package]]
|
||||||
name = "home"
|
name = "home"
|
||||||
version = "0.5.5"
|
version = "0.5.5"
|
||||||
|
@ -1474,10 +1453,21 @@ dependencies = [
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ra-ap-rustc_index"
|
name = "ra-ap-rustc_abi"
|
||||||
version = "0.10.0"
|
version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
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 = [
|
dependencies = [
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
|
@ -1485,9 +1475,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ra-ap-rustc_lexer"
|
name = "ra-ap-rustc_lexer"
|
||||||
version = "0.10.0"
|
version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f2e2f6b48422e4eed5218277ab7cc9733e60dd8f3167f4f36a49a0cafe4dc195"
|
checksum = "30ffd24f9ba4f1d25ff27ca1469b8d22a3bdfb12cf644fc8bfcb63121fa5da6b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-properties",
|
"unicode-properties",
|
||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
|
@ -1495,9 +1485,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ra-ap-rustc_parse_format"
|
name = "ra-ap-rustc_parse_format"
|
||||||
version = "0.10.0"
|
version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c3c7369ad01cc79f9e3513c9f6a6326f6b980100e4862a7ac71b9991c88108bb"
|
checksum = "207b5ac1a21d4926695e03b605ffb9f63d4968e0488e9197c04c512c37303aa7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ra-ap-rustc_index",
|
"ra-ap-rustc_index",
|
||||||
"ra-ap-rustc_lexer",
|
"ra-ap-rustc_lexer",
|
||||||
|
@ -1623,8 +1613,8 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
|
||||||
name = "rustc-dependencies"
|
name = "rustc-dependencies"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hkalbasi-rustc-ap-rustc_abi",
|
"ra-ap-rustc_abi",
|
||||||
"hkalbasi-rustc-ap-rustc_index",
|
"ra-ap-rustc_index",
|
||||||
"ra-ap-rustc_lexer",
|
"ra-ap-rustc_lexer",
|
||||||
"ra-ap-rustc_parse_format",
|
"ra-ap-rustc_parse_format",
|
||||||
]
|
]
|
||||||
|
|
|
@ -178,7 +178,7 @@ fn parse_repr_tt(tt: &Subtree) -> Option<ReprOptions> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
impl StructData {
|
||||||
|
|
|
@ -9,6 +9,10 @@ use hir_def::{
|
||||||
LocalEnumVariantId, LocalFieldId, StructId,
|
LocalEnumVariantId, LocalFieldId, StructId,
|
||||||
};
|
};
|
||||||
use la_arena::{Idx, RawIdx};
|
use la_arena::{Idx, RawIdx};
|
||||||
|
use rustc_dependencies::{
|
||||||
|
abi::AddressSpace,
|
||||||
|
index::{IndexSlice, IndexVec},
|
||||||
|
};
|
||||||
use stdx::never;
|
use stdx::never;
|
||||||
use triomphe::Arc;
|
use triomphe::Arc;
|
||||||
|
|
||||||
|
@ -34,7 +38,7 @@ mod target;
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
pub struct RustcEnumVariantIdx(pub LocalEnumVariantId);
|
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 {
|
fn new(idx: usize) -> Self {
|
||||||
RustcEnumVariantIdx(Idx::from_raw(RawIdx::from(idx as u32)))
|
RustcEnumVariantIdx(Idx::from_raw(RawIdx::from(idx as u32)))
|
||||||
}
|
}
|
||||||
|
@ -44,9 +48,28 @@ impl rustc_dependencies::index::vec::Idx for RustcEnumVariantIdx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 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)]
|
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||||
pub enum LayoutError {
|
pub enum LayoutError {
|
||||||
|
@ -66,7 +89,7 @@ struct LayoutCx<'a> {
|
||||||
impl<'a> LayoutCalculator for LayoutCx<'a> {
|
impl<'a> LayoutCalculator for LayoutCx<'a> {
|
||||||
type TargetDataLayoutRef = &'a TargetDataLayout;
|
type TargetDataLayoutRef = &'a TargetDataLayout;
|
||||||
|
|
||||||
fn delay_bug(&self, txt: &str) {
|
fn delay_bug(&self, txt: String) {
|
||||||
never!("{}", txt);
|
never!("{}", txt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,6 +168,8 @@ fn layout_of_simd_ty(
|
||||||
largest_niche: e_ly.largest_niche,
|
largest_niche: e_ly.largest_niche,
|
||||||
size,
|
size,
|
||||||
align,
|
align,
|
||||||
|
max_repr_align: None,
|
||||||
|
unadjusted_abi_align: align.abi,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,7 +255,7 @@ pub fn layout_of_ty_query(
|
||||||
.map(|k| db.layout_of_ty(k.assert_ty_ref(Interner).clone(), trait_env.clone()))
|
.map(|k| db.layout_of_ty(k.assert_ty_ref(Interner).clone(), trait_env.clone()))
|
||||||
.collect::<Result<Vec<_>, _>>()?;
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
let fields = fields.iter().map(|it| &**it).collect::<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)?
|
cx.univariant(dl, &fields, &ReprOptions::default(), kind).ok_or(LayoutError::Unknown)?
|
||||||
}
|
}
|
||||||
TyKind::Array(element, count) => {
|
TyKind::Array(element, count) => {
|
||||||
|
@ -255,6 +280,8 @@ pub fn layout_of_ty_query(
|
||||||
largest_niche,
|
largest_niche,
|
||||||
align: element.align,
|
align: element.align,
|
||||||
size,
|
size,
|
||||||
|
max_repr_align: None,
|
||||||
|
unadjusted_abi_align: element.align.abi,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TyKind::Slice(element) => {
|
TyKind::Slice(element) => {
|
||||||
|
@ -266,11 +293,23 @@ pub fn layout_of_ty_query(
|
||||||
largest_niche: None,
|
largest_niche: None,
|
||||||
align: element.align,
|
align: element.align,
|
||||||
size: Size::ZERO,
|
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.
|
// Potentially-wide pointers.
|
||||||
TyKind::Ref(_, _, pointee) | TyKind::Raw(_, pointee) => {
|
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(..)) {
|
if matches!(ty.kind(Interner), TyKind::Ref(..)) {
|
||||||
data_ptr.valid_range_mut().start = 1;
|
data_ptr.valid_range_mut().start = 1;
|
||||||
}
|
}
|
||||||
|
@ -294,7 +333,7 @@ pub fn layout_of_ty_query(
|
||||||
scalar_unit(dl, Primitive::Int(dl.ptr_sized_integer(), false))
|
scalar_unit(dl, Primitive::Int(dl.ptr_sized_integer(), false))
|
||||||
}
|
}
|
||||||
TyKind::Dyn(..) => {
|
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.valid_range_mut().start = 1;
|
||||||
vtable
|
vtable
|
||||||
}
|
}
|
||||||
|
@ -308,22 +347,7 @@ pub fn layout_of_ty_query(
|
||||||
cx.scalar_pair(data_ptr, metadata)
|
cx.scalar_pair(data_ptr, metadata)
|
||||||
}
|
}
|
||||||
TyKind::FnDef(_, _) => layout_of_unit(&cx, dl)?,
|
TyKind::FnDef(_, _) => layout_of_unit(&cx, dl)?,
|
||||||
TyKind::Str => Layout {
|
TyKind::Never => cx.layout_of_never_type(),
|
||||||
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::Dyn(_) | TyKind::Foreign(_) => {
|
TyKind::Dyn(_) | TyKind::Foreign(_) => {
|
||||||
let mut unit = layout_of_unit(&cx, dl)?;
|
let mut unit = layout_of_unit(&cx, dl)?;
|
||||||
match unit.abi {
|
match unit.abi {
|
||||||
|
@ -333,7 +357,7 @@ pub fn layout_of_ty_query(
|
||||||
unit
|
unit
|
||||||
}
|
}
|
||||||
TyKind::Function(_) => {
|
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;
|
ptr.valid_range_mut().start = 1;
|
||||||
Layout::scalar(dl, ptr)
|
Layout::scalar(dl, ptr)
|
||||||
}
|
}
|
||||||
|
@ -363,7 +387,7 @@ pub fn layout_of_ty_query(
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>, _>>()?;
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
let fields = fields.iter().map(|it| &**it).collect::<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)
|
cx.univariant(dl, &fields, &ReprOptions::default(), StructKind::AlwaysSized)
|
||||||
.ok_or(LayoutError::Unknown)?
|
.ok_or(LayoutError::Unknown)?
|
||||||
}
|
}
|
||||||
|
@ -398,9 +422,9 @@ pub fn layout_of_ty_recover(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn layout_of_unit(cx: &LayoutCx<'_>, dl: &TargetDataLayout) -> Result<Layout, LayoutError> {
|
fn layout_of_unit(cx: &LayoutCx<'_>, dl: &TargetDataLayout) -> Result<Layout, LayoutError> {
|
||||||
cx.univariant::<RustcEnumVariantIdx, &&Layout>(
|
cx.univariant::<RustcFieldIdx, RustcEnumVariantIdx, &&Layout>(
|
||||||
dl,
|
dl,
|
||||||
&[],
|
IndexSlice::empty(),
|
||||||
&ReprOptions::default(),
|
&ReprOptions::default(),
|
||||||
StructKind::AlwaysSized,
|
StructKind::AlwaysSized,
|
||||||
)
|
)
|
||||||
|
|
|
@ -8,6 +8,7 @@ use hir_def::{
|
||||||
AdtId, EnumVariantId, LocalEnumVariantId, VariantId,
|
AdtId, EnumVariantId, LocalEnumVariantId, VariantId,
|
||||||
};
|
};
|
||||||
use la_arena::RawIdx;
|
use la_arena::RawIdx;
|
||||||
|
use rustc_dependencies::index::IndexVec;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use triomphe::Arc;
|
use triomphe::Arc;
|
||||||
|
|
||||||
|
@ -20,8 +21,8 @@ use crate::{
|
||||||
|
|
||||||
use super::LayoutCx;
|
use super::LayoutCx;
|
||||||
|
|
||||||
pub(crate) fn struct_variant_idx() -> RustcEnumVariantIdx {
|
pub(crate) const fn struct_variant_idx() -> RustcEnumVariantIdx {
|
||||||
RustcEnumVariantIdx(LocalEnumVariantId::from_raw(RawIdx::from(0)))
|
RustcEnumVariantIdx(LocalEnumVariantId::from_raw(RawIdx::from_u32(0)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn layout_of_adt_query(
|
pub fn layout_of_adt_query(
|
||||||
|
@ -74,7 +75,7 @@ pub fn layout_of_adt_query(
|
||||||
.iter()
|
.iter()
|
||||||
.map(|it| it.iter().map(|it| &**it).collect::<Vec<_>>())
|
.map(|it| it.iter().map(|it| &**it).collect::<Vec<_>>())
|
||||||
.collect::<SmallVec<[_; 1]>>();
|
.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(..)) {
|
let result = if matches!(def, AdtId::UnionId(..)) {
|
||||||
cx.layout_of_union(&repr, &variants).ok_or(LayoutError::Unknown)?
|
cx.layout_of_union(&repr, &variants).ok_or(LayoutError::Unknown)?
|
||||||
} else {
|
} else {
|
||||||
|
@ -105,7 +106,7 @@ pub fn layout_of_adt_query(
|
||||||
&& variants
|
&& variants
|
||||||
.iter()
|
.iter()
|
||||||
.next()
|
.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),
|
.unwrap_or(true),
|
||||||
)
|
)
|
||||||
.ok_or(LayoutError::SizeOverflow)?
|
.ok_or(LayoutError::SizeOverflow)?
|
||||||
|
|
|
@ -64,7 +64,7 @@ use hir_ty::{
|
||||||
consteval::{try_const_usize, unknown_const_as_generic, ConstEvalError, ConstExt},
|
consteval::{try_const_usize, unknown_const_as_generic, ConstEvalError, ConstExt},
|
||||||
diagnostics::BodyValidationDiagnostic,
|
diagnostics::BodyValidationDiagnostic,
|
||||||
known_const_to_ast,
|
known_const_to_ast,
|
||||||
layout::{Layout as TyLayout, RustcEnumVariantIdx, TagEncoding},
|
layout::{Layout as TyLayout, RustcEnumVariantIdx, RustcFieldIdx, TagEncoding},
|
||||||
method_resolution::{self, TyFingerprint},
|
method_resolution::{self, TyFingerprint},
|
||||||
mir::{self, interpret_mir},
|
mir::{self, interpret_mir},
|
||||||
primitive::UintTy,
|
primitive::UintTy,
|
||||||
|
@ -4540,15 +4540,31 @@ impl Layout {
|
||||||
Some(self.0.largest_niche?.available(&*self.1))
|
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 {
|
match self.0.fields {
|
||||||
layout::FieldsShape::Primitive => None,
|
layout::FieldsShape::Primitive => None,
|
||||||
layout::FieldsShape::Union(_) => Some(0),
|
layout::FieldsShape::Union(_) => Some(0),
|
||||||
layout::FieldsShape::Array { stride, count } => {
|
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())
|
(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())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -402,10 +402,9 @@ pub(super) fn definition(
|
||||||
|&it| it.layout(db),
|
|&it| it.layout(db),
|
||||||
|_| {
|
|_| {
|
||||||
let var_def = it.parent_def(db);
|
let var_def = it.parent_def(db);
|
||||||
let id = it.index();
|
|
||||||
match var_def {
|
match var_def {
|
||||||
hir::VariantDef::Struct(s) => {
|
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,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ impl fmt::Display for RecursiveMemoryLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
enum FieldOrTupleIdx {
|
enum FieldOrTupleIdx {
|
||||||
Field(Field),
|
Field(Field),
|
||||||
TupleIdx(usize),
|
TupleIdx(usize),
|
||||||
|
@ -71,13 +72,6 @@ impl FieldOrTupleIdx {
|
||||||
FieldOrTupleIdx::TupleIdx(i) => format!(".{i}").to_owned(),
|
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
|
// Feature: View Memory Layout
|
||||||
|
@ -138,7 +132,10 @@ pub(crate) fn view_memory_layout(
|
||||||
return;
|
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();
|
let children_start = nodes.len();
|
||||||
nodes[parent_idx].children_start = children_start as i64;
|
nodes[parent_idx].children_start = children_start as i64;
|
||||||
|
@ -151,7 +148,10 @@ pub(crate) fn view_memory_layout(
|
||||||
typename: child_ty.display(db).to_string(),
|
typename: child_ty.display(db).to_string(),
|
||||||
size: child_layout.size(),
|
size: child_layout.size(),
|
||||||
alignment: child_layout.align(),
|
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,
|
parent_idx: parent_idx as i64,
|
||||||
children_start: -1,
|
children_start: -1,
|
||||||
children_len: 0,
|
children_len: 0,
|
||||||
|
|
|
@ -11,12 +11,10 @@ authors.workspace = true
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ra-ap-rustc_lexer = { version = "0.10.0" }
|
ra-ap-rustc_lexer = { version = "0.14.0" }
|
||||||
ra-ap-rustc_parse_format = { version = "0.10.0", default-features = false }
|
ra-ap-rustc_parse_format = { version = "0.14.0", default-features = false }
|
||||||
|
ra-ap-rustc_index = { version = "0.14.0", default-features = false }
|
||||||
# Upstream broke this for us so we can't update it
|
ra-ap-rustc_abi = { version = "0.14.0", default-features = false }
|
||||||
hkalbasi-rustc-ap-rustc_abi = { version = "0.0.20221221", default-features = false }
|
|
||||||
hkalbasi-rustc-ap-rustc_index = { version = "0.0.20221221", default-features = false }
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
in-rust-tree = []
|
in-rust-tree = []
|
||||||
|
|
|
@ -6,34 +6,43 @@
|
||||||
#[cfg(feature = "in-rust-tree")]
|
#[cfg(feature = "in-rust-tree")]
|
||||||
extern crate rustc_lexer;
|
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 {
|
pub mod lexer {
|
||||||
|
#[cfg(not(feature = "in-rust-tree"))]
|
||||||
pub use ::ra_ap_rustc_lexer::*;
|
pub use ::ra_ap_rustc_lexer::*;
|
||||||
|
|
||||||
|
#[cfg(feature = "in-rust-tree")]
|
||||||
|
pub use ::rustc_lexer::*;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "in-rust-tree")]
|
#[cfg(feature = "in-rust-tree")]
|
||||||
extern crate rustc_parse_format;
|
extern crate rustc_parse_format;
|
||||||
|
|
||||||
#[cfg(feature = "in-rust-tree")]
|
|
||||||
pub mod parse_format {
|
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::*;
|
pub use ::rustc_parse_format::*;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "in-rust-tree"))]
|
#[cfg(feature = "in-rust-tree")]
|
||||||
pub mod parse_format {
|
extern crate rustc_abi;
|
||||||
pub use ::ra_ap_rustc_parse_format::*;
|
|
||||||
|
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
|
#[cfg(feature = "in-rust-tree")]
|
||||||
pub mod abi {
|
extern crate rustc_index;
|
||||||
pub use ::hkalbasi_rustc_ap_rustc_abi::*;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub mod 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::*;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue