@@ -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