@@ -1504,7 +1504,7 @@ fn member_subroutine_def_string(
15041504 }
15051505 if !name_written {
15061506 if let Some ( name) = t. name . as_ref ( ) {
1507- full_written_name. push_str ( & maybe_demangle_name ( info, name) ) ;
1507+ full_written_name. push_str ( & maybe_demangle_function_name ( info, name) ) ;
15081508 }
15091509 }
15101510 let rt = type_string ( info, typedefs, & t. return_type , true ) ?;
@@ -1682,7 +1682,7 @@ pub fn subroutine_def_string(
16821682 }
16831683 if !name_written {
16841684 if let Some ( name) = t. name . as_ref ( ) {
1685- full_written_name. push_str ( & maybe_demangle_name ( info, name) ) ;
1685+ full_written_name. push_str ( & maybe_demangle_function_name ( info, name) ) ;
16861686 }
16871687 }
16881688 let rt = type_string ( info, typedefs, & t. return_type , true ) ?;
@@ -3575,7 +3575,7 @@ fn variable_string(
35753575 let mut out = if variable. local { "static " . to_string ( ) } else { String :: new ( ) } ;
35763576 out. push_str ( & ts. prefix ) ;
35773577 out. push ( ' ' ) ;
3578- out. push_str ( variable. name . as_deref ( ) . unwrap_or ( "[unknown]" ) ) ;
3578+ out. push_str ( & maybe_demangle_name ( info , variable. name . as_deref ( ) . unwrap_or ( "[unknown]" ) ) ) ;
35793579 out. push_str ( & ts. suffix ) ;
35803580 out. push ( ';' ) ;
35813581 if include_extra {
@@ -3680,6 +3680,15 @@ fn process_variable_tag(info: &DwarfInfo, tag: &Tag) -> Result<VariableTag> {
36803680
36813681// TODO expand for more compilers?
36823682fn maybe_demangle_name ( info : & DwarfInfo , name : & str ) -> String {
3683+ let name_opt = match info. producer {
3684+ Producer :: MWCC => cw_demangle ( name, & Default :: default ( ) ) ,
3685+ Producer :: GCC => gnu_demangle ( name, & DemangleConfig :: new ( ) ) . ok ( ) ,
3686+ Producer :: OTHER => None ,
3687+ } ;
3688+ name_opt. unwrap_or_else ( || name. to_string ( ) )
3689+ }
3690+
3691+ fn maybe_demangle_function_name ( info : & DwarfInfo , name : & str ) -> String {
36833692 let fake_name = format ! ( "{}__0" , name) ;
36843693 let name_opt = match info. producer {
36853694 // for __pl this looks like operator+
0 commit comments