]> git.lizzy.rs Git - rust.git/blob - src/tools/rust-analyzer/crates/hir-ty/src/layout/target.rs
Auto merge of #107843 - bjorn3:sync_cg_clif-2023-02-09, r=bjorn3
[rust.git] / src / tools / rust-analyzer / crates / hir-ty / src / layout / target.rs
1 //! Target dependent parameters needed for layouts
2
3 use std::sync::Arc;
4
5 use base_db::CrateId;
6 use hir_def::layout::{Endian, Size, TargetDataLayout};
7
8 use crate::db::HirDatabase;
9
10 pub fn target_data_layout_query(db: &dyn HirDatabase, krate: CrateId) -> Arc<TargetDataLayout> {
11     let crate_graph = db.crate_graph();
12     let target_layout = &crate_graph[krate].target_layout;
13     let cfg_options = &crate_graph[krate].cfg_options;
14     Arc::new(
15         target_layout
16             .as_ref()
17             .and_then(|it| TargetDataLayout::parse_from_llvm_datalayout_string(it).ok())
18             .unwrap_or_else(|| {
19                 let endian = match cfg_options.get_cfg_values("target_endian").next() {
20                     Some(x) if x.as_str() == "big" => Endian::Big,
21                     _ => Endian::Little,
22                 };
23                 let pointer_size = Size::from_bytes(
24                     match cfg_options.get_cfg_values("target_pointer_width").next() {
25                         Some(x) => match x.as_str() {
26                             "16" => 2,
27                             "32" => 4,
28                             _ => 8,
29                         },
30                         _ => 8,
31                     },
32                 );
33                 TargetDataLayout { endian, pointer_size, ..TargetDataLayout::default() }
34             }),
35     )
36 }