1
Fork 0

Generalize BaseTypeCodegenMethods

This commit is contained in:
Oli Scherer 2025-02-24 11:31:43 +00:00 committed by Oli Scherer
parent 75356b7437
commit 840e31b29f
6 changed files with 35 additions and 29 deletions

View file

@ -123,7 +123,7 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> {
} }
} }
impl<'gcc, 'tcx> BaseTypeCodegenMethods<'tcx> for CodegenCx<'gcc, 'tcx> { impl<'gcc, 'tcx> BaseTypeCodegenMethods for CodegenCx<'gcc, 'tcx> {
fn type_i8(&self) -> Type<'gcc> { fn type_i8(&self) -> Type<'gcc> {
self.i8_type self.i8_type
} }

View file

@ -286,7 +286,8 @@ pub(crate) fn differentiate<'ll>(
} }
let diag_handler = cgcx.create_dcx(); let diag_handler = cgcx.create_dcx();
let cx = SimpleCx::new(module.module_llvm.llmod(), module.module_llvm.llcx);
let cx = SimpleCx::new(module.module_llvm.llmod(), module.module_llvm.llcx, cgcx.pointer_size);
// First of all, did the user try to use autodiff without using the -Zautodiff=Enable flag? // First of all, did the user try to use autodiff without using the -Zautodiff=Enable flag?
if !diff_items.is_empty() if !diff_items.is_empty()

View file

