mirror of
https://github.com/edg-l/edlang.git
synced 2024-11-21 23:48:24 +00:00
refs
This commit is contained in:
parent
e27c30a9f2
commit
6d31a9ea6f
|
@ -62,6 +62,7 @@ pub struct Ident {
|
|||
pub struct Type {
|
||||
pub name: Ident,
|
||||
pub generics: Vec<Type>,
|
||||
pub is_ref: Option<RefType>,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
|
@ -72,6 +73,12 @@ pub struct FnParam {
|
|||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
pub enum RefType {
|
||||
Not,
|
||||
Mut,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
pub struct Block {
|
||||
pub body: Vec<Statement>,
|
||||
|
|
|
@ -18,7 +18,7 @@ use inkwell::{
|
|||
AddressSpace,
|
||||
};
|
||||
use ir::{LocalKind, ModuleBody, ProgramBody, TypeInfo, ValueTree};
|
||||
use llvm_sys::debuginfo::LLVMDIFlagPublic;
|
||||
use llvm_sys::debuginfo::{LLVMDIFlagLValueReference, LLVMDIFlagPublic};
|
||||
use tracing::{info, trace};
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
|
@ -1083,6 +1083,12 @@ fn compile_basic_type<'ctx>(
|
|||
.ptr_sized_int_type(&ctx.target_data, None)
|
||||
.ptr_type(AddressSpace::default())
|
||||
.as_basic_type_enum(),
|
||||
ir::TypeKind::Ref(_, _) => ctx
|
||||
.ctx
|
||||
.context
|
||||
.ptr_sized_int_type(&ctx.target_data, None)
|
||||
.ptr_type(AddressSpace::default())
|
||||
.as_basic_type_enum(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1093,6 +1099,8 @@ fn compile_debug_type<'ctx>(ctx: &ModuleCompileCtx<'ctx, '_>, ty: &ir::TypeInfo)
|
|||
// 5 = signed
|
||||
// 11 = numeric string
|
||||
// https://dwarfstd.org/doc/DWARF5.pdf#section.7.8
|
||||
|
||||
// https://github.com/GaloisInc/dwarf-tools/blob/master/src/DWARF/DW/TAG.hs
|
||||
match &ty.kind {
|
||||
ir::TypeKind::Unit => todo!(),
|
||||
ir::TypeKind::Bool => ctx
|
||||
|
@ -1194,5 +1202,9 @@ fn compile_debug_type<'ctx>(ctx: &ModuleCompileCtx<'ctx, '_>, ty: &ir::TypeInfo)
|
|||
AddressSpace::default(),
|
||||
)
|
||||
.as_type(),
|
||||
ir::TypeKind::Ref(_, inner) => ctx
|
||||
.di_builder
|
||||
.create_reference_type(compile_debug_type(ctx, inner), 0x10)
|
||||
.as_type(),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -204,6 +204,7 @@ pub enum TypeKind {
|
|||
Float(FloatTy),
|
||||
FnDef(DefId, Vec<TypeInfo>), // The vec are generic types, not arg types
|
||||
Ptr(Box<TypeInfo>),
|
||||
Ref(bool, Box<TypeInfo>),
|
||||
}
|
||||
|
||||
impl TypeKind {
|
||||
|
@ -235,6 +236,7 @@ impl TypeKind {
|
|||
TypeKind::Unit => unreachable!(),
|
||||
TypeKind::FnDef(_, _) => unreachable!(),
|
||||
TypeKind::Ptr(_pointee) => todo!(),
|
||||
TypeKind::Ref(_, inner) => inner.kind.get_falsy_value(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -802,7 +802,7 @@ fn lower_path(builder: &mut BodyBuilder, info: &ast::PathExpr) -> (ir::Place, Ty
|
|||
|
||||
#[allow(clippy::only_used_in_recursion)]
|
||||
pub fn lower_type(ctx: &BuildCtx, t: &ast::Type) -> ir::TypeInfo {
|
||||
match t.name.name.as_str() {
|
||||
let inner_ty = match t.name.name.as_str() {
|
||||
"()" => ir::TypeInfo {
|
||||
span: Some(t.span),
|
||||
kind: ir::TypeKind::Unit,
|
||||
|
@ -860,5 +860,19 @@ pub fn lower_type(ctx: &BuildCtx, t: &ast::Type) -> ir::TypeInfo {
|
|||
kind: ir::TypeKind::Ptr(Box::new(lower_type(ctx, t.generics.first().unwrap()))),
|
||||
},
|
||||
x => todo!("{:?}", x),
|
||||
};
|
||||
|
||||
match t.is_ref {
|
||||
Some(x) => ir::TypeInfo {
|
||||
span: Some(t.span),
|
||||
kind: TypeKind::Ref(
|
||||
match x {
|
||||
ast::RefType::Not => false,
|
||||
ast::RefType::Mut => true,
|
||||
},
|
||||
Box::new(inner_ty),
|
||||
),
|
||||
},
|
||||
None => inner_ty,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -141,14 +141,16 @@ pub(crate) Ident: ast::Ident = {
|
|||
}
|
||||
|
||||
pub(crate) Type: ast::Type = {
|
||||
<lo:@L> <name:Ident> <hi:@R> => ast::Type {
|
||||
<lo:@L> <is_ref:RefType?> <name:Ident> <hi:@R> => ast::Type {
|
||||
name,
|
||||
generics: vec![],
|
||||
is_ref,
|
||||
span: ast::Span::new(lo, hi),
|
||||
},
|
||||
<lo:@L> <name:Ident> "<" <generics:Comma<Type>> ">" <hi:@R> => ast::Type {
|
||||
<lo:@L> <is_ref:RefType?> <name:Ident> "<" <generics:Comma<Type>> ">" <hi:@R> => ast::Type {
|
||||
name,
|
||||
generics,
|
||||
is_ref,
|
||||
span: ast::Span::new(lo, hi),
|
||||
},
|
||||
}
|
||||
|
@ -346,6 +348,11 @@ pub(crate) ValueExpr: ast::ValueExpr = {
|
|||
<PathExpr> => ast::ValueExpr::Path(<>),
|
||||
}
|
||||
|
||||
pub(crate) RefType: ast::RefType = {
|
||||
"&" => ast::RefType::Not,
|
||||
"&" "mut" => ast::RefType::Mut,
|
||||
}
|
||||
|
||||
pub(crate) FnParam: ast::FnParam = {
|
||||
<lo:@L> <name:Ident> ":" <arg_type:Type> <hi:@R> => ast::FnParam {
|
||||
name,
|
||||
|
|
Loading…
Reference in a new issue