Skip to content

Commit 500dc14

Browse files
committed
dwarf: do not set linkage_name for no mangle statics, and do not have a scope. ref #33172
1 parent 2f35141 commit 500dc14

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

src/librustc_trans/debuginfo/metadata.rs

+14-6
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use std::ffi::CString;
4242
use std::fmt::Write;
4343
use std::ptr;
4444
use std::path::{Path, PathBuf};
45-
use syntax::ast;
45+
use syntax::{ast, attr};
4646
use syntax::symbol::{Interner, InternedString, Symbol};
4747
use 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 = common::def_ty(cx.tcx(), node_def_id, Substs::empty());
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

Comments
 (0)