Implement array and struct debug info
This commit is contained in:
parent
a511331be2
commit
c1cc1d28de
@ -495,6 +495,31 @@ impl DebugTypeHolder {
|
|||||||
Vec::new().as_mut_ptr(),
|
Vec::new().as_mut_ptr(),
|
||||||
0,
|
0,
|
||||||
),
|
),
|
||||||
|
DebugTypeData::Struct(st) => {
|
||||||
|
let mut elements = st
|
||||||
|
.elements
|
||||||
|
.iter()
|
||||||
|
.map(|e| *debug.types.get(e).unwrap())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
LLVMDIBuilderCreateStructType(
|
||||||
|
debug.builder,
|
||||||
|
*debug.programs.get(&st.scope).unwrap(),
|
||||||
|
into_cstring(st.name.clone()).as_ptr(),
|
||||||
|
st.name.len(),
|
||||||
|
debug.file_ref,
|
||||||
|
st.location.line,
|
||||||
|
st.size_bits,
|
||||||
|
st.alignment,
|
||||||
|
st.flags.as_llvm(),
|
||||||
|
null_mut(), // derived from
|
||||||
|
elements.as_mut_ptr(),
|
||||||
|
elements.len() as u32,
|
||||||
|
0, // Runtime lang
|
||||||
|
null_mut(), // VTable
|
||||||
|
null(), // Unique ID
|
||||||
|
0, // Unique ID len
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ use crate::{
|
|||||||
builder::*,
|
builder::*,
|
||||||
debug_information::{
|
debug_information::{
|
||||||
DebugArrayType, DebugBasicType, DebugLocation, DebugLocationValue, DebugMetadataHolder,
|
DebugArrayType, DebugBasicType, DebugLocation, DebugLocationValue, DebugMetadataHolder,
|
||||||
DebugMetadataValue, DebugPointerType, DebugProgramValue, DebugScopeValue,
|
DebugMetadataValue, DebugPointerType, DebugProgramValue, DebugScopeValue, DebugStructType,
|
||||||
DebugSubprogramType, DebugTypeData, DebugTypeHolder, DebugTypeValue,
|
DebugSubprogramType, DebugTypeData, DebugTypeHolder, DebugTypeValue,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -243,6 +243,7 @@ impl Debug for DebugTypeData {
|
|||||||
DebugTypeData::Subprogram(ty) => Debug::fmt(ty, f),
|
DebugTypeData::Subprogram(ty) => Debug::fmt(ty, f),
|
||||||
DebugTypeData::Pointer(ty) => Debug::fmt(ty, f),
|
DebugTypeData::Pointer(ty) => Debug::fmt(ty, f),
|
||||||
DebugTypeData::Array(ty) => Debug::fmt(ty, f),
|
DebugTypeData::Array(ty) => Debug::fmt(ty, f),
|
||||||
|
DebugTypeData::Struct(ty) => Debug::fmt(ty, f),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -258,6 +259,20 @@ impl Debug for DebugBasicType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Debug for DebugStructType {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
f.debug_struct("Struct")
|
||||||
|
.field("name", &self.name)
|
||||||
|
.field("scope", &self.scope)
|
||||||
|
.field("location", &self.location)
|
||||||
|
.field("size_bit", &self.size_bits)
|
||||||
|
.field("alignment", &self.alignment)
|
||||||
|
.field("flags", &self.flags)
|
||||||
|
.field("elements", &self.elements)
|
||||||
|
.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Debug for DebugSubprogramType {
|
impl Debug for DebugSubprogramType {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
f.debug_tuple("Subprogram")
|
f.debug_tuple("Subprogram")
|
||||||
|
@ -260,6 +260,7 @@ pub enum DebugTypeData {
|
|||||||
Subprogram(DebugSubprogramType),
|
Subprogram(DebugSubprogramType),
|
||||||
Pointer(DebugPointerType),
|
Pointer(DebugPointerType),
|
||||||
Array(DebugArrayType),
|
Array(DebugArrayType),
|
||||||
|
Struct(DebugStructType),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -287,6 +288,16 @@ pub struct DebugPointerType {
|
|||||||
pub pointee: DebugTypeValue,
|
pub pointee: DebugTypeValue,
|
||||||
pub size_bits: u64,
|
pub size_bits: u64,
|
||||||
}
|
}
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct DebugStructType {
|
||||||
|
pub name: String,
|
||||||
|
pub scope: DebugProgramValue,
|
||||||
|
pub location: DebugLocation,
|
||||||
|
pub size_bits: u64,
|
||||||
|
pub alignment: u32,
|
||||||
|
pub flags: DwarfFlags,
|
||||||
|
pub elements: Vec<DebugTypeValue>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct DebugSubprogramType {
|
pub struct DebugSubprogramType {
|
||||||
|
@ -159,19 +159,19 @@ pub enum BlockLevelStatement {
|
|||||||
Return(ReturnType, Expression),
|
Return(ReturnType, Expression),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct TypeDefinition {
|
pub struct TypeDefinition {
|
||||||
name: String,
|
name: String,
|
||||||
kind: TypeDefinitionKind,
|
kind: TypeDefinitionKind,
|
||||||
range: TokenRange,
|
range: TokenRange,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum TypeDefinitionKind {
|
pub enum TypeDefinitionKind {
|
||||||
Struct(Vec<StructDefinitionField>),
|
Struct(Vec<StructDefinitionField>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct StructDefinitionField {
|
pub struct StructDefinitionField {
|
||||||
name: String,
|
name: String,
|
||||||
ty: Type,
|
ty: Type,
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
use std::{collections::HashMap, mem};
|
use std::{collections::HashMap, fmt::format, mem};
|
||||||
|
|
||||||
use reid_lib::{
|
use reid_lib::{
|
||||||
builder::{InstructionValue, TypeValue},
|
builder::{InstructionValue, TypeValue},
|
||||||
compile::CompiledModule,
|
compile::CompiledModule,
|
||||||
debug_information::{
|
debug_information::{
|
||||||
DebugBasicType, DebugFileData, DebugInformation, DebugLocalVariable, DebugLocation,
|
DebugArrayType, DebugBasicType, DebugFileData, DebugInformation, DebugLocalVariable,
|
||||||
DebugMetadata, DebugMetadataValue, DebugParamVariable, DebugProgramValue, DebugRecordKind,
|
DebugLocation, DebugMetadata, DebugMetadataValue, DebugParamVariable, DebugPointerType,
|
||||||
DebugScopeValue, DebugSubprogramData, DebugSubprogramOptionals, DebugSubprogramType,
|
DebugProgramValue, DebugRecordKind, DebugScopeValue, DebugStructType, DebugSubprogramData,
|
||||||
DebugTypeData, DebugTypeValue, DwarfEncoding, DwarfFlags, InstructionDebugRecordData,
|
DebugSubprogramOptionals, DebugSubprogramType, DebugTypeData, DebugTypeValue,
|
||||||
|
DwarfEncoding, DwarfFlags, InstructionDebugRecordData,
|
||||||
},
|
},
|
||||||
Block, CmpPredicate, ConstValue, Context, CustomTypeKind, Function, FunctionFlags, Instr,
|
Block, CmpPredicate, ConstValue, Context, CustomTypeKind, Function, FunctionFlags, Instr,
|
||||||
Module, NamedStruct, TerminatorKind as Term, Type,
|
Module, NamedStruct, TerminatorKind as Term, Type,
|
||||||
@ -17,8 +18,8 @@ use crate::{
|
|||||||
error_raporting::ModuleMap,
|
error_raporting::ModuleMap,
|
||||||
lexer::{FullToken, Position},
|
lexer::{FullToken, Position},
|
||||||
mir::{
|
mir::{
|
||||||
self, Metadata, NamedVariableRef, StructField, StructType, TypeDefinitionKind, TypeKind,
|
self, Metadata, NamedVariableRef, StructField, StructType, TypeDefinition,
|
||||||
VagueLiteral,
|
TypeDefinitionKind, TypeKind, VagueLiteral,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -78,7 +79,7 @@ pub struct Scope<'ctx, 'a> {
|
|||||||
module: &'ctx Module<'ctx>,
|
module: &'ctx Module<'ctx>,
|
||||||
function: &'ctx StackFunction<'ctx>,
|
function: &'ctx StackFunction<'ctx>,
|
||||||
block: Block<'ctx>,
|
block: Block<'ctx>,
|
||||||
types: &'a HashMap<TypeValue, TypeDefinitionKind>,
|
types: &'a HashMap<TypeValue, TypeDefinition>,
|
||||||
type_values: &'a HashMap<String, TypeValue>,
|
type_values: &'a HashMap<String, TypeValue>,
|
||||||
functions: &'a HashMap<String, StackFunction<'ctx>>,
|
functions: &'a HashMap<String, StackFunction<'ctx>>,
|
||||||
stack_values: HashMap<String, StackValue>,
|
stack_values: HashMap<String, StackValue>,
|
||||||
@ -161,23 +162,11 @@ impl<'ctx, 'a> Scope<'ctx, 'a> {
|
|||||||
old_block
|
old_block
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_typedef(&self, name: &String) -> Option<&TypeDefinitionKind> {
|
fn get_typedef(&self, name: &String) -> Option<&TypeDefinition> {
|
||||||
self.type_values.get(name).and_then(|v| self.types.get(v))
|
self.type_values.get(name).and_then(|v| self.types.get(v))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ctx> Debug<'ctx> {
|
|
||||||
fn get_type(&self, kind: &TypeKind) -> DebugTypeValue {
|
|
||||||
if let Some(ty) = self.types.get(kind) {
|
|
||||||
*ty
|
|
||||||
} else {
|
|
||||||
let debug_data = kind.debug_type_data();
|
|
||||||
let ty = self.info.debug_type(debug_data);
|
|
||||||
ty
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
|
||||||
struct State {
|
struct State {
|
||||||
should_load: bool,
|
should_load: bool,
|
||||||
@ -222,23 +211,36 @@ impl mir::Module {
|
|||||||
let mut type_values = HashMap::new();
|
let mut type_values = HashMap::new();
|
||||||
let mut debug_types = HashMap::new();
|
let mut debug_types = HashMap::new();
|
||||||
|
|
||||||
{
|
macro_rules! insert_debug {
|
||||||
use TypeKind::*;
|
($kind:expr) => {
|
||||||
debug_types.insert(Bool, Bool.get_debug_type(&debug_types, &debug));
|
debug_types.insert(
|
||||||
debug_types.insert(U8, U8.get_debug_type(&debug_types, &debug));
|
$kind.clone(),
|
||||||
debug_types.insert(U16, U16.get_debug_type(&debug_types, &debug));
|
$kind.get_debug_type_hard(
|
||||||
debug_types.insert(U32, U32.get_debug_type(&debug_types, &debug));
|
compile_unit,
|
||||||
debug_types.insert(U64, U64.get_debug_type(&debug_types, &debug));
|
&debug,
|
||||||
debug_types.insert(U128, U128.get_debug_type(&debug_types, &debug));
|
&debug_types,
|
||||||
debug_types.insert(I8, I8.get_debug_type(&debug_types, &debug));
|
&type_values,
|
||||||
debug_types.insert(I16, I16.get_debug_type(&debug_types, &debug));
|
&types,
|
||||||
debug_types.insert(I32, I32.get_debug_type(&debug_types, &debug));
|
tokens,
|
||||||
debug_types.insert(I64, I64.get_debug_type(&debug_types, &debug));
|
),
|
||||||
debug_types.insert(I128, I128.get_debug_type(&debug_types, &debug));
|
)
|
||||||
debug_types.insert(Void, Void.get_debug_type(&debug_types, &debug));
|
};
|
||||||
debug_types.insert(StringPtr, StringPtr.get_debug_type(&debug_types, &debug));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
insert_debug!(&TypeKind::Bool);
|
||||||
|
insert_debug!(&TypeKind::U8);
|
||||||
|
insert_debug!(&TypeKind::U16);
|
||||||
|
insert_debug!(&TypeKind::U32);
|
||||||
|
insert_debug!(&TypeKind::U64);
|
||||||
|
insert_debug!(&TypeKind::U128);
|
||||||
|
insert_debug!(&TypeKind::I8);
|
||||||
|
insert_debug!(&TypeKind::I16);
|
||||||
|
insert_debug!(&TypeKind::I32);
|
||||||
|
insert_debug!(&TypeKind::I64);
|
||||||
|
insert_debug!(&TypeKind::I128);
|
||||||
|
insert_debug!(&TypeKind::Void);
|
||||||
|
insert_debug!(&TypeKind::StringPtr);
|
||||||
|
|
||||||
for typedef in &self.typedefs {
|
for typedef in &self.typedefs {
|
||||||
let type_value = match &typedef.kind {
|
let type_value = match &typedef.kind {
|
||||||
TypeDefinitionKind::Struct(StructType(fields)) => {
|
TypeDefinitionKind::Struct(StructType(fields)) => {
|
||||||
@ -254,8 +256,9 @@ impl mir::Module {
|
|||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
types.insert(type_value, typedef.kind.clone());
|
types.insert(type_value, typedef.clone());
|
||||||
type_values.insert(typedef.name.clone(), type_value);
|
type_values.insert(typedef.name.clone(), type_value);
|
||||||
|
insert_debug!(&TypeKind::CustomType(typedef.name.clone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut functions = HashMap::new();
|
let mut functions = HashMap::new();
|
||||||
@ -303,9 +306,14 @@ impl mir::Module {
|
|||||||
let debug_scope = if let Some(location) = mir_function.signature().into_debug(tokens) {
|
let debug_scope = if let Some(location) = mir_function.signature().into_debug(tokens) {
|
||||||
// let debug_scope = debug.inner_scope(&outer_scope, location);
|
// let debug_scope = debug.inner_scope(&outer_scope, location);
|
||||||
|
|
||||||
let fn_param_ty = &mir_function
|
let fn_param_ty = &mir_function.return_type.get_debug_type_hard(
|
||||||
.return_type
|
compile_unit,
|
||||||
.get_debug_type(&debug_types, &debug);
|
&debug,
|
||||||
|
&debug_types,
|
||||||
|
&type_values,
|
||||||
|
&types,
|
||||||
|
tokens,
|
||||||
|
);
|
||||||
|
|
||||||
let debug_ty = debug.debug_type(DebugTypeData::Subprogram(DebugSubprogramType {
|
let debug_ty = debug.debug_type(DebugTypeData::Subprogram(DebugSubprogramType {
|
||||||
parameters: vec![*fn_param_ty],
|
parameters: vec![*fn_param_ty],
|
||||||
@ -358,7 +366,14 @@ impl mir::Module {
|
|||||||
name: p_name.clone(),
|
name: p_name.clone(),
|
||||||
arg_idx: i as u32,
|
arg_idx: i as u32,
|
||||||
location,
|
location,
|
||||||
ty: p_ty.get_debug_type(&debug_types, &debug),
|
ty: p_ty.get_debug_type_hard(
|
||||||
|
*debug_scope,
|
||||||
|
&debug,
|
||||||
|
&debug_types,
|
||||||
|
&type_values,
|
||||||
|
&types,
|
||||||
|
tokens,
|
||||||
|
),
|
||||||
always_preserve: true,
|
always_preserve: true,
|
||||||
flags: DwarfFlags,
|
flags: DwarfFlags,
|
||||||
}),
|
}),
|
||||||
@ -488,7 +503,7 @@ impl mir::Statement {
|
|||||||
DebugMetadata::LocalVar(DebugLocalVariable {
|
DebugMetadata::LocalVar(DebugLocalVariable {
|
||||||
name: name.clone(),
|
name: name.clone(),
|
||||||
location,
|
location,
|
||||||
ty: debug.get_type(ty),
|
ty: ty.get_debug_type(debug, scope),
|
||||||
always_preserve: true,
|
always_preserve: true,
|
||||||
alignment: 32,
|
alignment: 32,
|
||||||
flags: DwarfFlags,
|
flags: DwarfFlags,
|
||||||
@ -732,7 +747,7 @@ impl mir::Expression {
|
|||||||
panic!("tried accessing non-custom-type");
|
panic!("tried accessing non-custom-type");
|
||||||
};
|
};
|
||||||
let TypeDefinitionKind::Struct(struct_ty) =
|
let TypeDefinitionKind::Struct(struct_ty) =
|
||||||
scope.get_typedef(&name).unwrap().clone();
|
scope.get_typedef(&name).unwrap().kind.clone();
|
||||||
let idx = struct_ty.find_index(field).unwrap();
|
let idx = struct_ty.find_index(field).unwrap();
|
||||||
|
|
||||||
let mut value = scope
|
let mut value = scope
|
||||||
@ -931,7 +946,7 @@ impl TypeKind {
|
|||||||
fn get_type(
|
fn get_type(
|
||||||
&self,
|
&self,
|
||||||
type_vals: &HashMap<String, TypeValue>,
|
type_vals: &HashMap<String, TypeValue>,
|
||||||
typedefs: &HashMap<TypeValue, TypeDefinitionKind>,
|
typedefs: &HashMap<TypeValue, TypeDefinition>,
|
||||||
) -> Type {
|
) -> Type {
|
||||||
match &self {
|
match &self {
|
||||||
TypeKind::I8 => Type::I8,
|
TypeKind::I8 => Type::I8,
|
||||||
@ -952,25 +967,127 @@ impl TypeKind {
|
|||||||
TypeKind::CustomType(n) => {
|
TypeKind::CustomType(n) => {
|
||||||
let type_val = type_vals.get(n).unwrap().clone();
|
let type_val = type_vals.get(n).unwrap().clone();
|
||||||
let custom_t = Type::CustomType(type_val);
|
let custom_t = Type::CustomType(type_val);
|
||||||
match typedefs.get(&type_val).unwrap() {
|
match typedefs.get(&type_val).unwrap().kind {
|
||||||
TypeDefinitionKind::Struct(_) => Type::Ptr(Box::new(custom_t)),
|
TypeDefinitionKind::Struct(_) => Type::Ptr(Box::new(custom_t)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn get_debug_type(
|
impl TypeKind {
|
||||||
|
fn get_debug_type(&self, debug: &Debug, scope: &Scope) -> DebugTypeValue {
|
||||||
|
self.get_debug_type_hard(
|
||||||
|
debug.scope,
|
||||||
|
debug.info,
|
||||||
|
debug.types,
|
||||||
|
scope.type_values,
|
||||||
|
scope.types,
|
||||||
|
scope.tokens,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_debug_type_hard(
|
||||||
&self,
|
&self,
|
||||||
types: &HashMap<TypeKind, DebugTypeValue>,
|
scope: DebugProgramValue,
|
||||||
debug: &DebugInformation,
|
debug_info: &DebugInformation,
|
||||||
|
debug_types: &HashMap<TypeKind, DebugTypeValue>,
|
||||||
|
type_values: &HashMap<String, TypeValue>,
|
||||||
|
types: &HashMap<TypeValue, TypeDefinition>,
|
||||||
|
tokens: &Vec<FullToken>,
|
||||||
) -> DebugTypeValue {
|
) -> DebugTypeValue {
|
||||||
if let Some(ty) = types.get(self) {
|
if let Some(ty) = debug_types.get(self) {
|
||||||
*ty
|
return *ty;
|
||||||
} else {
|
|
||||||
let debug_data = self.debug_type_data();
|
|
||||||
let ty = debug.debug_type(debug_data);
|
|
||||||
ty
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let name = format!("{}", self);
|
||||||
|
|
||||||
|
let data = match self {
|
||||||
|
TypeKind::StringPtr => DebugTypeData::Pointer(DebugPointerType {
|
||||||
|
name,
|
||||||
|
pointee: TypeKind::I8.get_debug_type_hard(
|
||||||
|
scope,
|
||||||
|
debug_info,
|
||||||
|
debug_types,
|
||||||
|
type_values,
|
||||||
|
types,
|
||||||
|
tokens,
|
||||||
|
),
|
||||||
|
size_bits: self.size_of(),
|
||||||
|
}),
|
||||||
|
TypeKind::Array(type_kind, len) => DebugTypeData::Array(DebugArrayType {
|
||||||
|
size_bits: type_kind.size_of() * len,
|
||||||
|
align_bits: type_kind.alignment(),
|
||||||
|
element_type: type_kind.get_debug_type_hard(
|
||||||
|
scope,
|
||||||
|
debug_info,
|
||||||
|
debug_types,
|
||||||
|
type_values,
|
||||||
|
types,
|
||||||
|
tokens,
|
||||||
|
),
|
||||||
|
subscripts: Vec::new(),
|
||||||
|
}),
|
||||||
|
TypeKind::CustomType(name) => {
|
||||||
|
let typedef = types.get(type_values.get(name).unwrap()).unwrap();
|
||||||
|
|
||||||
|
match &typedef.kind {
|
||||||
|
TypeDefinitionKind::Struct(struct_type) => {
|
||||||
|
let (elements, sizes): (Vec<_>, Vec<_>) = struct_type
|
||||||
|
.0
|
||||||
|
.iter()
|
||||||
|
.map(|t| {
|
||||||
|
(
|
||||||
|
t.1.get_debug_type_hard(
|
||||||
|
scope,
|
||||||
|
debug_info,
|
||||||
|
debug_types,
|
||||||
|
type_values,
|
||||||
|
types,
|
||||||
|
tokens,
|
||||||
|
),
|
||||||
|
t.1.size_of(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unzip();
|
||||||
|
let size_bits: u64 = sizes.iter().sum();
|
||||||
|
{
|
||||||
|
DebugTypeData::Struct(DebugStructType {
|
||||||
|
name: name.clone(),
|
||||||
|
scope: scope,
|
||||||
|
location: typedef.meta.into_debug(tokens).unwrap(),
|
||||||
|
size_bits,
|
||||||
|
alignment: 32,
|
||||||
|
flags: DwarfFlags,
|
||||||
|
elements,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => DebugTypeData::Basic(DebugBasicType {
|
||||||
|
name,
|
||||||
|
size_bits: self.size_of(),
|
||||||
|
encoding: match self {
|
||||||
|
TypeKind::Bool => DwarfEncoding::Boolean,
|
||||||
|
TypeKind::I8 => DwarfEncoding::SignedChar,
|
||||||
|
TypeKind::U8 => DwarfEncoding::UnsignedChar,
|
||||||
|
TypeKind::I16 | TypeKind::I32 | TypeKind::I64 | TypeKind::I128 => {
|
||||||
|
DwarfEncoding::Signed
|
||||||
|
}
|
||||||
|
TypeKind::U16 | TypeKind::U32 | TypeKind::U64 | TypeKind::U128 => {
|
||||||
|
DwarfEncoding::Unsigned
|
||||||
|
}
|
||||||
|
TypeKind::Void => DwarfEncoding::Address,
|
||||||
|
TypeKind::StringPtr => DwarfEncoding::Address,
|
||||||
|
TypeKind::Array(_, _) => DwarfEncoding::Address,
|
||||||
|
TypeKind::CustomType(_) => DwarfEncoding::Address,
|
||||||
|
TypeKind::Vague(_) => panic!("tried fetching debug-type for vague type!"),
|
||||||
|
},
|
||||||
|
flags: DwarfFlags,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
debug_info.debug_type(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,34 +45,31 @@ impl TypeKind {
|
|||||||
TypeKind::U128 => 128,
|
TypeKind::U128 => 128,
|
||||||
TypeKind::Void => 0,
|
TypeKind::Void => 0,
|
||||||
TypeKind::StringPtr => 32,
|
TypeKind::StringPtr => 32,
|
||||||
TypeKind::Array(type_kind, len) => 32,
|
TypeKind::Array(type_kind, len) => type_kind.size_of() * len,
|
||||||
TypeKind::CustomType(_) => 32,
|
TypeKind::CustomType(_) => 32,
|
||||||
TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"),
|
TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn debug_type_data(&self) -> DebugTypeData {
|
pub fn alignment(&self) -> u32 {
|
||||||
DebugTypeData::Basic(DebugBasicType {
|
match self {
|
||||||
name: format!("{}", self),
|
TypeKind::Bool => 1,
|
||||||
size_bits: self.size_of(),
|
TypeKind::I8 => 8,
|
||||||
encoding: match self {
|
TypeKind::U8 => 8,
|
||||||
TypeKind::Bool => DwarfEncoding::Boolean,
|
TypeKind::I16 => 16,
|
||||||
TypeKind::I8 => DwarfEncoding::SignedChar,
|
TypeKind::U16 => 16,
|
||||||
TypeKind::U8 => DwarfEncoding::UnsignedChar,
|
TypeKind::I32 => 32,
|
||||||
TypeKind::I16 | TypeKind::I32 | TypeKind::I64 | TypeKind::I128 => {
|
TypeKind::U32 => 32,
|
||||||
DwarfEncoding::Signed
|
TypeKind::I64 => 64,
|
||||||
}
|
TypeKind::U64 => 64,
|
||||||
TypeKind::U16 | TypeKind::U32 | TypeKind::U64 | TypeKind::U128 => {
|
TypeKind::I128 => 128,
|
||||||
DwarfEncoding::Unsigned
|
TypeKind::U128 => 128,
|
||||||
}
|
TypeKind::Void => 0,
|
||||||
TypeKind::Void => DwarfEncoding::Address,
|
TypeKind::StringPtr => 32,
|
||||||
TypeKind::StringPtr => DwarfEncoding::Address,
|
TypeKind::Array(type_kind, _) => type_kind.alignment(),
|
||||||
TypeKind::Array(_, _) => DwarfEncoding::Address,
|
TypeKind::CustomType(_) => 32,
|
||||||
TypeKind::CustomType(_) => DwarfEncoding::Address,
|
TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"),
|
||||||
TypeKind::Vague(_) => panic!("tried fetching debug-type for vague type!"),
|
}
|
||||||
},
|
|
||||||
flags: DwarfFlags,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ pub enum StmtKind {
|
|||||||
Expression(Expression),
|
Expression(Expression),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct TypeDefinition {
|
pub struct TypeDefinition {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub kind: TypeDefinitionKind,
|
pub kind: TypeDefinitionKind,
|
||||||
|
@ -121,7 +121,7 @@ impl Block {
|
|||||||
lhs_ref.narrow(&rhs_ref);
|
lhs_ref.narrow(&rhs_ref);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StmtKind::Import(_) => todo!(),
|
StmtKind::Import(_) => panic!(),
|
||||||
StmtKind::Expression(expr) => {
|
StmtKind::Expression(expr) => {
|
||||||
let expr_res = expr.infer_types(&mut state, &inner_refs);
|
let expr_res = expr.infer_types(&mut state, &inner_refs);
|
||||||
state.ok(expr_res, expr.1);
|
state.ok(expr_res, expr.1);
|
||||||
|
Loading…
Reference in New Issue
Block a user