mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-01 15:01:51 +00:00
commit
113f17be6e
8
Cargo.lock
generated
8
Cargo.lock
generated
@ -586,9 +586,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hkalbasi-rustc-ap-rustc_abi"
|
name = "hkalbasi-rustc-ap-rustc_abi"
|
||||||
version = "0.0.20221125"
|
version = "0.0.20221221"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "29c8368a30e518c0102d670d8515f7d424d875ee615ec7a7b6d29217b57a0371"
|
checksum = "adabaadad9aa7576f97af02241cdf5554d62fb3d51a84cb05d77ba28edd3013f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"hkalbasi-rustc-ap-rustc_index",
|
"hkalbasi-rustc-ap-rustc_index",
|
||||||
@ -597,9 +597,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hkalbasi-rustc-ap-rustc_index"
|
name = "hkalbasi-rustc-ap-rustc_index"
|
||||||
version = "0.0.20221125"
|
version = "0.0.20221221"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c07bba80d7f6a8e1efb0f3e2115ef1eecbf97292dc8cad84e4982226b9aa12e2"
|
checksum = "f4d3c48474e09afb0f5efbd6f758e05411699301a113c47d454d28ec7059d00e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
|
@ -33,8 +33,8 @@ base-db = { path = "../base-db", version = "0.0.0" }
|
|||||||
syntax = { path = "../syntax", version = "0.0.0" }
|
syntax = { path = "../syntax", version = "0.0.0" }
|
||||||
profile = { path = "../profile", version = "0.0.0" }
|
profile = { path = "../profile", version = "0.0.0" }
|
||||||
hir-expand = { path = "../hir-expand", version = "0.0.0" }
|
hir-expand = { path = "../hir-expand", version = "0.0.0" }
|
||||||
rustc_abi = { version = "0.0.20221125", package = "hkalbasi-rustc-ap-rustc_abi", default-features = false }
|
rustc_abi = { version = "0.0.20221221", package = "hkalbasi-rustc-ap-rustc_abi", default-features = false }
|
||||||
rustc_index = { version = "0.0.20221125", package = "hkalbasi-rustc-ap-rustc_index", default-features = false }
|
rustc_index = { version = "0.0.20221221", package = "hkalbasi-rustc-ap-rustc_index", default-features = false }
|
||||||
mbe = { path = "../mbe", version = "0.0.0" }
|
mbe = { path = "../mbe", version = "0.0.0" }
|
||||||
cfg = { path = "../cfg", version = "0.0.0" }
|
cfg = { path = "../cfg", version = "0.0.0" }
|
||||||
tt = { path = "../tt", version = "0.0.0" }
|
tt = { path = "../tt", version = "0.0.0" }
|
||||||
|
@ -25,7 +25,7 @@ chalk-derive = "0.88.0"
|
|||||||
la-arena = { version = "0.3.0", path = "../../lib/la-arena" }
|
la-arena = { version = "0.3.0", path = "../../lib/la-arena" }
|
||||||
once_cell = "1.15.0"
|
once_cell = "1.15.0"
|
||||||
typed-arena = "2.0.1"
|
typed-arena = "2.0.1"
|
||||||
rustc_index = { version = "0.0.20221125", package = "hkalbasi-rustc-ap-rustc_index", default-features = false }
|
rustc_index = { version = "0.0.20221221", package = "hkalbasi-rustc-ap-rustc_index", default-features = false }
|
||||||
|
|
||||||
stdx = { path = "../stdx", version = "0.0.0" }
|
stdx = { path = "../stdx", version = "0.0.0" }
|
||||||
hir-def = { path = "../hir-def", version = "0.0.0" }
|
hir-def = { path = "../hir-def", version = "0.0.0" }
|
||||||
|
@ -3,12 +3,10 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use base_db::CrateId;
|
use base_db::CrateId;
|
||||||
use hir_def::layout::{TargetDataLayout, TargetDataLayoutErrors};
|
use hir_def::layout::{Endian, Size, TargetDataLayout};
|
||||||
|
|
||||||
use crate::db::HirDatabase;
|
use crate::db::HirDatabase;
|
||||||
|
|
||||||
use hir_def::layout::{AbiAndPrefAlign, AddressSpace, Align, Endian, Size};
|
|
||||||
|
|
||||||
pub fn target_data_layout_query(db: &dyn HirDatabase, krate: CrateId) -> Arc<TargetDataLayout> {
|
pub fn target_data_layout_query(db: &dyn HirDatabase, krate: CrateId) -> Arc<TargetDataLayout> {
|
||||||
let crate_graph = db.crate_graph();
|
let crate_graph = db.crate_graph();
|
||||||
let target_layout = &crate_graph[krate].target_layout;
|
let target_layout = &crate_graph[krate].target_layout;
|
||||||
@ -16,7 +14,7 @@ pub fn target_data_layout_query(db: &dyn HirDatabase, krate: CrateId) -> Arc<Tar
|
|||||||
Arc::new(
|
Arc::new(
|
||||||
target_layout
|
target_layout
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|it| parse_from_llvm_datalayout_string(it).ok())
|
.and_then(|it| TargetDataLayout::parse_from_llvm_datalayout_string(it).ok())
|
||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| {
|
||||||
let endian = match cfg_options.get_cfg_values("target_endian").next() {
|
let endian = match cfg_options.get_cfg_values("target_endian").next() {
|
||||||
Some(x) if x.as_str() == "big" => Endian::Big,
|
Some(x) if x.as_str() == "big" => Endian::Big,
|
||||||
@ -36,96 +34,3 @@ pub fn target_data_layout_query(db: &dyn HirDatabase, krate: CrateId) -> Arc<Tar
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// copied from rustc as it is not exposed yet
|
|
||||||
fn parse_from_llvm_datalayout_string<'a>(
|
|
||||||
input: &'a str,
|
|
||||||
) -> Result<TargetDataLayout, TargetDataLayoutErrors<'a>> {
|
|
||||||
// Parse an address space index from a string.
|
|
||||||
let parse_address_space = |s: &'a str, cause: &'a str| {
|
|
||||||
s.parse::<u32>().map(AddressSpace).map_err(|err| {
|
|
||||||
TargetDataLayoutErrors::InvalidAddressSpace { addr_space: s, cause, err }
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parse a bit count from a string.
|
|
||||||
let parse_bits = |s: &'a str, kind: &'a str, cause: &'a str| {
|
|
||||||
s.parse::<u64>().map_err(|err| TargetDataLayoutErrors::InvalidBits {
|
|
||||||
kind,
|
|
||||||
bit: s,
|
|
||||||
cause,
|
|
||||||
err,
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parse a size string.
|
|
||||||
let size = |s: &'a str, cause: &'a str| parse_bits(s, "size", cause).map(Size::from_bits);
|
|
||||||
|
|
||||||
// Parse an alignment string.
|
|
||||||
let align = |s: &[&'a str], cause: &'a str| {
|
|
||||||
if s.is_empty() {
|
|
||||||
return Err(TargetDataLayoutErrors::MissingAlignment { cause });
|
|
||||||
}
|
|
||||||
let align_from_bits = |bits| {
|
|
||||||
Align::from_bits(bits)
|
|
||||||
.map_err(|err| TargetDataLayoutErrors::InvalidAlignment { cause, err })
|
|
||||||
};
|
|
||||||
let abi = parse_bits(s[0], "alignment", cause)?;
|
|
||||||
let pref = s.get(1).map_or(Ok(abi), |pref| parse_bits(pref, "alignment", cause))?;
|
|
||||||
Ok(AbiAndPrefAlign { abi: align_from_bits(abi)?, pref: align_from_bits(pref)? })
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut dl = TargetDataLayout::default();
|
|
||||||
let mut i128_align_src = 64;
|
|
||||||
for spec in input.split('-') {
|
|
||||||
let spec_parts = spec.split(':').collect::<Vec<_>>();
|
|
||||||
|
|
||||||
match &*spec_parts {
|
|
||||||
["e"] => dl.endian = Endian::Little,
|
|
||||||
["E"] => dl.endian = Endian::Big,
|
|
||||||
[p] if p.starts_with('P') => {
|
|
||||||
dl.instruction_address_space = parse_address_space(&p[1..], "P")?
|
|
||||||
}
|
|
||||||
["a", ref a @ ..] => dl.aggregate_align = align(a, "a")?,
|
|
||||||
["f32", ref a @ ..] => dl.f32_align = align(a, "f32")?,
|
|
||||||
["f64", ref a @ ..] => dl.f64_align = align(a, "f64")?,
|
|
||||||
[p @ "p", s, ref a @ ..] | [p @ "p0", s, ref a @ ..] => {
|
|
||||||
dl.pointer_size = size(s, p)?;
|
|
||||||
dl.pointer_align = align(a, p)?;
|
|
||||||
}
|
|
||||||
[s, ref a @ ..] if s.starts_with('i') => {
|
|
||||||
let Ok(bits) = s[1..].parse::<u64>() else {
|
|
||||||
size(&s[1..], "i")?; // For the user error.
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
let a = align(a, s)?;
|
|
||||||
match bits {
|
|
||||||
1 => dl.i1_align = a,
|
|
||||||
8 => dl.i8_align = a,
|
|
||||||
16 => dl.i16_align = a,
|
|
||||||
32 => dl.i32_align = a,
|
|
||||||
64 => dl.i64_align = a,
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
if bits >= i128_align_src && bits <= 128 {
|
|
||||||
// Default alignment for i128 is decided by taking the alignment of
|
|
||||||
// largest-sized i{64..=128}.
|
|
||||||
i128_align_src = bits;
|
|
||||||
dl.i128_align = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[s, ref a @ ..] if s.starts_with('v') => {
|
|
||||||
let v_size = size(&s[1..], "v")?;
|
|
||||||
let a = align(a, s)?;
|
|
||||||
if let Some(v) = dl.vector_align.iter_mut().find(|v| v.0 == v_size) {
|
|
||||||
v.1 = a;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// No existing entry, add a new one.
|
|
||||||
dl.vector_align.push((v_size, a));
|
|
||||||
}
|
|
||||||
_ => {} // Ignore everything else.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(dl)
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user