2022-10-23 11:42:05 +03:30
|
|
|
//! Target dependent parameters needed for layouts
|
|
|
|
|
|
|
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
2022-12-21 15:11:24 +01:00
|
|
|
use base_db::CrateId;
|
2022-12-21 21:34:01 +01:00
|
|
|
use hir_def::layout::{Endian, Size, TargetDataLayout};
|
2022-10-23 11:42:05 +03:30
|
|
|
|
|
|
|
|
use crate::db::HirDatabase;
|
|
|
|
|
|
2022-12-21 15:11:24 +01:00
|
|
|
pub fn target_data_layout_query(db: &dyn HirDatabase, krate: CrateId) -> Arc<TargetDataLayout> {
|
2022-10-23 11:42:05 +03:30
|
|
|
let crate_graph = db.crate_graph();
|
2022-12-21 15:11:24 +01:00
|
|
|
let target_layout = &crate_graph[krate].target_layout;
|
|
|
|
|
let cfg_options = &crate_graph[krate].cfg_options;
|
|
|
|
|
Arc::new(
|
|
|
|
|
target_layout
|
|
|
|
|
.as_ref()
|
2022-12-21 21:34:01 +01:00
|
|
|
.and_then(|it| TargetDataLayout::parse_from_llvm_datalayout_string(it).ok())
|
2022-12-21 15:11:24 +01:00
|
|
|
.unwrap_or_else(|| {
|
|
|
|
|
let endian = match cfg_options.get_cfg_values("target_endian").next() {
|
|
|
|
|
Some(x) if x.as_str() == "big" => Endian::Big,
|
|
|
|
|
_ => Endian::Little,
|
|
|
|
|
};
|
|
|
|
|
let pointer_size = Size::from_bytes(
|
|
|
|
|
match cfg_options.get_cfg_values("target_pointer_width").next() {
|
|
|
|
|
Some(x) => match x.as_str() {
|
|
|
|
|
"16" => 2,
|
|
|
|
|
"32" => 4,
|
|
|
|
|
_ => 8,
|
|
|
|
|
},
|
|
|
|
|
_ => 8,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
TargetDataLayout { endian, pointer_size, ..TargetDataLayout::default() }
|
|
|
|
|
}),
|
|
|
|
|
)
|
|
|
|
|
}
|