Rollup merge of #104045 - Ayush1325:type_array, r=nikic
Add type_array to BaseTypeMethods Moved `type_array` function to `rustc_codegen_ssa::BaseTypeMethods` trait. This allows using normal `alloca` function to create arrays as suggested in https://github.com/rust-lang/rust/pull/104022. Signed-off-by: Ayush Singh <ayushsingh1325@gmail.com>
This commit is contained in:
commit
06e261aaf5
@ -201,6 +201,27 @@ fn int_width(&self, typ: Type<'gcc>) -> u64 {
|
|||||||
fn val_ty(&self, value: RValue<'gcc>) -> Type<'gcc> {
|
fn val_ty(&self, value: RValue<'gcc>) -> Type<'gcc> {
|
||||||
value.get_type()
|
value.get_type()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn type_array(&self, ty: Type<'gcc>, mut len: u64) -> Type<'gcc> {
|
||||||
|
if let Some(struct_type) = ty.is_struct() {
|
||||||
|
if struct_type.get_field_count() == 0 {
|
||||||
|
// NOTE: since gccjit only supports i32 for the array size and libcore's tests uses a
|
||||||
|
// size of usize::MAX in test_binary_search, we workaround this by setting the size to
|
||||||
|
// zero for ZSTs.
|
||||||
|
// FIXME(antoyo): fix gccjit API.
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: see note above. Some other test uses usize::MAX.
|
||||||
|
if len == u64::MAX {
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
let len: i32 = len.try_into().expect("array len");
|
||||||
|
|
||||||
|
self.context.new_array_type(None, ty, len)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> {
|
impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> {
|
||||||
@ -227,27 +248,6 @@ pub fn type_named_struct(&self, name: &str) -> Struct<'gcc> {
|
|||||||
self.context.new_opaque_struct_type(None, name)
|
self.context.new_opaque_struct_type(None, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn type_array(&self, ty: Type<'gcc>, mut len: u64) -> Type<'gcc> {
|
|
||||||
if let Some(struct_type) = ty.is_struct() {
|
|
||||||
if struct_type.get_field_count() == 0 {
|
|
||||||
// NOTE: since gccjit only supports i32 for the array size and libcore's tests uses a
|
|
||||||
// size of usize::MAX in test_binary_search, we workaround this by setting the size to
|
|
||||||
// zero for ZSTs.
|
|
||||||
// FIXME(antoyo): fix gccjit API.
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: see note above. Some other test uses usize::MAX.
|
|
||||||
if len == u64::MAX {
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
let len: i32 = len.try_into().expect("array len");
|
|
||||||
|
|
||||||
self.context.new_array_type(None, ty, len)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn type_bool(&self) -> Type<'gcc> {
|
pub fn type_bool(&self) -> Type<'gcc> {
|
||||||
self.context.new_type::<bool>()
|
self.context.new_type::<bool>()
|
||||||
}
|
}
|
||||||
|
@ -127,10 +127,6 @@ pub(crate) fn type_padding_filler(&self, size: Size, align: Align) -> &'ll Type
|
|||||||
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) }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn type_array(&self, ty: &'ll Type, len: u64) -> &'ll Type {
|
|
||||||
unsafe { llvm::LLVMRustArrayType(ty, len) }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ll, 'tcx> BaseTypeMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
impl<'ll, 'tcx> BaseTypeMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
||||||
@ -231,6 +227,10 @@ fn int_width(&self, ty: &'ll Type) -> u64 {
|
|||||||
fn val_ty(&self, v: &'ll Value) -> &'ll Type {
|
fn val_ty(&self, v: &'ll Value) -> &'ll Type {
|
||||||
common::val_ty(v)
|
common::val_ty(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn type_array(&self, ty: &'ll Type, len: u64) -> &'ll Type {
|
||||||
|
unsafe { llvm::LLVMRustArrayType(ty, len) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Type {
|
impl Type {
|
||||||
|
@ -22,6 +22,7 @@ pub trait BaseTypeMethods<'tcx>: Backend<'tcx> {
|
|||||||
fn type_f32(&self) -> Self::Type;
|
fn type_f32(&self) -> Self::Type;
|
||||||
fn type_f64(&self) -> Self::Type;
|
fn type_f64(&self) -> Self::Type;
|
||||||
|
|
||||||
|
fn type_array(&self, ty: Self::Type, len: u64) -> Self::Type;
|
||||||
fn type_func(&self, args: &[Self::Type], ret: Self::Type) -> Self::Type;
|
fn type_func(&self, args: &[Self::Type], ret: Self::Type) -> Self::Type;
|
||||||
fn type_struct(&self, els: &[Self::Type], packed: bool) -> Self::Type;
|
fn type_struct(&self, els: &[Self::Type], packed: bool) -> Self::Type;
|
||||||
fn type_kind(&self, ty: Self::Type) -> TypeKind;
|
fn type_kind(&self, ty: Self::Type) -> TypeKind;
|
||||||
|
Loading…
Reference in New Issue
Block a user