Fix a bunch of bugs with debug information and stuff
This commit is contained in:
parent
78a1e9f06b
commit
81ce1dfc2e
@ -389,6 +389,7 @@ impl Builder {
|
||||
return Err(()); // TODO error: invalid amount of params
|
||||
}
|
||||
for (a, b) in param_types.iter().zip(params) {
|
||||
dbg!(&a, &b.get_type(&self));
|
||||
if *a != b.get_type(&self)? {
|
||||
return Err(()); // TODO error: params do not match
|
||||
}
|
||||
@ -478,7 +479,7 @@ impl Builder {
|
||||
Instr::SIToFP(instr, ty) => instr.cast_to(self, &ty).map(|_| ()),
|
||||
Instr::PtrToInt(instr, ty) => instr.cast_to(self, &ty).map(|_| ()),
|
||||
Instr::IntToPtr(instr, ty) => instr.cast_to(self, &ty).map(|_| ()),
|
||||
Instr::BitCast(instr, ty) => instr.cast_to(self, &ty).map(|_| ()),
|
||||
Instr::BitCast(instr, ty) => Ok(()),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -628,7 +629,7 @@ impl InstructionValue {
|
||||
SIToFP(instr, ty) => instr.cast_to(builder, ty).map(|_| ty.clone()),
|
||||
PtrToInt(instr, ty) => instr.cast_to(builder, ty).map(|_| ty.clone()),
|
||||
IntToPtr(instr, ty) => instr.cast_to(builder, ty).map(|_| ty.clone()),
|
||||
BitCast(instr, ty) => instr.cast_to(builder, ty).map(|_| ty.clone()),
|
||||
BitCast(_, ty) => Ok(ty.clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -376,8 +376,8 @@ impl DebugLocationHolder {
|
||||
unsafe {
|
||||
LLVMDIBuilderCreateDebugLocation(
|
||||
context.context_ref,
|
||||
self.location.line,
|
||||
self.location.column,
|
||||
self.location.pos.line,
|
||||
self.location.pos.column,
|
||||
*debug.programs.get(&self.program).unwrap(),
|
||||
null_mut(),
|
||||
)
|
||||
@ -399,8 +399,8 @@ impl DebugScopeHolder {
|
||||
di_builder,
|
||||
parent,
|
||||
file,
|
||||
location.line,
|
||||
location.column,
|
||||
location.pos.line,
|
||||
location.pos.column,
|
||||
)
|
||||
} else {
|
||||
LLVMDIBuilderCreateLexicalBlockFile(di_builder, parent, file, 0)
|
||||
@ -426,7 +426,7 @@ impl DebugMetadataHolder {
|
||||
param.name.len(),
|
||||
param.arg_idx + 1,
|
||||
debug.file_ref,
|
||||
self.location.line,
|
||||
self.location.pos.line,
|
||||
*debug.types.get(¶m.ty).unwrap(),
|
||||
param.always_preserve as i32,
|
||||
param.flags.as_llvm(),
|
||||
@ -437,7 +437,7 @@ impl DebugMetadataHolder {
|
||||
into_cstring(var.name.clone()).as_ptr(),
|
||||
var.name.len(),
|
||||
debug.file_ref,
|
||||
self.location.line,
|
||||
self.location.pos.line,
|
||||
*debug.types.get(&var.ty).unwrap(),
|
||||
var.always_preserve as i32,
|
||||
var.flags.as_llvm(),
|
||||
@ -504,11 +504,11 @@ impl DebugTypeHolder {
|
||||
.map(|field| {
|
||||
LLVMDIBuilderCreateMemberType(
|
||||
debug.builder,
|
||||
*debug.programs.get(&st.location.scope).unwrap(),
|
||||
*debug.programs.get(&st.scope).unwrap(),
|
||||
into_cstring(field.name.clone()).as_ptr(),
|
||||
field.name.len(),
|
||||
debug.file_ref,
|
||||
field.location.line,
|
||||
field.pos.map(|p| p.line).unwrap_or(1),
|
||||
field.size_bits,
|
||||
0,
|
||||
1,
|
||||
@ -519,11 +519,11 @@ impl DebugTypeHolder {
|
||||
.collect::<Vec<_>>();
|
||||
LLVMDIBuilderCreateStructType(
|
||||
debug.builder,
|
||||
*debug.programs.get(&st.location.scope).unwrap(),
|
||||
*debug.programs.get(&st.scope).unwrap(),
|
||||
into_cstring(st.name.clone()).as_ptr(),
|
||||
st.name.len(),
|
||||
debug.file_ref,
|
||||
st.location.line,
|
||||
st.pos.map(|p| p.line).unwrap_or(1),
|
||||
st.size_bits,
|
||||
0,
|
||||
st.flags.as_llvm(),
|
||||
@ -617,7 +617,7 @@ impl FunctionHolder {
|
||||
mangled_name,
|
||||
mangled_length,
|
||||
debug.file_ref,
|
||||
subprogram.location.line,
|
||||
subprogram.location.pos.line,
|
||||
*debug.types.get(&subprogram.ty).unwrap(),
|
||||
subprogram.opts.is_local as i32,
|
||||
subprogram.opts.is_definition as i32,
|
||||
@ -1027,8 +1027,8 @@ impl InstructionHolder {
|
||||
|
||||
let location = LLVMDIBuilderCreateDebugLocation(
|
||||
module.context_ref,
|
||||
record.location.line,
|
||||
record.location.column,
|
||||
record.location.pos.line,
|
||||
record.location.pos.column,
|
||||
*debug.programs.get(&record.scope).unwrap(),
|
||||
null_mut(),
|
||||
);
|
||||
|
@ -225,6 +225,11 @@ impl DebugInformation {
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct DebugLocation {
|
||||
pub scope: DebugProgramValue,
|
||||
pub pos: DebugPosition,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct DebugPosition {
|
||||
pub line: u32,
|
||||
pub column: u32,
|
||||
}
|
||||
@ -310,7 +315,8 @@ pub struct DebugPointerType {
|
||||
#[derive(Clone)]
|
||||
pub struct DebugStructType {
|
||||
pub name: String,
|
||||
pub location: DebugLocation,
|
||||
pub scope: DebugProgramValue,
|
||||
pub pos: Option<DebugPosition>,
|
||||
pub size_bits: u64,
|
||||
pub flags: DwarfFlags,
|
||||
pub fields: Vec<DebugFieldType>,
|
||||
@ -319,7 +325,8 @@ pub struct DebugStructType {
|
||||
#[derive(Clone)]
|
||||
pub struct DebugFieldType {
|
||||
pub name: String,
|
||||
pub location: DebugLocation,
|
||||
pub scope: DebugProgramValue,
|
||||
pub pos: Option<DebugPosition>,
|
||||
pub size_bits: u64,
|
||||
pub offset: u64,
|
||||
pub flags: DwarfFlags,
|
||||
|
@ -11,8 +11,8 @@ use crate::{
|
||||
debug_information::{
|
||||
DebugArrayType, DebugBasicType, DebugFieldType, DebugInformation, DebugLocalVariable,
|
||||
DebugLocation, DebugLocationValue, DebugMetadata, DebugMetadataValue, DebugParamVariable,
|
||||
DebugPointerType, DebugProgramValue, DebugRecordKind, DebugScopeValue, DebugStructType,
|
||||
DebugSubprogramType, DebugTypeData, DebugTypeHolder, DebugTypeValue,
|
||||
DebugPointerType, DebugPosition, DebugProgramValue, DebugRecordKind, DebugScopeValue,
|
||||
DebugStructType, DebugSubprogramType, DebugTypeData, DebugTypeHolder, DebugTypeValue,
|
||||
},
|
||||
pad_adapter::PadAdapter,
|
||||
};
|
||||
@ -171,6 +171,12 @@ impl DebugMetadataValue {
|
||||
}
|
||||
|
||||
impl Display for DebugLocation {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{:?} on scope {:?}", self.pos, self.scope)
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for DebugPosition {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "line {}, col {}", self.line, self.column)
|
||||
}
|
||||
@ -484,7 +490,8 @@ impl Debug for DebugStructType {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct("Struct")
|
||||
.field("name", &self.name)
|
||||
.field("location", &self.location)
|
||||
.field("scope", &self.scope)
|
||||
.field("pos", &self.pos)
|
||||
.field("size_bit", &self.size_bits)
|
||||
.field("flags", &self.flags)
|
||||
.field("elements", &self.fields)
|
||||
@ -495,7 +502,8 @@ impl Debug for DebugStructType {
|
||||
impl Debug for DebugFieldType {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct(&format!("Field({})", self.name))
|
||||
.field("location", &self.location)
|
||||
.field("scope", &self.scope)
|
||||
.field("pos", &self.pos)
|
||||
.field("size_bits", &self.size_bits)
|
||||
.field("offset", &self.offset)
|
||||
.field("flags", &self.flags)
|
||||
@ -569,6 +577,12 @@ impl Debug for DebugLocationValue {
|
||||
}
|
||||
|
||||
impl Debug for DebugLocation {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{:?} on scope {:?}", self.pos, self.scope)
|
||||
}
|
||||
}
|
||||
|
||||
impl Debug for DebugPosition {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "ln {}, col {}", self.line, self.column)
|
||||
}
|
||||
|
@ -521,7 +521,7 @@ impl ConstValue {
|
||||
ConstValue::U32(_) => U32,
|
||||
ConstValue::U64(_) => U64,
|
||||
ConstValue::U128(_) => U128,
|
||||
ConstValue::Str(_) => Type::Ptr(Box::new(I8)),
|
||||
ConstValue::Str(_) => Type::Ptr(Box::new(U8)),
|
||||
ConstValue::Bool(_) => Bool,
|
||||
ConstValue::F16(_) => F16,
|
||||
ConstValue::F32B(_) => F32B,
|
||||
|
@ -6,7 +6,7 @@ use reid_lib::{
|
||||
debug_information::{
|
||||
DebugArrayType, DebugBasicType, DebugFieldType, DebugFileData, DebugInformation,
|
||||
DebugLocalVariable, DebugLocation, DebugMetadata, DebugParamVariable, DebugPointerType,
|
||||
DebugProgramValue, DebugRecordKind, DebugStructType, DebugSubprogramData,
|
||||
DebugPosition, DebugProgramValue, DebugRecordKind, DebugStructType, DebugSubprogramData,
|
||||
DebugSubprogramOptionals, DebugSubprogramType, DebugTypeData, DebugTypeValue,
|
||||
DwarfEncoding, DwarfFlags, InstructionDebugRecordData,
|
||||
},
|
||||
@ -57,6 +57,8 @@ impl mir::Context {
|
||||
#[derive(Clone)]
|
||||
struct ModuleCodegen<'ctx> {
|
||||
module: Module<'ctx>,
|
||||
tokens: &'ctx Vec<FullToken>,
|
||||
debug_types: Option<HashMap<TypeKind, DebugTypeValue>>,
|
||||
type_values: HashMap<TypeKey, TypeValue>,
|
||||
}
|
||||
|
||||
@ -194,7 +196,7 @@ impl Default for State {
|
||||
|
||||
impl mir::Module {
|
||||
fn codegen<'ctx>(
|
||||
&self,
|
||||
&'ctx self,
|
||||
context: &'ctx Context,
|
||||
modules: HashMap<SourceModuleId, ModuleCodegen<'ctx>>,
|
||||
) -> ModuleCodegen<'ctx> {
|
||||
@ -227,7 +229,9 @@ impl mir::Module {
|
||||
&debug_types,
|
||||
&type_values,
|
||||
&types,
|
||||
tokens,
|
||||
self.module_id,
|
||||
&self.tokens,
|
||||
&modules,
|
||||
),
|
||||
)
|
||||
};
|
||||
@ -247,29 +251,23 @@ impl mir::Module {
|
||||
insert_debug!(&TypeKind::Void);
|
||||
insert_debug!(&TypeKind::Char);
|
||||
|
||||
for typedef in &self.typedefs {
|
||||
let mut typedefs = self.typedefs.clone();
|
||||
typedefs.sort_by(|a, b| b.source_module.cmp(&a.source_module));
|
||||
|
||||
for typedef in typedefs {
|
||||
let type_key = TypeKey(typedef.name.clone(), typedef.source_module);
|
||||
let type_value = if typedef.source_module != self.module_id {
|
||||
*modules
|
||||
.get(&typedef.source_module)
|
||||
.unwrap()
|
||||
.type_values
|
||||
.get(&type_key)
|
||||
.unwrap()
|
||||
} else {
|
||||
match &typedef.kind {
|
||||
TypeDefinitionKind::Struct(StructType(fields)) => {
|
||||
module.custom_type(CustomTypeKind::NamedStruct(NamedStruct(
|
||||
typedef.name.clone(),
|
||||
fields
|
||||
.iter()
|
||||
// TODO: Reorder custom-type definitions such that
|
||||
// inner types get evaluated first. Otherwise this
|
||||
// will cause a panic!
|
||||
.map(|StructField(_, t, _)| t.get_type(&type_values, &types))
|
||||
.collect(),
|
||||
)))
|
||||
}
|
||||
let type_value = match &typedef.kind {
|
||||
TypeDefinitionKind::Struct(StructType(fields)) => {
|
||||
module.custom_type(CustomTypeKind::NamedStruct(NamedStruct(
|
||||
typedef.name.clone(),
|
||||
fields
|
||||
.iter()
|
||||
// TODO: Reorder custom-type definitions such that
|
||||
// inner types get evaluated first. Otherwise this
|
||||
// will cause a panic!
|
||||
.map(|StructField(_, t, _)| t.get_type(&type_values, &types))
|
||||
.collect(),
|
||||
)))
|
||||
}
|
||||
};
|
||||
types.insert(type_value, typedef.clone());
|
||||
@ -316,120 +314,128 @@ impl mir::Module {
|
||||
|
||||
for mir_function in &self.functions {
|
||||
let function = functions.get(&mir_function.name).unwrap();
|
||||
let mut entry = function.ir.block("entry");
|
||||
|
||||
// Insert debug information
|
||||
let debug_scope = if let Some(location) =
|
||||
mir_function.signature().into_debug(tokens, compile_unit)
|
||||
{
|
||||
// let debug_scope = debug.inner_scope(&outer_scope, location);
|
||||
|
||||
let fn_param_ty = &mir_function.return_type.get_debug_type_hard(
|
||||
compile_unit,
|
||||
&debug,
|
||||
&debug_types,
|
||||
&type_values,
|
||||
&types,
|
||||
tokens,
|
||||
);
|
||||
|
||||
let debug_ty = debug.debug_type(DebugTypeData::Subprogram(DebugSubprogramType {
|
||||
parameters: vec![*fn_param_ty],
|
||||
flags: DwarfFlags,
|
||||
}));
|
||||
|
||||
let subprogram = debug.subprogram(DebugSubprogramData {
|
||||
name: mir_function.name.clone(),
|
||||
outer_scope: compile_unit.clone(),
|
||||
location,
|
||||
ty: debug_ty,
|
||||
opts: DebugSubprogramOptionals {
|
||||
is_local: !mir_function.is_pub,
|
||||
is_definition: true,
|
||||
..DebugSubprogramOptionals::default()
|
||||
},
|
||||
});
|
||||
|
||||
function.ir.set_debug(subprogram);
|
||||
|
||||
Some(subprogram)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
// Compile actual IR part
|
||||
let mut stack_values = HashMap::new();
|
||||
for (i, (p_name, p_ty)) in mir_function.parameters.iter().enumerate() {
|
||||
// Codegen actual parameters
|
||||
let arg_name = format!("arg.{}", p_name);
|
||||
let param = entry
|
||||
.build_named(format!("{}.get", arg_name), Instr::Param(i))
|
||||
.unwrap();
|
||||
let alloca = entry
|
||||
.build_named(
|
||||
&arg_name,
|
||||
Instr::Alloca(p_ty.get_type(&type_values, &types)),
|
||||
)
|
||||
.unwrap();
|
||||
entry
|
||||
.build_named(format!("{}.store", arg_name), Instr::Store(alloca, param))
|
||||
.unwrap();
|
||||
stack_values.insert(
|
||||
p_name.clone(),
|
||||
StackValue(
|
||||
StackValueKind::mutable(p_ty.is_mutable(), alloca),
|
||||
TypeKind::CodegenPtr(Box::new(p_ty.clone())),
|
||||
),
|
||||
);
|
||||
|
||||
// Generate debug info
|
||||
if let (Some(debug_scope), Some(location)) = (
|
||||
&debug_scope,
|
||||
mir_function.signature().into_debug(tokens, compile_unit),
|
||||
) {
|
||||
debug.metadata(
|
||||
&location,
|
||||
DebugMetadata::ParamVar(DebugParamVariable {
|
||||
name: p_name.clone(),
|
||||
arg_idx: i as u32,
|
||||
ty: p_ty.get_debug_type_hard(
|
||||
*debug_scope,
|
||||
&debug,
|
||||
&debug_types,
|
||||
&type_values,
|
||||
&types,
|
||||
tokens,
|
||||
),
|
||||
always_preserve: true,
|
||||
flags: DwarfFlags,
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let mut scope = Scope {
|
||||
context,
|
||||
modules: &modules,
|
||||
tokens,
|
||||
module: &module,
|
||||
module_id: self.module_id,
|
||||
function,
|
||||
block: entry,
|
||||
functions: &functions,
|
||||
types: &types,
|
||||
type_values: &type_values,
|
||||
stack_values,
|
||||
debug: debug_scope.and_then(|scope| {
|
||||
Some(Debug {
|
||||
info: &debug,
|
||||
scope,
|
||||
types: &debug_types,
|
||||
})
|
||||
}),
|
||||
};
|
||||
|
||||
match &mir_function.kind {
|
||||
mir::FunctionDefinitionKind::Local(block, _) => {
|
||||
let mut entry = function.ir.block("entry");
|
||||
|
||||
// Insert debug information
|
||||
let debug_scope = if let Some(location) =
|
||||
mir_function.signature().into_debug(tokens, compile_unit)
|
||||
{
|
||||
// let debug_scope = debug.inner_scope(&outer_scope, location);
|
||||
|
||||
let fn_param_ty = &mir_function.return_type.get_debug_type_hard(
|
||||
compile_unit,
|
||||
&debug,
|
||||
&debug_types,
|
||||
&type_values,
|
||||
&types,
|
||||
self.module_id,
|
||||
&self.tokens,
|
||||
&modules,
|
||||
);
|
||||
|
||||
let debug_ty =
|
||||
debug.debug_type(DebugTypeData::Subprogram(DebugSubprogramType {
|
||||
parameters: vec![*fn_param_ty],
|
||||
flags: DwarfFlags,
|
||||
}));
|
||||
|
||||
let subprogram = debug.subprogram(DebugSubprogramData {
|
||||
name: mir_function.name.clone(),
|
||||
outer_scope: compile_unit.clone(),
|
||||
location,
|
||||
ty: debug_ty,
|
||||
opts: DebugSubprogramOptionals {
|
||||
is_local: !mir_function.is_pub,
|
||||
is_definition: true,
|
||||
..DebugSubprogramOptionals::default()
|
||||
},
|
||||
});
|
||||
|
||||
function.ir.set_debug(subprogram);
|
||||
|
||||
Some(subprogram)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
// Compile actual IR part
|
||||
let mut stack_values = HashMap::new();
|
||||
for (i, (p_name, p_ty)) in mir_function.parameters.iter().enumerate() {
|
||||
// Codegen actual parameters
|
||||
let arg_name = format!("arg.{}", p_name);
|
||||
let param = entry
|
||||
.build_named(format!("{}.get", arg_name), Instr::Param(i))
|
||||
.unwrap();
|
||||
let alloca = entry
|
||||
.build_named(
|
||||
&arg_name,
|
||||
Instr::Alloca(p_ty.get_type(&type_values, &types)),
|
||||
)
|
||||
.unwrap();
|
||||
entry
|
||||
.build_named(format!("{}.store", arg_name), Instr::Store(alloca, param))
|
||||
.unwrap();
|
||||
stack_values.insert(
|
||||
p_name.clone(),
|
||||
StackValue(
|
||||
StackValueKind::mutable(p_ty.is_mutable(), alloca),
|
||||
TypeKind::CodegenPtr(Box::new(p_ty.clone())),
|
||||
),
|
||||
);
|
||||
|
||||
// Generate debug info
|
||||
if let (Some(debug_scope), Some(location)) = (
|
||||
&debug_scope,
|
||||
mir_function.signature().into_debug(tokens, compile_unit),
|
||||
) {
|
||||
dbg!(mir_function.name.clone());
|
||||
dbg!(p_name.clone());
|
||||
// debug.metadata(
|
||||
// &location,
|
||||
// DebugMetadata::ParamVar(DebugParamVariable {
|
||||
// name: p_name.clone(),
|
||||
// arg_idx: i as u32,
|
||||
// ty: p_ty.get_debug_type_hard(
|
||||
// *debug_scope,
|
||||
// &debug,
|
||||
// &debug_types,
|
||||
// &type_values,
|
||||
// &types,
|
||||
// self.module_id,
|
||||
// &self.tokens,
|
||||
// &modules,
|
||||
// ),
|
||||
// always_preserve: true,
|
||||
// flags: DwarfFlags,
|
||||
// }),
|
||||
// );
|
||||
}
|
||||
}
|
||||
|
||||
let mut scope = Scope {
|
||||
context,
|
||||
modules: &modules,
|
||||
tokens,
|
||||
module: &module,
|
||||
module_id: self.module_id,
|
||||
function,
|
||||
block: entry,
|
||||
functions: &functions,
|
||||
types: &types,
|
||||
type_values: &type_values,
|
||||
stack_values,
|
||||
debug: debug_scope.and_then(|scope| {
|
||||
Some(Debug {
|
||||
info: &debug,
|
||||
scope,
|
||||
types: &debug_types,
|
||||
})
|
||||
}),
|
||||
};
|
||||
|
||||
let state = State::default();
|
||||
if let Some(ret) = block.codegen(&mut scope, &state) {
|
||||
scope.block.terminate(Term::Ret(ret.instr())).unwrap();
|
||||
@ -454,7 +460,9 @@ impl mir::Module {
|
||||
|
||||
ModuleCodegen {
|
||||
module,
|
||||
debug_types: Some(debug_types),
|
||||
type_values,
|
||||
tokens: &self.tokens,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -680,8 +688,9 @@ impl mir::Expression {
|
||||
let params = call
|
||||
.parameters
|
||||
.iter()
|
||||
.map(|e| e.codegen(scope, &mut state.load(true)).unwrap().instr())
|
||||
.collect();
|
||||
.map(|e| e.codegen(scope, state).unwrap())
|
||||
.collect::<Vec<_>>();
|
||||
let param_instrs = params.iter().map(|e| e.instr()).collect();
|
||||
let callee = scope
|
||||
.functions
|
||||
.get(&call.name)
|
||||
@ -691,7 +700,7 @@ impl mir::Expression {
|
||||
.block
|
||||
.build_named(
|
||||
call.name.clone(),
|
||||
Instr::FunctionCall(callee.ir.value(), params),
|
||||
Instr::FunctionCall(callee.ir.value(), param_instrs),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
@ -769,7 +778,6 @@ impl mir::Expression {
|
||||
};
|
||||
|
||||
let (ptr, contained_ty) = if let TypeKind::UserPtr(further_inner) = *inner.clone() {
|
||||
dbg!(&further_inner, &val_t);
|
||||
let loaded = scope
|
||||
.block
|
||||
.build_named(
|
||||
@ -806,7 +814,6 @@ impl mir::Expression {
|
||||
};
|
||||
|
||||
if state.should_load {
|
||||
dbg!(&contained_ty);
|
||||
Some(StackValue(
|
||||
kind.derive(
|
||||
scope
|
||||
@ -900,7 +907,6 @@ impl mir::Expression {
|
||||
mir::ExprKind::Accessed(expression, type_kind, field) => {
|
||||
let struct_val = expression.codegen(scope, &state.load(false)).unwrap();
|
||||
|
||||
dbg!(&expression, &struct_val);
|
||||
let TypeKind::CodegenPtr(inner) = &struct_val.1 else {
|
||||
panic!("tried accessing non-pointer");
|
||||
};
|
||||
@ -1049,7 +1055,7 @@ impl mir::Expression {
|
||||
};
|
||||
StackValue(
|
||||
StackValueKind::mutable(mutable, var_ptr_instr),
|
||||
*borrow_inner.clone(),
|
||||
TypeKind::CodegenPtr(borrow_inner.clone()),
|
||||
)
|
||||
}
|
||||
})
|
||||
@ -1059,7 +1065,18 @@ impl mir::Expression {
|
||||
if val.1 == *type_kind {
|
||||
Some(val)
|
||||
} else if let (TypeKind::UserPtr(_), TypeKind::UserPtr(_)) = (&val.1, type_kind) {
|
||||
Some(val)
|
||||
Some(StackValue(
|
||||
val.0.derive(
|
||||
scope
|
||||
.block
|
||||
.build(Instr::BitCast(
|
||||
val.instr(),
|
||||
type_kind.get_type(scope.type_values, scope.types),
|
||||
))
|
||||
.unwrap(),
|
||||
),
|
||||
type_kind.clone(),
|
||||
))
|
||||
} else {
|
||||
let cast_instr = val
|
||||
.1
|
||||
@ -1262,7 +1279,7 @@ impl TypeKind {
|
||||
TypeKind::F128 => Type::F128,
|
||||
TypeKind::F80 => Type::F80,
|
||||
TypeKind::F128PPC => Type::F128PPC,
|
||||
TypeKind::Char => Type::I8,
|
||||
TypeKind::Char => Type::U8,
|
||||
TypeKind::Array(elem_t, len) => {
|
||||
Type::Array(Box::new(elem_t.get_type(type_vals, typedefs)), *len)
|
||||
}
|
||||
@ -1293,7 +1310,9 @@ impl TypeKind {
|
||||
debug.types,
|
||||
scope.type_values,
|
||||
scope.types,
|
||||
scope.module_id,
|
||||
scope.tokens,
|
||||
scope.modules,
|
||||
)
|
||||
}
|
||||
|
||||
@ -1304,7 +1323,9 @@ impl TypeKind {
|
||||
debug_types: &HashMap<TypeKind, DebugTypeValue>,
|
||||
type_values: &HashMap<TypeKey, TypeValue>,
|
||||
types: &HashMap<TypeValue, TypeDefinition>,
|
||||
local_mod: SourceModuleId,
|
||||
tokens: &Vec<FullToken>,
|
||||
modules: &HashMap<SourceModuleId, ModuleCodegen>,
|
||||
) -> DebugTypeValue {
|
||||
if let Some(ty) = debug_types.get(self) {
|
||||
return *ty;
|
||||
@ -1322,7 +1343,9 @@ impl TypeKind {
|
||||
debug_types,
|
||||
type_values,
|
||||
types,
|
||||
local_mod,
|
||||
tokens,
|
||||
modules,
|
||||
),
|
||||
size_bits: self.size_of(),
|
||||
})
|
||||
@ -1334,7 +1357,9 @@ impl TypeKind {
|
||||
debug_types,
|
||||
type_values,
|
||||
types,
|
||||
local_mod,
|
||||
tokens,
|
||||
modules,
|
||||
);
|
||||
DebugTypeData::Array(DebugArrayType {
|
||||
size_bits: self.size_of(),
|
||||
@ -1345,15 +1370,21 @@ impl TypeKind {
|
||||
}
|
||||
TypeKind::CustomType(key) => {
|
||||
let typedef = types.get(type_values.get(key).unwrap()).unwrap();
|
||||
|
||||
match &typedef.kind {
|
||||
TypeDefinitionKind::Struct(struct_type) => {
|
||||
let mut fields = Vec::new();
|
||||
let mut size_bits = 0;
|
||||
|
||||
for field in &struct_type.0 {
|
||||
let location = if typedef.source_module != local_mod {
|
||||
None
|
||||
} else {
|
||||
field.2.into_debug(&tokens, scope)
|
||||
};
|
||||
fields.push(DebugFieldType {
|
||||
name: field.0.clone(),
|
||||
location: field.2.into_debug(tokens, scope).unwrap(),
|
||||
scope,
|
||||
pos: location.map(|l| l.pos),
|
||||
size_bits: field.1.size_of(),
|
||||
offset: size_bits,
|
||||
flags: DwarfFlags,
|
||||
@ -1363,15 +1394,23 @@ impl TypeKind {
|
||||
debug_types,
|
||||
type_values,
|
||||
types,
|
||||
local_mod,
|
||||
tokens,
|
||||
modules,
|
||||
),
|
||||
});
|
||||
size_bits += field.1.size_of();
|
||||
}
|
||||
{
|
||||
let location = if typedef.source_module != local_mod {
|
||||
None
|
||||
} else {
|
||||
typedef.meta.into_debug(&tokens, scope)
|
||||
};
|
||||
DebugTypeData::Struct(DebugStructType {
|
||||
name: key.0.clone(),
|
||||
location: typedef.meta.into_debug(tokens, scope).unwrap(),
|
||||
scope,
|
||||
pos: location.map(|l| l.pos),
|
||||
size_bits,
|
||||
flags: DwarfFlags,
|
||||
fields,
|
||||
@ -1422,7 +1461,7 @@ impl Metadata {
|
||||
if let Some((start, _)) = self.into_positions(tokens) {
|
||||
Some(start.debug(scope))
|
||||
} else {
|
||||
Some(Position(0, 0).debug(scope))
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1430,8 +1469,10 @@ impl Metadata {
|
||||
impl Position {
|
||||
fn debug(self, scope: DebugProgramValue) -> DebugLocation {
|
||||
DebugLocation {
|
||||
line: self.1,
|
||||
column: self.0,
|
||||
pos: DebugPosition {
|
||||
line: self.1,
|
||||
column: self.0,
|
||||
},
|
||||
scope,
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user