Skip to content

Commit 666e8a1

Browse files
committed
debuginfo: extract namespace.rs
1 parent cc7fd9f commit 666e8a1

File tree

3 files changed

+139
-117
lines changed

3 files changed

+139
-117
lines changed

src/librustc_trans/trans/debuginfo/mod.rs

Lines changed: 3 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ mod doc;
1414
pub mod gdb;
1515
mod utils;
1616
mod create;
17+
mod namespace;
1718

1819
use self::utils::{debug_context, DIB, span_start, bytes_to_bits, size_and_align_of,
1920
assert_type_for_node_id, get_namespace_and_span_for_item, fn_should_be_ignored,
2021
contains_nodebug_attribute, create_scope_map};
2122
use self::create::{declare_local, create_DIArray, is_node_local_to_unit};
23+
use self::namespace::{namespace_for_item, NamespaceTreeNode, crate_root_namespace};
2224

2325
use self::VariableAccess::*;
2426
use self::VariableKind::*;
@@ -51,7 +53,7 @@ use std::cell::{Cell, RefCell};
5153
use std::ffi::CString;
5254
use std::path::Path;
5355
use std::ptr;
54-
use std::rc::{Rc, Weak};
56+
use std::rc::Rc;
5557
use syntax::util::interner::Interner;
5658
use syntax::codemap::{Span, Pos};
5759
use syntax::{ast, codemap, ast_util, ast_map};
@@ -3108,118 +3110,3 @@ fn push_debuginfo_type_name<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
31083110
output.push('>');
31093111
}
31103112
}
3111-
3112-
3113-
//=-----------------------------------------------------------------------------
3114-
// Namespace Handling
3115-
//=-----------------------------------------------------------------------------
3116-
3117-
struct NamespaceTreeNode {
3118-
name: ast::Name,
3119-
scope: DIScope,
3120-
parent: Option<Weak<NamespaceTreeNode>>,
3121-
}
3122-
3123-
impl NamespaceTreeNode {
3124-
fn mangled_name_of_contained_item(&self, item_name: &str) -> String {
3125-
fn fill_nested(node: &NamespaceTreeNode, output: &mut String) {
3126-
match node.parent {
3127-
Some(ref parent) => fill_nested(&*parent.upgrade().unwrap(), output),
3128-
None => {}
3129-
}
3130-
let string = token::get_name(node.name);
3131-
output.push_str(&format!("{}", string.len()));
3132-
output.push_str(&string);
3133-
}
3134-
3135-
let mut name = String::from_str("_ZN");
3136-
fill_nested(self, &mut name);
3137-
name.push_str(&format!("{}", item_name.len()));
3138-
name.push_str(item_name);
3139-
name.push('E');
3140-
name
3141-
}
3142-
}
3143-
3144-
fn crate_root_namespace<'a>(cx: &'a CrateContext) -> &'a str {
3145-
&cx.link_meta().crate_name
3146-
}
3147-
3148-
fn namespace_for_item(cx: &CrateContext, def_id: ast::DefId) -> Rc<NamespaceTreeNode> {
3149-
ty::with_path(cx.tcx(), def_id, |path| {
3150-
// prepend crate name if not already present
3151-
let krate = if def_id.krate == ast::LOCAL_CRATE {
3152-
let crate_namespace_name = token::intern(crate_root_namespace(cx));
3153-
Some(ast_map::PathMod(crate_namespace_name))
3154-
} else {
3155-
None
3156-
};
3157-
let mut path = krate.into_iter().chain(path).peekable();
3158-
3159-
let mut current_key = Vec::new();
3160-
let mut parent_node: Option<Rc<NamespaceTreeNode>> = None;
3161-
3162-
// Create/Lookup namespace for each element of the path.
3163-
loop {
3164-
// Emulate a for loop so we can use peek below.
3165-
let path_element = match path.next() {
3166-
Some(e) => e,
3167-
None => break
3168-
};
3169-
// Ignore the name of the item (the last path element).
3170-
if path.peek().is_none() {
3171-
break;
3172-
}
3173-
3174-
let name = path_element.name();
3175-
current_key.push(name);
3176-
3177-
let existing_node = debug_context(cx).namespace_map.borrow()
3178-
.get(&current_key).cloned();
3179-
let current_node = match existing_node {
3180-
Some(existing_node) => existing_node,
3181-
None => {
3182-
// create and insert
3183-
let parent_scope = match parent_node {
3184-
Some(ref node) => node.scope,
3185-
None => ptr::null_mut()
3186-
};
3187-
let namespace_name = token::get_name(name);
3188-
let namespace_name = CString::new(namespace_name.as_bytes()).unwrap();
3189-
let scope = unsafe {
3190-
llvm::LLVMDIBuilderCreateNameSpace(
3191-
DIB(cx),
3192-
parent_scope,
3193-
namespace_name.as_ptr(),
3194-
// cannot reconstruct file ...
3195-
ptr::null_mut(),
3196-
// ... or line information, but that's not so important.
3197-
0)
3198-
};
3199-
3200-
let node = Rc::new(NamespaceTreeNode {
3201-
name: name,
3202-
scope: scope,
3203-
parent: parent_node.map(|parent| parent.downgrade()),
3204-
});
3205-
3206-
debug_context(cx).namespace_map.borrow_mut()
3207-
.insert(current_key.clone(), node.clone());
3208-
3209-
node
3210-
}
3211-
};
3212-
3213-
parent_node = Some(current_node);
3214-
}
3215-
3216-
match parent_node {
3217-
Some(node) => node,
3218-
None => {
3219-
cx.sess().bug(&format!("debuginfo::namespace_for_item(): \
3220-
path too short for {:?}",
3221-
def_id));
3222-
}
3223-
}
3224-
})
3225-
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://!rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://!www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://!opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Namespace Handling
12+
13+
use super::utils::{DIB, debug_context};
14+
15+
use llvm;
16+
use llvm::debuginfo::DIScope;
17+
use trans::common::CrateContext;
18+
use middle::ty::{self, ClosureTyper};
19+
20+
use std::ffi::CString;
21+
use std::ptr;
22+
use std::rc::{Rc, Weak};
23+
use syntax::{ast, ast_map};
24+
use syntax::parse::token;
25+
26+
pub struct NamespaceTreeNode {
27+
pub name: ast::Name,
28+
pub scope: DIScope,
29+
pub parent: Option<Weak<NamespaceTreeNode>>,
30+
}
31+
32+
impl NamespaceTreeNode {
33+
pub fn mangled_name_of_contained_item(&self, item_name: &str) -> String {
34+
fn fill_nested(node: &NamespaceTreeNode, output: &mut String) {
35+
match node.parent {
36+
Some(ref parent) => fill_nested(&*parent.upgrade().unwrap(), output),
37+
None => {}
38+
}
39+
let string = token::get_name(node.name);
40+
output.push_str(&format!("{}", string.len()));
41+
output.push_str(&string);
42+
}
43+
44+
let mut name = String::from_str("_ZN");
45+
fill_nested(self, &mut name);
46+
name.push_str(&format!("{}", item_name.len()));
47+
name.push_str(item_name);
48+
name.push('E');
49+
name
50+
}
51+
}
52+
53+
pub fn crate_root_namespace<'a>(cx: &'a CrateContext) -> &'a str {
54+
&cx.link_meta().crate_name
55+
}
56+
57+
pub fn namespace_for_item(cx: &CrateContext, def_id: ast::DefId) -> Rc<NamespaceTreeNode> {
58+
ty::with_path(cx.tcx(), def_id, |path| {
59+
// prepend crate name if not already present
60+
let krate = if def_id.krate == ast::LOCAL_CRATE {
61+
let crate_namespace_name = token::intern(crate_root_namespace(cx));
62+
Some(ast_map::PathMod(crate_namespace_name))
63+
} else {
64+
None
65+
};
66+
let mut path = krate.into_iter().chain(path).peekable();
67+
68+
let mut current_key = Vec::new();
69+
let mut parent_node: Option<Rc<NamespaceTreeNode>> = None;
70+
71+
// Create/Lookup namespace for each element of the path.
72+
loop {
73+
// Emulate a for loop so we can use peek below.
74+
let path_element = match path.next() {
75+
Some(e) => e,
76+
None => break
77+
};
78+
// Ignore the name of the item (the last path element).
79+
if path.peek().is_none() {
80+
break;
81+
}
82+
83+
let name = path_element.name();
84+
current_key.push(name);
85+
86+
let existing_node = debug_context(cx).namespace_map.borrow()
87+
.get(&current_key).cloned();
88+
let current_node = match existing_node {
89+
Some(existing_node) => existing_node,
90+
None => {
91+
// create and insert
92+
let parent_scope = match parent_node {
93+
Some(ref node) => node.scope,
94+
None => ptr::null_mut()
95+
};
96+
let namespace_name = token::get_name(name);
97+
let namespace_name = CString::new(namespace_name.as_bytes()).unwrap();
98+
let scope = unsafe {
99+
llvm::LLVMDIBuilderCreateNameSpace(
100+
DIB(cx),
101+
parent_scope,
102+
namespace_name.as_ptr(),
103+
// cannot reconstruct file ...
104+
ptr::null_mut(),
105+
// ... or line information, but that's not so important.
106+
0)
107+
};
108+
109+
let node = Rc::new(NamespaceTreeNode {
110+
name: name,
111+
scope: scope,
112+
parent: parent_node.map(|parent| parent.downgrade()),
113+
});
114+
115+
debug_context(cx).namespace_map.borrow_mut()
116+
.insert(current_key.clone(), node.clone());
117+
118+
node
119+
}
120+
};
121+
122+
parent_node = Some(current_node);
123+
}
124+
125+
match parent_node {
126+
Some(node) => node,
127+
None => {
128+
cx.sess().bug(&format!("debuginfo::namespace_for_item(): \
129+
path too short for {:?}",
130+
def_id));
131+
}
132+
}
133+
})
134+
}

src/librustc_trans/trans/debuginfo/utils.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
// Utility Functions.
1212

13-
use super::{FunctionDebugContext, CrateDebugContext, namespace_for_item, file_metadata};
13+
use super::{FunctionDebugContext, CrateDebugContext, file_metadata};
14+
use super::namespace::namespace_for_item;
1415

1516
use llvm;
1617
use llvm::debuginfo::{DIScope, DISubprogram, DIBuilderRef};

0 commit comments

Comments
 (0)