Fix around in debug information generation, fix subprogram not being set
This commit is contained in:
parent
0c6d9885ec
commit
990d8cb448
@ -8,7 +8,7 @@ use crate::{
|
||||
TerminatorKind, Type, TypeData,
|
||||
debug_information::{
|
||||
DebugFileData, DebugInformation, DebugLocation, DebugLocationValue, DebugMetadataValue,
|
||||
DebugSubprogramValue,
|
||||
DebugProgramValue,
|
||||
},
|
||||
util::match_types,
|
||||
};
|
||||
@ -199,7 +199,7 @@ impl Builder {
|
||||
pub(crate) unsafe fn set_debug_subprogram(
|
||||
&self,
|
||||
value: &FunctionValue,
|
||||
subprogram: DebugSubprogramValue,
|
||||
subprogram: DebugProgramValue,
|
||||
) {
|
||||
unsafe {
|
||||
let mut modules = self.modules.borrow_mut();
|
||||
|
@ -199,9 +199,9 @@ pub struct LLVMDebugInformation<'a> {
|
||||
debug: &'a DebugInformation,
|
||||
builder: LLVMDIBuilderRef,
|
||||
file_ref: LLVMMetadataRef,
|
||||
scopes: &'a HashMap<DebugScopeValue, LLVMMetadataRef>,
|
||||
// scopes: &'a HashMap<DebugScopeValue, LLVMMetadataRef>,
|
||||
types: &'a mut HashMap<DebugTypeValue, LLVMMetadataRef>,
|
||||
subprograms: &'a mut HashMap<DebugSubprogramValue, LLVMMetadataRef>,
|
||||
programs: &'a mut HashMap<DebugProgramValue, LLVMMetadataRef>,
|
||||
metadata: &'a mut HashMap<DebugMetadataValue, LLVMMetadataRef>,
|
||||
}
|
||||
|
||||
@ -227,10 +227,9 @@ impl ModuleHolder {
|
||||
|
||||
// Compile the contents
|
||||
|
||||
let mut scopes = HashMap::new();
|
||||
let mut types = HashMap::new();
|
||||
let mut metadata = HashMap::new();
|
||||
let mut subprograms = HashMap::new();
|
||||
let mut programs = HashMap::new();
|
||||
|
||||
let mut debug = if let Some(debug) = &self.debug_information {
|
||||
let di_builder = LLVMCreateDIBuilder(module_ref);
|
||||
@ -277,10 +276,15 @@ impl ModuleHolder {
|
||||
0,
|
||||
);
|
||||
|
||||
let scope = debug.get_scopes();
|
||||
scope
|
||||
.borrow()
|
||||
.compile_scope(compile_unit, file_ref, &mut scopes, di_builder);
|
||||
// let scope = debug.get_scopes();
|
||||
// scopes.insert(scope.borrow().value.clone(), compile_unit);
|
||||
// for scope in &scope.borrow().inner_scopes {
|
||||
// dbg!("hello");
|
||||
// scope.compile_scope(compile_unit, file_ref, &mut scopes, di_builder);
|
||||
// }
|
||||
// dbg!("after!");
|
||||
|
||||
programs.insert(DebugProgramValue(0), compile_unit);
|
||||
|
||||
let debug = LLVMDebugInformation {
|
||||
builder: di_builder,
|
||||
@ -288,8 +292,7 @@ impl ModuleHolder {
|
||||
file_ref,
|
||||
types: &mut types,
|
||||
metadata: &mut metadata,
|
||||
subprograms: &mut subprograms,
|
||||
scopes: &scopes,
|
||||
programs: &mut programs,
|
||||
};
|
||||
|
||||
for ty in debug.debug.get_types().borrow().iter() {
|
||||
@ -308,18 +311,22 @@ impl ModuleHolder {
|
||||
|
||||
let mut functions = HashMap::new();
|
||||
for function in &self.functions {
|
||||
functions.insert(
|
||||
function.value,
|
||||
function.compile_signature(context, module_ref, &types, &debug),
|
||||
);
|
||||
let func = function.compile_signature(context, module_ref, &types, &debug);
|
||||
functions.insert(function.value, func);
|
||||
|
||||
if let Some(debug) = &mut debug {
|
||||
if let Some(program_value) = function.data.debug {
|
||||
debug.programs.insert(program_value, func.metadata.unwrap());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if let Some(debug) = &mut debug {
|
||||
// for subprogram in debug.debug.get_subprograms().borrow().iter() {
|
||||
// let meta_ref = subprogram.compile_debug(&functions, &debug);
|
||||
// debug.subprograms.insert(subprogram.value.clone(), meta_ref);
|
||||
// }
|
||||
// }
|
||||
if let Some(debug) = &mut debug {
|
||||
for meta in debug.debug.get_metadata().borrow().iter() {
|
||||
let meta_ref = meta.compile(&debug);
|
||||
debug.metadata.insert(meta.value.clone(), meta_ref);
|
||||
}
|
||||
}
|
||||
|
||||
let mut module = LLVMModule {
|
||||
builder,
|
||||
@ -377,15 +384,16 @@ impl DebugScopeHolder {
|
||||
}
|
||||
|
||||
impl DebugMetadataHolder {
|
||||
unsafe fn compile_meta(&self, debug: &LLVMDebugInformation) -> LLVMMetadataRef {
|
||||
unsafe fn compile(&self, debug: &LLVMDebugInformation) -> LLVMMetadataRef {
|
||||
dbg!(&self.program);
|
||||
unsafe {
|
||||
match &self.data {
|
||||
DebugMetadata::ParamVar(param) => LLVMDIBuilderCreateParameterVariable(
|
||||
debug.builder,
|
||||
*debug.scopes.get(&self.scope).unwrap(),
|
||||
*debug.programs.get(&self.program).unwrap(),
|
||||
into_cstring(param.name.clone()).as_ptr(),
|
||||
param.name.len(),
|
||||
param.arg_idx,
|
||||
param.arg_idx + 1,
|
||||
debug.file_ref,
|
||||
param.location.line,
|
||||
*debug.types.get(¶m.ty).unwrap(),
|
||||
@ -493,9 +501,9 @@ impl FunctionHolder {
|
||||
let mangled_name = LLVMGetValueName2(function_ref, mangled_length_ptr);
|
||||
let mangled_length = *mangled_length_ptr;
|
||||
|
||||
Some(LLVMDIBuilderCreateFunction(
|
||||
let subprogram = LLVMDIBuilderCreateFunction(
|
||||
debug.builder,
|
||||
*debug.scopes.get(&subprogram.scope).unwrap(),
|
||||
*debug.programs.get(&subprogram.outer_scope).unwrap(),
|
||||
into_cstring(subprogram.name.clone()).as_ptr(),
|
||||
subprogram.name.clone().len(),
|
||||
mangled_name,
|
||||
@ -508,7 +516,9 @@ impl FunctionHolder {
|
||||
subprogram.opts.scope_line,
|
||||
subprogram.opts.flags.as_llvm(),
|
||||
subprogram.opts.is_optimized as i32,
|
||||
))
|
||||
);
|
||||
LLVMSetSubprogram(function_ref, subprogram);
|
||||
Some(subprogram)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ use std::{
|
||||
pub struct DebugScopeValue(pub Vec<usize>);
|
||||
|
||||
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
|
||||
pub struct DebugLocationValue(pub DebugScopeValue, pub usize);
|
||||
pub struct DebugLocationValue(pub DebugProgramValue, pub usize);
|
||||
|
||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
|
||||
pub struct DebugTypeValue(pub usize);
|
||||
@ -15,8 +15,9 @@ pub struct DebugTypeValue(pub usize);
|
||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
|
||||
pub struct DebugMetadataValue(pub usize);
|
||||
|
||||
/// Represents either a subprogram, or the compilation context
|
||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
|
||||
pub struct DebugSubprogramValue(pub usize);
|
||||
pub struct DebugProgramValue(pub usize);
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct DebugFileData {
|
||||
@ -34,7 +35,7 @@ pub(crate) struct DebugScopeHolder {
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct DebugMetadataHolder {
|
||||
pub(crate) scope: DebugScopeValue,
|
||||
pub(crate) program: DebugProgramValue,
|
||||
pub(crate) value: DebugMetadataValue,
|
||||
pub(crate) data: DebugMetadata,
|
||||
}
|
||||
@ -47,7 +48,7 @@ pub struct DebugTypeHolder {
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct DebugSubprogramHolder {
|
||||
pub(crate) value: DebugSubprogramValue,
|
||||
pub(crate) value: DebugProgramValue,
|
||||
pub(crate) data: DebugSubprogramData,
|
||||
}
|
||||
|
||||
@ -60,81 +61,74 @@ pub(crate) struct DebugLocationHolder {
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct DebugInformation {
|
||||
pub file: DebugFileData,
|
||||
scope: Rc<RefCell<DebugScopeHolder>>,
|
||||
subprograms: Rc<RefCell<Vec<DebugSubprogramHolder>>>,
|
||||
// scope: Rc<RefCell<DebugScopeHolder>>,
|
||||
locations: Rc<RefCell<Vec<DebugLocationHolder>>>,
|
||||
programs: Rc<RefCell<Vec<DebugSubprogramHolder>>>,
|
||||
metadata: Rc<RefCell<Vec<DebugMetadataHolder>>>,
|
||||
types: Rc<RefCell<Vec<DebugTypeHolder>>>,
|
||||
}
|
||||
|
||||
impl DebugInformation {
|
||||
pub fn from_file(file: DebugFileData) -> (DebugInformation, DebugScopeValue) {
|
||||
let scope_value = DebugScopeValue(Vec::new());
|
||||
pub fn from_file(file: DebugFileData) -> (DebugInformation, DebugProgramValue) {
|
||||
(
|
||||
DebugInformation {
|
||||
file,
|
||||
scope: Rc::new(RefCell::new(DebugScopeHolder {
|
||||
value: scope_value.clone(),
|
||||
inner_scopes: Vec::new(),
|
||||
locations: Vec::new(),
|
||||
location: None,
|
||||
})),
|
||||
// scope: Rc::new(RefCell::new(DebugScopeHolder {
|
||||
// value: scope_value.clone(),
|
||||
// inner_scopes: Vec::new(),
|
||||
// locations: Vec::new(),
|
||||
// location: None,
|
||||
// })),
|
||||
locations: Rc::new(RefCell::new(Vec::new())),
|
||||
metadata: Rc::new(RefCell::new(Vec::new())),
|
||||
subprograms: Rc::new(RefCell::new(Vec::new())),
|
||||
programs: Rc::new(RefCell::new(Vec::new())),
|
||||
types: Rc::new(RefCell::new(Vec::new())),
|
||||
},
|
||||
scope_value,
|
||||
DebugProgramValue(0),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn inner_scope(
|
||||
&self,
|
||||
parent: &DebugScopeValue,
|
||||
location: DebugLocation,
|
||||
) -> DebugScopeValue {
|
||||
unsafe {
|
||||
let mut outer_scope = RefMut::map(self.scope.borrow_mut(), |mut v| {
|
||||
for i in &parent.0 {
|
||||
v = v.inner_scopes.get_unchecked_mut(*i);
|
||||
}
|
||||
v
|
||||
});
|
||||
// pub fn inner_scope(
|
||||
// &self,
|
||||
// parent: &DebugScopeValue,
|
||||
// location: DebugLocation,
|
||||
// ) -> DebugScopeValue {
|
||||
// unsafe {
|
||||
// let mut outer_scope = RefMut::map(self.scope.borrow_mut(), |mut v| {
|
||||
// for i in &parent.0 {
|
||||
// v = v.inner_scopes.get_unchecked_mut(*i);
|
||||
// }
|
||||
// v
|
||||
// });
|
||||
|
||||
let mut arr = parent.0.clone();
|
||||
arr.push(parent.0.len());
|
||||
let value = DebugScopeValue(arr);
|
||||
// let mut arr = parent.0.clone();
|
||||
// arr.push(parent.0.len());
|
||||
// let value = DebugScopeValue(arr);
|
||||
|
||||
outer_scope.inner_scopes.push(DebugScopeHolder {
|
||||
value: value.clone(),
|
||||
inner_scopes: Vec::new(),
|
||||
locations: Vec::new(),
|
||||
location: Some(location),
|
||||
});
|
||||
value
|
||||
}
|
||||
}
|
||||
// outer_scope.inner_scopes.push(DebugScopeHolder {
|
||||
// value: value.clone(),
|
||||
// inner_scopes: Vec::new(),
|
||||
// locations: Vec::new(),
|
||||
// location: Some(location),
|
||||
// });
|
||||
// value
|
||||
// }
|
||||
// }
|
||||
|
||||
pub fn location(
|
||||
&self,
|
||||
scope_value: &DebugScopeValue,
|
||||
program_value: &DebugProgramValue,
|
||||
line: u32,
|
||||
column: u32,
|
||||
) -> DebugLocationValue {
|
||||
unsafe {
|
||||
let mut scope = RefMut::map(self.scope.borrow_mut(), |mut v| {
|
||||
for i in &scope_value.0 {
|
||||
v = v.inner_scopes.get_unchecked_mut(*i);
|
||||
}
|
||||
v
|
||||
});
|
||||
let value = DebugLocationValue(scope_value.clone(), scope.locations.len());
|
||||
let value = DebugLocationValue(program_value.clone(), self.locations.borrow().len());
|
||||
let location = DebugLocationHolder {
|
||||
value: value.clone(),
|
||||
location: DebugLocation { line, column },
|
||||
};
|
||||
scope.locations.push(location);
|
||||
self.locations.borrow_mut().push(location);
|
||||
value
|
||||
}
|
||||
}
|
||||
|
||||
pub fn debug_type(&self, kind: DebugTypeData) -> DebugTypeValue {
|
||||
let mut types = self.types.borrow_mut();
|
||||
@ -146,11 +140,11 @@ impl DebugInformation {
|
||||
value
|
||||
}
|
||||
|
||||
pub fn metadata(&self, scope: &DebugScopeValue, kind: DebugMetadata) -> DebugMetadataValue {
|
||||
pub fn metadata(&self, program: &DebugProgramValue, kind: DebugMetadata) -> DebugMetadataValue {
|
||||
let mut metadata = self.metadata.borrow_mut();
|
||||
let value = DebugMetadataValue(metadata.len());
|
||||
metadata.push(DebugMetadataHolder {
|
||||
scope: scope.clone(),
|
||||
program: *program,
|
||||
value: value.clone(),
|
||||
data: kind,
|
||||
});
|
||||
@ -164,9 +158,9 @@ impl DebugInformation {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn subprogram(&self, kind: DebugSubprogramData) -> DebugSubprogramValue {
|
||||
let mut subprogram = self.subprograms.borrow_mut();
|
||||
let value = DebugSubprogramValue(subprogram.len());
|
||||
pub fn subprogram(&self, kind: DebugSubprogramData) -> DebugProgramValue {
|
||||
let mut subprogram = self.programs.borrow_mut();
|
||||
let value = DebugProgramValue(subprogram.len() + 1);
|
||||
subprogram.push(DebugSubprogramHolder {
|
||||
value: value.clone(),
|
||||
data: kind,
|
||||
@ -178,23 +172,23 @@ impl DebugInformation {
|
||||
self.metadata.clone()
|
||||
}
|
||||
|
||||
pub fn get_scopes(&self) -> Rc<RefCell<DebugScopeHolder>> {
|
||||
self.scope.clone()
|
||||
}
|
||||
// pub fn get_scopes(&self) -> Rc<RefCell<DebugScopeHolder>> {
|
||||
// self.scope.clone()
|
||||
// }
|
||||
|
||||
pub fn get_subprograms(&self) -> Rc<RefCell<Vec<DebugSubprogramHolder>>> {
|
||||
self.subprograms.clone()
|
||||
self.programs.clone()
|
||||
}
|
||||
|
||||
pub fn get_types(&self) -> Rc<RefCell<Vec<DebugTypeHolder>>> {
|
||||
self.types.clone()
|
||||
}
|
||||
|
||||
pub fn get_subprogram_data(&self, value: &DebugSubprogramValue) -> DebugSubprogramData {
|
||||
pub fn get_subprogram_data(&self, value: &DebugProgramValue) -> DebugSubprogramData {
|
||||
unsafe {
|
||||
self.subprograms
|
||||
self.programs
|
||||
.borrow()
|
||||
.get_unchecked(value.0)
|
||||
.get_unchecked(value.0 - 1)
|
||||
.data
|
||||
.clone()
|
||||
}
|
||||
@ -277,7 +271,7 @@ pub struct DebugSubprogramTypeData {
|
||||
}
|
||||
|
||||
pub struct DebugSubprogramType {
|
||||
pub params: Vec<DebugSubprogramValue>,
|
||||
pub params: Vec<DebugProgramValue>,
|
||||
pub flags: DwarfFlags,
|
||||
}
|
||||
|
||||
@ -296,7 +290,7 @@ pub enum DwarfEncoding {
|
||||
pub struct DebugSubprogramData {
|
||||
/// Function name.
|
||||
pub name: String,
|
||||
pub scope: DebugScopeValue,
|
||||
pub outer_scope: DebugProgramValue,
|
||||
/// Used for line number.
|
||||
pub location: DebugLocation,
|
||||
/// Function type.
|
||||
|
@ -8,7 +8,7 @@ use builder::{BlockValue, Builder, FunctionValue, InstructionValue, ModuleValue,
|
||||
use debug::PrintableModule;
|
||||
use debug_information::{
|
||||
DebugFileData, DebugInformation, DebugLocation, DebugLocationValue, DebugMetadataValue,
|
||||
DebugScopeValue, DebugSubprogramValue,
|
||||
DebugProgramValue, DebugScopeValue,
|
||||
};
|
||||
use util::match_types;
|
||||
|
||||
@ -106,10 +106,10 @@ impl<'ctx> Module<'ctx> {
|
||||
pub fn create_debug_info(
|
||||
&mut self,
|
||||
file: DebugFileData,
|
||||
) -> (DebugInformation, DebugScopeValue) {
|
||||
let (debug_info, scope) = DebugInformation::from_file(file);
|
||||
) -> (DebugInformation, DebugProgramValue) {
|
||||
let (debug_info, program_value) = DebugInformation::from_file(file);
|
||||
self.debug_info = Some(debug_info.clone());
|
||||
(debug_info, scope)
|
||||
(debug_info, program_value)
|
||||
}
|
||||
|
||||
pub fn get_debug_info(&self) -> &Option<DebugInformation> {
|
||||
@ -131,7 +131,7 @@ pub struct FunctionData {
|
||||
ret: Type,
|
||||
params: Vec<Type>,
|
||||
flags: FunctionFlags,
|
||||
debug: Option<DebugSubprogramValue>,
|
||||
debug: Option<DebugProgramValue>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, Hash)]
|
||||
@ -177,7 +177,7 @@ impl<'ctx> Function<'ctx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_debug(&self, subprogram: DebugSubprogramValue) {
|
||||
pub fn set_debug(&self, subprogram: DebugProgramValue) {
|
||||
unsafe {
|
||||
self.builder.set_debug_subprogram(&self.value, subprogram);
|
||||
}
|
||||
|
@ -5,8 +5,8 @@ use reid_lib::{
|
||||
compile::CompiledModule,
|
||||
debug_information::{
|
||||
DebugBasicType, DebugFileData, DebugInformation, DebugLocation, DebugMetadata,
|
||||
DebugMetadataValue, DebugParamVariable, DebugScopeValue, DebugSubprogramData,
|
||||
DebugSubprogramOptionals, DebugSubprogramTypeData, DebugSubprogramValue, DebugTypeData,
|
||||
DebugMetadataValue, DebugParamVariable, DebugProgramValue, DebugScopeValue,
|
||||
DebugSubprogramData, DebugSubprogramOptionals, DebugSubprogramTypeData, DebugTypeData,
|
||||
DebugTypeValue, DwarfEncoding, DwarfFlags,
|
||||
},
|
||||
Block, CmpPredicate, ConstValue, Context, CustomTypeKind, Function, FunctionFlags, Instr,
|
||||
@ -82,14 +82,18 @@ pub struct Scope<'ctx, 'a> {
|
||||
type_values: &'a HashMap<String, TypeValue>,
|
||||
functions: &'a HashMap<String, StackFunction<'ctx>>,
|
||||
stack_values: HashMap<String, StackValue>,
|
||||
debug: &'ctx DebugInformation,
|
||||
debug_scope: DebugScopeValue,
|
||||
debug: Option<Debug<'ctx>>,
|
||||
debug_const_tys: &'a HashMap<TypeKind, DebugTypeValue>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Debug<'ctx> {
|
||||
info: &'ctx DebugInformation,
|
||||
scope: Option<DebugProgramValue>,
|
||||
}
|
||||
|
||||
pub struct StackFunction<'ctx> {
|
||||
ir: Function<'ctx>,
|
||||
debug: DebugSubprogramValue,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
@ -114,8 +118,7 @@ impl<'ctx, 'a> Scope<'ctx, 'a> {
|
||||
types: self.types,
|
||||
type_values: self.type_values,
|
||||
stack_values: self.stack_values.clone(),
|
||||
debug: self.debug,
|
||||
debug_scope: self.debug_scope.clone(),
|
||||
debug: self.debug.clone(),
|
||||
debug_const_tys: self.debug_const_tys,
|
||||
}
|
||||
}
|
||||
@ -161,7 +164,7 @@ impl mir::Module {
|
||||
) -> ModuleCodegen<'ctx> {
|
||||
let mut module = context.module(&self.name, self.is_main);
|
||||
|
||||
let (debug, debug_scope) = if let Some(path) = &self.path {
|
||||
let (debug, compile_unit) = if let Some(path) = &self.path {
|
||||
module.create_debug_info(DebugFileData {
|
||||
name: path.file_name().unwrap().to_str().unwrap().to_owned(),
|
||||
directory: path.parent().unwrap().to_str().unwrap().to_owned(),
|
||||
@ -240,56 +243,60 @@ impl mir::Module {
|
||||
),
|
||||
};
|
||||
|
||||
let fn_return_ty = debug_const_types.get(&TypeKind::U32).unwrap();
|
||||
|
||||
let debug_ty = debug.debug_type(DebugTypeData::Subprogram(DebugSubprogramTypeData {
|
||||
parameters: vec![*fn_return_ty],
|
||||
flags: DwarfFlags,
|
||||
}));
|
||||
|
||||
let subprogram = debug.subprogram(DebugSubprogramData {
|
||||
name: function.name.clone(),
|
||||
scope: debug_scope.clone(),
|
||||
location: DebugLocation { line: 0, column: 0 },
|
||||
ty: debug_ty,
|
||||
opts: DebugSubprogramOptionals {
|
||||
is_local: !function.is_pub,
|
||||
is_definition: true,
|
||||
..DebugSubprogramOptionals::default()
|
||||
},
|
||||
});
|
||||
|
||||
func.set_debug(subprogram);
|
||||
|
||||
functions.insert(
|
||||
function.name.clone(),
|
||||
StackFunction {
|
||||
ir: func,
|
||||
debug: subprogram,
|
||||
},
|
||||
);
|
||||
functions.insert(function.name.clone(), StackFunction { ir: func });
|
||||
}
|
||||
|
||||
for mir_function in &self.functions {
|
||||
let function = functions.get(&mir_function.name).unwrap();
|
||||
let mut entry = function.ir.block("entry");
|
||||
|
||||
let location = match &mir_function.kind {
|
||||
mir::FunctionDefinitionKind::Local(_, metadata) => {
|
||||
metadata.into_debug(tokens).unwrap()
|
||||
}
|
||||
mir::FunctionDefinitionKind::Extern(_) => {
|
||||
// TODO extern should probably still have a meta
|
||||
DebugLocation {
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
// Insert debug information
|
||||
let debug_scope = if let Some(location) = mir_function.signature().into_debug(tokens) {
|
||||
// let debug_scope = debug.inner_scope(&outer_scope, location);
|
||||
|
||||
let fn_param_ty = debug_const_types.get(&TypeKind::U32).unwrap();
|
||||
|
||||
let debug_ty =
|
||||
debug.debug_type(DebugTypeData::Subprogram(DebugSubprogramTypeData {
|
||||
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
|
||||
};
|
||||
|
||||
let debug_scope = debug.inner_scope(&debug_scope, location);
|
||||
|
||||
// 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
|
||||
stack_values.insert(
|
||||
p_name.clone(),
|
||||
StackValue(
|
||||
StackValueKind::Immutable(entry.build(Instr::Param(i)).unwrap()),
|
||||
p_ty.get_type(&type_values, &types),
|
||||
),
|
||||
);
|
||||
|
||||
// Generate debug info
|
||||
if let (Some(debug_scope), Some(location)) =
|
||||
(&debug_scope, mir_function.signature().into_debug(tokens))
|
||||
{
|
||||
debug.metadata(
|
||||
&debug_scope,
|
||||
DebugMetadata::ParamVar(DebugParamVariable {
|
||||
@ -301,14 +308,7 @@ impl mir::Module {
|
||||
flags: DwarfFlags,
|
||||
}),
|
||||
);
|
||||
|
||||
stack_values.insert(
|
||||
p_name.clone(),
|
||||
StackValue(
|
||||
StackValueKind::Immutable(entry.build(Instr::Param(i)).unwrap()),
|
||||
p_ty.get_type(&type_values, &types),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let mut scope = Scope {
|
||||
@ -321,8 +321,7 @@ impl mir::Module {
|
||||
types: &types,
|
||||
type_values: &type_values,
|
||||
stack_values,
|
||||
debug: &debug,
|
||||
debug_scope: debug_scope,
|
||||
debug: None,
|
||||
debug_const_tys: &debug_const_types,
|
||||
};
|
||||
|
||||
|
@ -282,14 +282,14 @@ pub enum FunctionDefinitionKind {
|
||||
}
|
||||
|
||||
impl FunctionDefinition {
|
||||
fn block_meta(&self) -> Metadata {
|
||||
pub fn block_meta(&self) -> Metadata {
|
||||
match &self.kind {
|
||||
FunctionDefinitionKind::Local(block, _) => block.meta.clone(),
|
||||
FunctionDefinitionKind::Extern(_) => Metadata::default(),
|
||||
}
|
||||
}
|
||||
|
||||
fn signature(&self) -> Metadata {
|
||||
pub fn signature(&self) -> Metadata {
|
||||
match &self.kind {
|
||||
FunctionDefinitionKind::Local(_, metadata) => metadata.clone(),
|
||||
FunctionDefinitionKind::Extern(_) => Metadata::default(),
|
||||
|
Loading…
Reference in New Issue
Block a user