From 4850df78742d23077f48e85abb71ab7b9fc04ccf Mon Sep 17 00:00:00 2001 From: ychenfo Date: Wed, 13 Apr 2022 18:08:23 +0800 Subject: [PATCH] nac3core: add function debug info --- nac3core/src/codegen/mod.rs | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/nac3core/src/codegen/mod.rs b/nac3core/src/codegen/mod.rs index f9c6786d3..33cbe3db0 100644 --- a/nac3core/src/codegen/mod.rs +++ b/nac3core/src/codegen/mod.rs @@ -18,7 +18,7 @@ use inkwell::{ passes::{PassManager, PassManagerBuilder}, types::{AnyType, BasicType, BasicTypeEnum}, values::{BasicValueEnum, FunctionValue, PhiValue, PointerValue}, - debug_info::{DebugInfoBuilder, DICompileUnit}, + debug_info::{DebugInfoBuilder, DICompileUnit, DISubprogram, AsDIScope, DIFlagsConstants}, }; use itertools::Itertools; use nac3parser::ast::{Stmt, StrRef, Location}; @@ -557,6 +557,34 @@ pub fn gen_func_impl< context.create_type_attribute(Attribute::get_named_enum_kind_id("sret"), ret_type.unwrap().as_any_type_enum())); } + { + let ditype = debug_info_builder.dibuilder.create_basic_type( + "_", + 0_u64, + 0x00, + inkwell::debug_info::DIFlags::PUBLIC, + ).unwrap(); + let subroutine_type = debug_info_builder.dibuilder.create_subroutine_type( + debug_info_builder.compile_unit.get_file(), + /* return type */ Some(ditype.as_type()), + /* parameter types */ &[], + inkwell::debug_info::DIFlags::PUBLIC, + ); + let func_scope: DISubprogram<'_> = debug_info_builder.dibuilder.create_function( + /* scope */ debug_info_builder.compile_unit.as_debug_info_scope(), + /* func name */ "main", + /* linkage_name */ None, + /* file */ debug_info_builder.compile_unit.get_file(), + /* line_no */ 0, + /* DIType */ subroutine_type, + /* is_local_to_unit */ true, + /* is_definition */ true, + /* scope_line */ 0, + /* flags */ inkwell::debug_info::DIFlags::PUBLIC, + /* is_optimized */ false, + ); + fn_val.set_subprogram(func_scope); + } let init_bb = context.append_basic_block(fn_val, "init"); builder.position_at_end(init_bb); @@ -636,7 +664,7 @@ pub fn gen_func_impl< if let Err(e) = result { return Err((builder, debug_info_builder, e)); } - + debug_info_builder.dibuilder.finalize(); Ok((builder, module, fn_val, debug_info_builder)) }