diff --git a/src/attributes.rs b/src/attributes.rs index 2ce0c83008f..3e21a33964b 100644 --- a/src/attributes.rs +++ b/src/attributes.rs @@ -7,6 +7,7 @@ use rustc_attr::InstructionSetAttr; #[cfg(feature = "master")] use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc_middle::ty; +use rustc_session::config::DebugInfo; use rustc_span::symbol::sym; use crate::gcc_util::{check_tied_features, to_gcc_features}; @@ -40,7 +41,8 @@ pub fn from_fn_attrs<'gcc, 'tcx>( #[cfg_attr(not(feature = "master"), allow(unused_variables))] func: Function<'gcc>, instance: ty::Instance<'tcx>, ) { - let codegen_fn_attrs = cx.tcx.codegen_fn_attrs(instance.def_id()); + let def_id = instance.def_id(); + let codegen_fn_attrs = cx.tcx.codegen_fn_attrs(def_id); #[cfg(feature = "master")] { @@ -69,6 +71,16 @@ pub fn from_fn_attrs<'gcc, 'tcx>( if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::FFI_CONST) { func.add_attribute(FnAttribute::Const); } + if cx.sess().opts.debuginfo != DebugInfo::None + && !codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NO_MANGLE) + && codegen_fn_attrs.export_name.is_none() + { + let parent = cx.get_or_create_module(&instance); + let signature = cx.tcx.symbol_name(instance).to_string(); + //let signature = cx.tcx.def_path_str(instance.def_id()); + func.add_attribute(FnAttribute::JITDwarfShortName(signature)); + func.set_parent_debug_namespace(parent); + } } let function_features = codegen_fn_attrs diff --git a/src/base.rs b/src/base.rs index 79a29a1135a..519f446a17e 100644 --- a/src/base.rs +++ b/src/base.rs @@ -183,6 +183,11 @@ pub fn compile_codegen_unit( { let cx = CodegenCx::new(&context, cgu, tcx, target_info.supports_128bit_int()); + // This should be set before the code is generated. + if cx.sess().opts.debuginfo != DebugInfo::None { + context.set_mangled_function_name(true); + } + let mono_items = cgu.items_in_deterministic_order(tcx); for &(mono_item, data) in &mono_items { mono_item.predefine::>(&cx, data.linkage, data.visibility); diff --git a/src/context.rs b/src/context.rs index 1b9cfd3652c..657f00020ca 100644 --- a/src/context.rs +++ b/src/context.rs @@ -1,7 +1,8 @@ use std::cell::{Cell, RefCell}; use gccjit::{ - Block, CType, Context, Function, FunctionPtrType, FunctionType, LValue, Location, RValue, Type, + Block, CType, Context, DebugNamespace, Function, FunctionPtrType, FunctionType, LValue, + Location, RValue, Type, }; use rustc_codegen_ssa::base::wants_msvc_seh; use rustc_codegen_ssa::errors as ssa_errors; @@ -86,6 +87,7 @@ pub struct CodegenCx<'gcc, 'tcx> { /// Cache generated vtables pub vtables: RefCell, Option>), RValue<'gcc>>>, + pub modules: RefCell, DebugNamespace>>, // TODO(antoyo): improve the SSA API to not require those. /// Mapping from function pointer type to indexes of on stack parameters. @@ -315,6 +317,7 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { on_stack_params: Default::default(), on_stack_function_params: Default::default(), vtables: Default::default(), + modules: Default::default(), const_globals: Default::default(), global_lvalues: Default::default(), const_str_cache: Default::default(), diff --git a/src/declare.rs b/src/declare.rs index a2b158ee0a7..9a618c949fb 100644 --- a/src/declare.rs +++ b/src/declare.rs @@ -1,8 +1,9 @@ +use gccjit::{DebugNamespace, Function, FunctionType, GlobalKind, LValue, RValue, Type}; #[cfg(feature = "master")] use gccjit::{FnAttribute, ToRValue}; -use gccjit::{Function, FunctionType, GlobalKind, LValue, RValue, Type}; use rustc_codegen_ssa::traits::BaseTypeMethods; -use rustc_middle::ty::Ty; +//use rustc_middle::query::Key; +use rustc_middle::ty::{Instance, Ty}; use rustc_span::Symbol; use rustc_target::abi::call::FnAbi; @@ -153,6 +154,28 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { // TODO(antoyo): use a different field than globals, because this seems to return a function? self.globals.borrow().get(name).cloned() } + + #[inline] + pub fn get_or_create_module(&self, instance: &Instance<'tcx>) -> DebugNamespace { + let mut bor = self.modules.borrow_mut(); + if let Some(debug_namespace) = bor.get(&instance) { + *debug_namespace + } else { + + let parent = None; + /* let parent = if let Some(parent) = self.tcx.opt_parent(instance.def_id()) { + * let parent = todo!(); + * Some(self.get_or_create_module(parent)) + * } else { + * None + * }; */ + let name = self.tcx.symbol_name(*instance).name; + + let debug_namespace = self.context.new_debug_namespace(name, parent); + bor.insert(*instance, debug_namespace); + *bor.get(&instance).unwrap() + } + } } /// Declare a function.