Skip to content

Set the dwarf linkage_name to the mangled name #46899

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 25, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/librustc_trans/debuginfo/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1665,8 +1665,8 @@ pub fn create_global_var_metadata(cx: &CrateContext,
let linkage_name = if no_mangle {
None
} else {
let linkage_name = mangled_name_of_item(cx, node_def_id, "");
Some(CString::new(linkage_name).unwrap())
let linkage_name = mangled_name_of_item(cx, node_id);
Some(CString::new(linkage_name.to_string()).unwrap())
};

let global_align = cx.align_of(variable_type);
Expand Down
9 changes: 4 additions & 5 deletions src/librustc_trans/debuginfo/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use self::VariableAccess::*;
use self::VariableKind::*;

use self::utils::{DIB, span_start, create_DIArray, is_node_local_to_unit};
use self::namespace::mangled_name_of_item;
use self::namespace::mangled_name_of_instance;
use self::type_names::compute_debuginfo_type_name;
use self::metadata::{type_metadata, file_metadata, TypeMap};
use self::source_loc::InternalDebugLocation::{self, UnknownLocation};
Expand Down Expand Up @@ -237,7 +237,6 @@ pub fn create_function_debug_context<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
// Find the enclosing function, in case this is a closure.
let def_key = cx.tcx().def_key(def_id);
let mut name = def_key.disambiguated_data.data.to_string();
let name_len = name.len();

let enclosing_fn_def_id = cx.tcx().closure_base_def_id(def_id);

Expand All @@ -251,16 +250,16 @@ pub fn create_function_debug_context<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
file_metadata,
&mut name);

// Build the linkage_name out of the item path and "template" parameters.
let linkage_name = mangled_name_of_item(cx, instance.def_id(), &name[name_len..]);
// Get the linkage_name, which is just the symbol name
let linkage_name = mangled_name_of_instance(cx, instance);

let scope_line = span_start(cx, span).line;

let local_id = cx.tcx().hir.as_local_node_id(instance.def_id());
let is_local_to_unit = local_id.map_or(false, |id| is_node_local_to_unit(cx, id));

let function_name = CString::new(name).unwrap();
let linkage_name = CString::new(linkage_name).unwrap();
let linkage_name = CString::new(linkage_name.to_string()).unwrap();

let mut flags = DIFlags::FlagPrototyped;
match *cx.sess().entry_fn.borrow() {
Expand Down
41 changes: 18 additions & 23 deletions src/librustc_trans/debuginfo/namespace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@

use super::metadata::{unknown_file_metadata, UNKNOWN_LINE_NUMBER};
use super::utils::{DIB, debug_context};
use monomorphize::Instance;
use rustc::ty;
use syntax::ast;

use llvm;
use llvm::debuginfo::DIScope;
Expand All @@ -22,30 +25,22 @@ use common::CrateContext;
use std::ffi::CString;
use std::ptr;

pub fn mangled_name_of_item(ccx: &CrateContext, def_id: DefId, extra: &str) -> String {
fn fill_nested(ccx: &CrateContext, def_id: DefId, extra: &str, output: &mut String) {
let def_key = ccx.tcx().def_key(def_id);
if let Some(parent) = def_key.parent {
fill_nested(ccx, DefId {
krate: def_id.krate,
index: parent
}, "", output);
}

let name = match def_key.disambiguated_data.data {
DefPathData::CrateRoot => ccx.tcx().crate_name(def_id.krate).as_str(),
data => data.as_interned_str()
};

output.push_str(&(name.len() + extra.len()).to_string());
output.push_str(&name);
output.push_str(extra);
}
pub fn mangled_name_of_instance<'a, 'tcx>(
ccx: &CrateContext<'a, 'tcx>,
instance: Instance<'tcx>,
) -> ty::SymbolName {
let tcx = ccx.tcx();
tcx.symbol_name(instance)
}

let mut name = String::from("_ZN");
fill_nested(ccx, def_id, extra, &mut name);
name.push('E');
name
pub fn mangled_name_of_item<'a, 'tcx>(
ccx: &CrateContext<'a, 'tcx>,
node_id: ast::NodeId,
) -> ty::SymbolName {
let tcx = ccx.tcx();
let node_def_id = tcx.hir.local_def_id(node_id);
let instance = Instance::mono(tcx, node_def_id);
tcx.symbol_name(instance)
}

pub fn item_namespace(ccx: &CrateContext, def_id: DefId) -> DIScope {
Expand Down