IntKind::{get_int_type -> int_type}

This commit is contained in:
lyken 2024-08-28 12:53:37 +08:00
parent 44ee84b1d0
commit cc5950e88c
No known key found for this signature in database
GPG Key ID: 3BD5FC6AC8325DD8

View File

@ -12,7 +12,7 @@ use crate::codegen::{CodeGenContext, CodeGenerator};
use super::*; use super::*;
pub trait IntKind<'ctx>: fmt::Debug + Clone + Copy { pub trait IntKind<'ctx>: fmt::Debug + Clone + Copy {
fn get_int_type(&self, size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx>; fn int_type(&self, size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx>;
} }
#[derive(Debug, Clone, Copy, Default)] #[derive(Debug, Clone, Copy, Default)]
@ -27,31 +27,31 @@ pub struct Int64;
pub struct SizeT; pub struct SizeT;
impl<'ctx> IntKind<'ctx> for Bool { impl<'ctx> IntKind<'ctx> for Bool {
fn get_int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> { fn int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
ctx.bool_type() ctx.bool_type()
} }
} }
impl<'ctx> IntKind<'ctx> for Byte { impl<'ctx> IntKind<'ctx> for Byte {
fn get_int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> { fn int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
ctx.i8_type() ctx.i8_type()
} }
} }
impl<'ctx> IntKind<'ctx> for Int32 { impl<'ctx> IntKind<'ctx> for Int32 {
fn get_int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> { fn int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
ctx.i32_type() ctx.i32_type()
} }
} }
impl<'ctx> IntKind<'ctx> for Int64 { impl<'ctx> IntKind<'ctx> for Int64 {
fn get_int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> { fn int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
ctx.i64_type() ctx.i64_type()
} }
} }
impl<'ctx> IntKind<'ctx> for SizeT { impl<'ctx> IntKind<'ctx> for SizeT {
fn get_int_type(&self, size_t: IntType<'ctx>, _ctx: &'ctx Context) -> IntType<'ctx> { fn int_type(&self, size_t: IntType<'ctx>, _ctx: &'ctx Context) -> IntType<'ctx> {
size_t size_t
} }
} }
@ -60,7 +60,7 @@ impl<'ctx> IntKind<'ctx> for SizeT {
pub struct AnyInt<'ctx>(pub IntType<'ctx>); pub struct AnyInt<'ctx>(pub IntType<'ctx>);
impl<'ctx> IntKind<'ctx> for AnyInt<'ctx> { impl<'ctx> IntKind<'ctx> for AnyInt<'ctx> {
fn get_int_type(&self, _size_t: IntType<'ctx>, _ctx: &'ctx Context) -> IntType<'ctx> { fn int_type(&self, _size_t: IntType<'ctx>, _ctx: &'ctx Context) -> IntType<'ctx> {
self.0 self.0
} }
} }
@ -73,7 +73,7 @@ pub struct Int<'ctx, N: IntKind<'ctx>> {
impl<'ctx, N: IntKind<'ctx>> ModelBase<'ctx> for Int<'ctx, N> { impl<'ctx, N: IntKind<'ctx>> ModelBase<'ctx> for Int<'ctx, N> {
fn llvm_type_impl(&self, size_t: IntType<'ctx>, ctx: &'ctx Context) -> BasicTypeEnum<'ctx> { fn llvm_type_impl(&self, size_t: IntType<'ctx>, ctx: &'ctx Context) -> BasicTypeEnum<'ctx> {
self.kind.get_int_type(size_t, ctx).into() self.kind.int_type(size_t, ctx).into()
} }
fn check_type_impl( fn check_type_impl(
@ -86,7 +86,7 @@ impl<'ctx, N: IntKind<'ctx>> ModelBase<'ctx> for Int<'ctx, N> {
return Err(ModelError(format!("Expecting IntType, but got {ty:?}"))); return Err(ModelError(format!("Expecting IntType, but got {ty:?}")));
}; };
let exp_ty = self.kind.get_int_type(size_t, ctx); let exp_ty = self.kind.int_type(size_t, ctx);
if ty.get_bit_width() != exp_ty.get_bit_width() { if ty.get_bit_width() != exp_ty.get_bit_width() {
return Err(ModelError(format!( return Err(ModelError(format!(
"Expecting IntType to have {} bit(s), but got {} bit(s)", "Expecting IntType to have {} bit(s), but got {} bit(s)",
@ -153,10 +153,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
) -> Instance<'ctx, Self> { ) -> Instance<'ctx, Self> {
assert!( assert!(
value.get_type().get_bit_width() value.get_type().get_bit_width()
<= self <= self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
.kind
.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx)
.get_bit_width()
); );
let value = ctx let value = ctx
.builder .builder
@ -173,7 +170,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
) -> Instance<'ctx, Self> { ) -> Instance<'ctx, Self> {
assert!( assert!(
value.get_type().get_bit_width() value.get_type().get_bit_width()
< self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width() < self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
); );
let value = let value =
ctx.builder.build_int_s_extend(value, self.llvm_type(generator, ctx.ctx), "").unwrap(); ctx.builder.build_int_s_extend(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
@ -188,10 +185,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
) -> Instance<'ctx, Self> { ) -> Instance<'ctx, Self> {
assert!( assert!(
value.get_type().get_bit_width() value.get_type().get_bit_width()
<= self <= self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
.kind
.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx)
.get_bit_width()
); );
let value = ctx let value = ctx
.builder .builder
@ -208,7 +202,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
) -> Instance<'ctx, Self> { ) -> Instance<'ctx, Self> {
assert!( assert!(
value.get_type().get_bit_width() value.get_type().get_bit_width()
< self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width() < self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
); );
let value = let value =
ctx.builder.build_int_z_extend(value, self.llvm_type(generator, ctx.ctx), "").unwrap(); ctx.builder.build_int_z_extend(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
@ -223,10 +217,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
) -> Instance<'ctx, Self> { ) -> Instance<'ctx, Self> {
assert!( assert!(
value.get_type().get_bit_width() value.get_type().get_bit_width()
>= self >= self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
.kind
.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx)
.get_bit_width()
); );
let value = ctx let value = ctx
.builder .builder
@ -243,7 +234,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
) -> Instance<'ctx, Self> { ) -> Instance<'ctx, Self> {
assert!( assert!(
value.get_type().get_bit_width() value.get_type().get_bit_width()
> self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width() > self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
); );
let value = let value =
ctx.builder.build_int_truncate(value, self.llvm_type(generator, ctx.ctx), "").unwrap(); ctx.builder.build_int_truncate(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
@ -259,7 +250,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
) -> Instance<'ctx, Self> { ) -> Instance<'ctx, Self> {
let their_width = value.get_type().get_bit_width(); let their_width = value.get_type().get_bit_width();
let our_width = let our_width =
self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width(); self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width();
match their_width.cmp(&our_width) { match their_width.cmp(&our_width) {
Ordering::Less => self.s_extend(generator, ctx, value), Ordering::Less => self.s_extend(generator, ctx, value),
Ordering::Equal => unsafe { self.believe_value(value) }, Ordering::Equal => unsafe { self.believe_value(value) },
@ -276,7 +267,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
) -> Instance<'ctx, Self> { ) -> Instance<'ctx, Self> {
let their_width = value.get_type().get_bit_width(); let their_width = value.get_type().get_bit_width();
let our_width = let our_width =
self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width(); self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width();
match their_width.cmp(&our_width) { match their_width.cmp(&our_width) {
Ordering::Less => self.z_extend(generator, ctx, value), Ordering::Less => self.z_extend(generator, ctx, value),
Ordering::Equal => unsafe { self.believe_value(value) }, Ordering::Equal => unsafe { self.believe_value(value) },