@@ -42,7 +42,7 @@ use std::ffi::CString;
4242use std:: fmt:: Write ;
4343use std:: ptr;
4444use std:: path:: { Path , PathBuf } ;
45- use syntax:: ast;
45+ use syntax:: { ast, attr } ;
4646use syntax:: symbol:: { Interner , InternedString , Symbol } ;
4747use syntax_pos:: { self , Span , FileName } ;
4848
@@ -1643,8 +1643,10 @@ pub fn create_global_var_metadata(cx: &CrateContext,
16431643 }
16441644
16451645 let tcx = cx. tcx ( ) ;
1646-
16471646 let node_def_id = tcx. hir . local_def_id ( node_id) ;
1647+ let no_mangle = attr:: contains_name ( & tcx. get_attrs ( node_def_id) , "no_mangle" ) ;
1648+ // We may want to remove the namespace scope if we're in an extern block, see:
1649+ // https://github.com/rust-lang/rust/pull/46457#issuecomment-351750952
16481650 let var_scope = get_namespace_for_item ( cx, node_def_id) ;
16491651 let span = cx. tcx ( ) . def_span ( node_def_id) ;
16501652
@@ -1659,18 +1661,24 @@ pub fn create_global_var_metadata(cx: &CrateContext,
16591661 let variable_type = Instance :: mono ( cx. tcx ( ) , node_def_id) . ty ( cx. tcx ( ) ) ;
16601662 let type_metadata = type_metadata ( cx, variable_type, span) ;
16611663 let var_name = tcx. item_name ( node_def_id) . to_string ( ) ;
1662- let linkage_name = mangled_name_of_item ( cx, node_def_id, "" ) ;
1663-
16641664 let var_name = CString :: new ( var_name) . unwrap ( ) ;
1665- let linkage_name = CString :: new ( linkage_name) . unwrap ( ) ;
1665+ let linkage_name = if no_mangle {
1666+ None
1667+ } else {
1668+ let linkage_name = mangled_name_of_item ( cx, node_def_id, "" ) ;
1669+ Some ( CString :: new ( linkage_name) . unwrap ( ) )
1670+ } ;
16661671
16671672 let global_align = cx. align_of ( variable_type) ;
16681673
16691674 unsafe {
16701675 llvm:: LLVMRustDIBuilderCreateStaticVariable ( DIB ( cx) ,
16711676 var_scope,
16721677 var_name. as_ptr ( ) ,
1673- linkage_name. as_ptr ( ) ,
1678+ // If null, linkage_name field is omitted,
1679+ // which is what we want for no_mangle statics
1680+ linkage_name. as_ref ( )
1681+ . map_or ( ptr:: null ( ) , |name| name. as_ptr ( ) ) ,
16741682 file_metadata,
16751683 line_number,
16761684 type_metadata,
0 commit comments