| //! Implementation of CompilerCtxt. |
| |
| #![allow(rustc::usage_of_qualified_ty)] |
| |
| use std::marker::PhantomData; |
| |
| use rustc_abi::HasDataLayout; |
| use rustc_middle::ty; |
| use rustc_middle::ty::layout::{FnAbiOfHelpers, HasTyCtxt, HasTypingEnv, LayoutOfHelpers}; |
| use rustc_middle::ty::{Ty, TyCtxt}; |
| |
| use crate::{Bridge, Error}; |
| |
| mod helpers; |
| mod impls; |
| |
| pub use helpers::*; |
| |
| /// Provides direct access to rustc's internal queries. |
| /// |
| /// `CompilerInterface` must go through |
| /// this context to obtain internal information. |
| pub struct CompilerCtxt<'tcx, B: Bridge> { |
| pub tcx: TyCtxt<'tcx>, |
| _marker: PhantomData<B>, |
| } |
| |
| impl<'tcx, B: Bridge> CompilerCtxt<'tcx, B> { |
| pub fn new(tcx: TyCtxt<'tcx>) -> Self { |
| Self { tcx, _marker: Default::default() } |
| } |
| } |
| |
| /// Implement error handling for extracting function ABI information. |
| impl<'tcx, B: Bridge> FnAbiOfHelpers<'tcx> for CompilerCtxt<'tcx, B> { |
| type FnAbiOfResult = Result<&'tcx rustc_target::callconv::FnAbi<'tcx, Ty<'tcx>>, B::Error>; |
| |
| #[inline] |
| fn handle_fn_abi_err( |
| &self, |
| err: ty::layout::FnAbiError<'tcx>, |
| _span: rustc_span::Span, |
| fn_abi_request: ty::layout::FnAbiRequest<'tcx>, |
| ) -> B::Error { |
| B::Error::new(format!("Failed to get ABI for `{fn_abi_request:?}`: {err:?}")) |
| } |
| } |
| |
| impl<'tcx, B: Bridge> LayoutOfHelpers<'tcx> for CompilerCtxt<'tcx, B> { |
| type LayoutOfResult = Result<ty::layout::TyAndLayout<'tcx>, B::Error>; |
| |
| #[inline] |
| fn handle_layout_err( |
| &self, |
| err: ty::layout::LayoutError<'tcx>, |
| _span: rustc_span::Span, |
| ty: Ty<'tcx>, |
| ) -> B::Error { |
| B::Error::new(format!("Failed to get layout for `{ty}`: {err}")) |
| } |
| } |
| |
| impl<'tcx, B: Bridge> HasTypingEnv<'tcx> for CompilerCtxt<'tcx, B> { |
| fn typing_env(&self) -> ty::TypingEnv<'tcx> { |
| ty::TypingEnv::fully_monomorphized() |
| } |
| } |
| |
| impl<'tcx, B: Bridge> HasTyCtxt<'tcx> for CompilerCtxt<'tcx, B> { |
| fn tcx(&self) -> TyCtxt<'tcx> { |
| self.tcx |
| } |
| } |
| |
| impl<'tcx, B: Bridge> HasDataLayout for CompilerCtxt<'tcx, B> { |
| fn data_layout(&self) -> &rustc_abi::TargetDataLayout { |
| self.tcx.data_layout() |
| } |
| } |