@ -5,7 +5,7 @@ use std::marker::PhantomData;
use std::ops::Deref; use std::ops::Deref;
use std::str; use std::str;
use rustc_abi::{HasDataLayout, TargetDataLayout, VariantIdx}; use rustc_abi::{HasDataLayout, Size, TargetDataLayout, VariantIdx};
use rustc_codegen_ssa::back::versioned_llvm_target; use rustc_codegen_ssa::back::versioned_llvm_target;
use rustc_codegen_ssa::base::{wants_msvc_seh, wants_wasm_eh}; use rustc_codegen_ssa::base::{wants_msvc_seh, wants_wasm_eh};
use rustc_codegen_ssa::common::TypeKind; use rustc_codegen_ssa::common::TypeKind;
@ -47,6 +47,7 @@ use crate::{attributes, coverageinfo, debuginfo, llvm, llvm_util};
pub(crate) struct SCx<'ll> { pub(crate) struct SCx<'ll> {
pub llmod: &'ll llvm::Module, pub llmod: &'ll llvm::Module,
pub llcx: &'ll llvm::Context, pub llcx: &'ll llvm::Context,
pub isize_ty: &'ll Type,
} }
impl<'ll> Borrow<SCx<'ll>> for FullCx<'ll, '_> { impl<'ll> Borrow<SCx<'ll>> for FullCx<'ll, '_> {
@ -120,8 +121,6 @@ pub(crate) struct FullCx<'ll, 'tcx> {
/// Mapping of scalar types to llvm types. /// Mapping of scalar types to llvm types.
pub scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'ll Type>>, pub scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'ll Type>>,
pub isize_ty: &'ll Type,
/// Extra per-CGU codegen state needed when coverage instrumentation is enabled. /// Extra per-CGU codegen state needed when coverage instrumentation is enabled.
pub coverage_cx: Option<coverageinfo::CguCoverageContext<'ll, 'tcx>>, pub coverage_cx: Option<coverageinfo::CguCoverageContext<'ll, 'tcx>>,
pub dbg_cx: Option<debuginfo::CodegenUnitDebugContext<'ll, 'tcx>>, pub dbg_cx: Option<debuginfo::CodegenUnitDebugContext<'ll, 'tcx>>,
@ -595,12 +594,10 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
None None
}; };
let isize_ty = Type::ix_llcx(llcx, tcx.data_layout.pointer_size.bits());
GenericCx( GenericCx(
FullCx { FullCx {
tcx, tcx,
scx: SimpleCx::new(llmod, llcx), scx: SimpleCx::new(llmod, llcx, tcx.data_layout.pointer_size),
use_dll_storage_attrs, use_dll_storage_attrs,
tls_model, tls_model,
codegen_unit, codegen_unit,
@ -613,7 +610,6 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
compiler_used_statics: RefCell::new(Vec::new()), compiler_used_statics: RefCell::new(Vec::new()),
type_lowering: Default::default(), type_lowering: Default::default(),
scalar_lltypes: Default::default(), scalar_lltypes: Default::default(),
isize_ty,
coverage_cx, coverage_cx,
dbg_cx, dbg_cx,
eh_personality: Cell::new(None), eh_personality: Cell::new(None),
@ -649,8 +645,13 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
} }
impl<'ll> SimpleCx<'ll> { impl<'ll> SimpleCx<'ll> {
pub(crate) fn new(llmod: &'ll llvm::Module, llcx: &'ll llvm::Context) -> Self { pub(crate) fn new(
Self(SCx { llmod, llcx }, PhantomData) llmod: &'ll llvm::Module,
llcx: &'ll llvm::Context,
pointer_size: Size,
) -> Self {
let isize_ty = llvm::Type::ix_llcx(llcx, pointer_size.bits());
Self(SCx { llmod, llcx, isize_ty }, PhantomData)
} }
pub(crate) fn val_ty(&self, v: &'ll Value) -> &'ll Type { pub(crate) fn val_ty(&self, v: &'ll Value) -> &'ll Type {

View file

@ -128,6 +128,10 @@ impl<'ll, CX: Borrow<SCx<'ll>>> GenericCx<'ll, CX> {
(**self).borrow().llcx (**self).borrow().llcx
} }
pub(crate) fn isize_ty(&self) -> &'ll Type {
(**self).borrow().isize_ty
}
pub(crate) fn type_variadic_func(&self, args: &[&'ll Type], ret: &'ll Type) -> &'ll Type { pub(crate) fn type_variadic_func(&self, args: &[&'ll Type], ret: &'ll Type) -> &'ll Type {
unsafe { llvm::LLVMFunctionType(ret, args.as_ptr(), args.len() as c_uint, True) } unsafe { llvm::LLVMFunctionType(ret, args.as_ptr(), args.len() as c_uint, True) }
} }
@ -148,45 +152,45 @@ impl<'ll, CX: Borrow<SCx<'ll>>> GenericCx<'ll, CX> {
} }
} }
impl<'ll, 'tcx> BaseTypeCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> { impl<'ll, CX: Borrow<SCx<'ll>>> BaseTypeCodegenMethods for GenericCx<'ll, CX> {
fn type_i8(&self) -> &'ll Type { fn type_i8(&self) -> &'ll Type {
unsafe { llvm::LLVMInt8TypeInContext(self.llcx) } unsafe { llvm::LLVMInt8TypeInContext(self.llcx()) }
} }
fn type_i16(&self) -> &'ll Type { fn type_i16(&self) -> &'ll Type {
unsafe { llvm::LLVMInt16TypeInContext(self.llcx) } unsafe { llvm::LLVMInt16TypeInContext(self.llcx()) }
} }
fn type_i32(&self) -> &'ll Type { fn type_i32(&self) -> &'ll Type {
unsafe { llvm::LLVMInt32TypeInContext(self.llcx) } unsafe { llvm::LLVMInt32TypeInContext(self.llcx()) }
} }
fn type_i64(&self) -> &'ll Type { fn type_i64(&self) -> &'ll Type {
unsafe { llvm::LLVMInt64TypeInContext(self.llcx) } unsafe { llvm::LLVMInt64TypeInContext(self.llcx()) }
} }
fn type_i128(&self) -> &'ll Type { fn type_i128(&self) -> &'ll Type {
unsafe { llvm::LLVMIntTypeInContext(self.llcx, 128) } unsafe { llvm::LLVMIntTypeInContext(self.llcx(), 128) }
} }
fn type_isize(&self) -> &'ll Type { fn type_isize(&self) -> &'ll Type {
self.isize_ty self.isize_ty()
} }
fn type_f16(&self) -> &'ll Type { fn type_f16(&self) -> &'ll Type {
unsafe { llvm::LLVMHalfTypeInContext(self.llcx) } unsafe { llvm::LLVMHalfTypeInContext(self.llcx()) }
} }
fn type_f32(&self) -> &'ll Type { fn type_f32(&self) -> &'ll Type {
unsafe { llvm::LLVMFloatTypeInContext(self.llcx) } unsafe { llvm::LLVMFloatTypeInContext(self.llcx()) }
} }
fn type_f64(&self) -> &'ll Type { fn type_f64(&self) -> &'ll Type {
unsafe { llvm::LLVMDoubleTypeInContext(self.llcx) } unsafe { llvm::LLVMDoubleTypeInContext(self.llcx()) }
} }
fn type_f128(&self) -> &'ll Type { fn type_f128(&self) -> &'ll Type {
unsafe { llvm::LLVMFP128TypeInContext(self.llcx) } unsafe { llvm::LLVMFP128TypeInContext(self.llcx()) }
} }
fn type_func(&self, args: &[&'ll Type], ret: &'ll Type) -> &'ll Type { fn type_func(&self, args: &[&'ll Type], ret: &'ll Type) -> &'ll Type {
@ -202,7 +206,7 @@ impl<'ll, 'tcx> BaseTypeCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
} }
fn type_ptr_ext(&self, address_space: AddressSpace) -> &'ll Type { fn type_ptr_ext(&self, address_space: AddressSpace) -> &'ll Type {
unsafe { llvm::LLVMPointerTypeInContext(self.llcx, address_space.0) } unsafe { llvm::LLVMPointerTypeInContext(self.llcx(), address_space.0) }
} }
fn element_type(&self, ty: &'ll Type) -> &'ll Type { fn element_type(&self, ty: &'ll Type) -> &'ll Type {

View file

@ -6,6 +6,7 @@ use std::sync::Arc;
use std::sync::mpsc::{Receiver, Sender, channel}; use std::sync::mpsc::{Receiver, Sender, channel};
use std::{fs, io, mem, str, thread}; use std::{fs, io, mem, str, thread};
use rustc_abi::Size;
use rustc_ast::attr; use rustc_ast::attr;
use rustc_ast::expand::autodiff_attrs::AutoDiffItem; use rustc_ast::expand::autodiff_attrs::AutoDiffItem;
use rustc_data_structures::fx::{FxHashMap, FxIndexMap}; use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
@ -351,6 +352,7 @@ pub struct CodegenContext<B: WriteBackendMethods> {
pub target_is_like_aix: bool, pub target_is_like_aix: bool,
pub split_debuginfo: rustc_target::spec::SplitDebuginfo, pub split_debuginfo: rustc_target::spec::SplitDebuginfo,
pub split_dwarf_kind: rustc_session::config::SplitDwarfKind, pub split_dwarf_kind: rustc_session::config::SplitDwarfKind,
pub pointer_size: Size,
/// All commandline args used to invoke the compiler, with @file args fully expanded. /// All commandline args used to invoke the compiler, with @file args fully expanded.
/// This will only be used within debug info, e.g. in the pdb file on windows /// This will only be used within debug info, e.g. in the pdb file on windows
@ -1212,6 +1214,7 @@ fn start_executing_work<B: ExtraBackendMethods>(
split_debuginfo: tcx.sess.split_debuginfo(), split_debuginfo: tcx.sess.split_debuginfo(),
split_dwarf_kind: tcx.sess.opts.unstable_opts.split_dwarf_kind, split_dwarf_kind: tcx.sess.opts.unstable_opts.split_dwarf_kind,
parallel: backend.supports_parallel() && !sess.opts.unstable_opts.no_parallel_backend, parallel: backend.supports_parallel() && !sess.opts.unstable_opts.no_parallel_backend,
pointer_size: tcx.data_layout.pointer_size,
}; };
// This is the "main loop" of parallel work happening for parallel codegen. // This is the "main loop" of parallel work happening for parallel codegen.

View file

@ -9,7 +9,7 @@ use super::misc::MiscCodegenMethods;
use crate::common::TypeKind; use crate::common::TypeKind;
use crate::mir::place::PlaceRef; use crate::mir::place::PlaceRef;
pub trait BaseTypeCodegenMethods<'tcx>: BackendTypes { pub trait BaseTypeCodegenMethods: BackendTypes {
fn type_i8(&self) -> Self::Type; fn type_i8(&self) -> Self::Type;
fn type_i16(&self) -> Self::Type; fn type_i16(&self) -> Self::Type;
fn type_i32(&self) -> Self::Type; fn type_i32(&self) -> Self::Type;
@ -41,7 +41,7 @@ pub trait BaseTypeCodegenMethods<'tcx>: BackendTypes {
} }
pub trait DerivedTypeCodegenMethods<'tcx>: pub trait DerivedTypeCodegenMethods<'tcx>:
BaseTypeCodegenMethods<'tcx> + MiscCodegenMethods<'tcx> + HasTyCtxt<'tcx> + HasTypingEnv<'tcx> BaseTypeCodegenMethods + MiscCodegenMethods<'tcx> + HasTyCtxt<'tcx> + HasTypingEnv<'tcx>
{ {
fn type_int(&self) -> Self::Type { fn type_int(&self) -> Self::Type {
match &self.sess().target.c_int_width[..] { match &self.sess().target.c_int_width[..] {
@ -100,10 +100,7 @@ pub trait DerivedTypeCodegenMethods<'tcx>:
} }
impl<'tcx, T> DerivedTypeCodegenMethods<'tcx> for T where impl<'tcx, T> DerivedTypeCodegenMethods<'tcx> for T where
Self: BaseTypeCodegenMethods<'tcx> Self: BaseTypeCodegenMethods + MiscCodegenMethods<'tcx> + HasTyCtxt<'tcx> + HasTypingEnv<'tcx>
+ MiscCodegenMethods<'tcx>
+ HasTyCtxt<'tcx>
+ HasTypingEnv<'tcx>
{ {
} }