Skip to content

Commit 9ef4463

Browse files
committed
Use slice representation for module entries in CrateMap
Relaxe lifetime of CrateMap as well.
1 parent 787f20a commit 9ef4463

File tree

3 files changed

+60
-100
lines changed

3 files changed

+60
-100
lines changed

src/librustc/middle/trans/base.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2911,9 +2911,9 @@ pub fn decl_gc_metadata(ccx: &mut CrateContext, llmod_id: &str) {
29112911
}
29122912
}
29132913

2914-
pub fn create_module_map(ccx: &mut CrateContext) -> ValueRef {
2914+
pub fn create_module_map(ccx: &mut CrateContext) -> (ValueRef, uint) {
29152915
let elttype = Type::struct_([ccx.int_type, ccx.int_type], false);
2916-
let maptype = Type::array(&elttype, (ccx.module_data.len() + 1) as u64);
2916+
let maptype = Type::array(&elttype, ccx.module_data.len() as u64);
29172917
let map = do "_rust_mod_map".with_c_str |buf| {
29182918
unsafe {
29192919
llvm::LLVMAddGlobal(ccx.llmod, maptype.to_ref(), buf)
@@ -2938,18 +2938,15 @@ pub fn create_module_map(ccx: &mut CrateContext) -> ValueRef {
29382938
let elt = C_struct([s_ptr, v_ptr]);
29392939
elts.push(elt);
29402940
}
2941-
let term = C_struct([C_int(ccx, 0), C_int(ccx, 0)]);
2942-
elts.push(term);
29432941
unsafe {
29442942
llvm::LLVMSetInitializer(map, C_array(elttype, elts));
29452943
}
2946-
return map;
2944+
return (map, keys.len());
29472945
}
29482946

29492947

29502948
pub fn decl_crate_map(sess: session::Session, mapmeta: LinkMeta,
29512949
llmod: ModuleRef) -> ValueRef {
2952-
29532950
let targ_cfg = sess.targ_cfg;
29542951
let int_type = Type::int(targ_cfg.arch);
29552952
let mut n_subcrates = 1;
@@ -2962,8 +2959,8 @@ pub fn decl_crate_map(sess: session::Session, mapmeta: LinkMeta,
29622959
};
29632960

29642961
let sym_name = ~"_rust_crate_map_" + mapname;
2965-
let vectype = Type::struct_([int_type, int_type], false);
2966-
let maptype = Type::struct_([Type::i32(), int_type, vectype], false);
2962+
let slicetype = Type::struct_([int_type, int_type], false);
2963+
let maptype = Type::struct_([Type::i32(), slicetype, slicetype], false);
29672964
let map = do sym_name.with_c_str |buf| {
29682965
unsafe {
29692966
llvm::LLVMAddGlobal(llmod, maptype.to_ref(), buf)
@@ -3006,14 +3003,17 @@ pub fn fill_crate_map(ccx: &mut CrateContext, map: ValueRef) {
30063003
lib::llvm::SetLinkage(vec_elements, lib::llvm::InternalLinkage);
30073004

30083005
llvm::LLVMSetInitializer(vec_elements, C_array(ccx.int_type, subcrates));
3009-
let mod_map = create_module_map(ccx);
3006+
let (mod_map, mod_count) = create_module_map(ccx);
30103007

30113008
llvm::LLVMSetInitializer(map, C_struct(
30123009
[C_i32(1),
3013-
p2i(ccx, mod_map),
3014-
C_struct(
3015-
[p2i(ccx, vec_elements),
3016-
C_int(ccx, (subcrates.len() * 8) as int)
3010+
C_struct([
3011+
p2i(ccx, mod_map),
3012+
C_int(ccx, (mod_count * 16) as int)
3013+
]),
3014+
C_struct([
3015+
p2i(ccx, vec_elements),
3016+
C_int(ccx, (subcrates.len() * 8) as int)
30173017
])
30183018
]));
30193019
}

src/libstd/rt/crate_map.rs

Lines changed: 42 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use cast::transmute;
11+
#[cfg(not(stage0))] use cast::transmute;
1212
use container::MutableSet;
1313
use hashmap::HashSet;
1414
use libc::c_char;
15+
use option::{Some, None};
16+
use vec::ImmutableVector;
1517

1618
// Need to tell the linker on OS X to not barf on undefined symbols
1719
// and instead look them up at runtime, which we need to resolve
@@ -24,36 +26,36 @@ extern {}
2426
extern {
2527
#[weak_linkage]
2628
#[link_name = "_rust_crate_map_toplevel"]
27-
static CRATE_MAP: CrateMap;
29+
static CRATE_MAP: CrateMap<'static>;
2830
}
2931

3032
pub struct ModEntry {
3133
name: *c_char,
3234
log_level: *mut u32
3335
}
3436

35-
struct CrateMapV0 {
36-
entries: &static [ModEntry],
37-
children: &'static [&'static CrateMap]
37+
pub struct CrateMapV0<'self> {
38+
entries: &'self [ModEntry],
39+
children: &'self [&'self CrateMap<'self>]
3840
}
3941

40-
struct CrateMap {
42+
pub struct CrateMap<'self> {
4143
version: i32,
42-
entries: &static [ModEntry],
44+
entries: &'self [ModEntry],
4345
/// a dynamically sized struct, where all pointers to children are listed adjacent
4446
/// to the struct, terminated with NULL
45-
children: [*CrateMap, ..1]
47+
children: &'self [&'self CrateMap<'self>]
4648
}
4749

4850
#[cfg(not(windows))]
49-
pub fn get_crate_map() -> *CrateMap {
50-
&'static CRATE_MAP as *CrateMap
51+
pub fn get_crate_map() -> &'static CrateMap<'static> {
52+
&'static CRATE_MAP
5153
}
5254

5355
#[cfg(windows)]
5456
#[fixed_stack_segment]
5557
#[inline(never)]
56-
pub fn get_crate_map() -> *CrateMap {
58+
pub fn get_crate_map() -> &'static CrateMap<'static> {
5759
use c_str::ToCStr;
5860
use unstable::dynamic_lib::dl;
5961

@@ -65,24 +67,24 @@ pub fn get_crate_map() -> *CrateMap {
6567
dl::close(module);
6668
sym
6769
};
68-
69-
sym as *CrateMap
70+
sym
7071
}
7172

72-
fn version(crate_map: &'static CrateMap) -> i32 {
73+
fn version(crate_map: &CrateMap) -> i32 {
7374
match crate_map.version {
7475
1 => return 1,
7576
_ => return 0
7677
}
7778
}
7879

7980
#[cfg(not(stage0))]
80-
fn entries(crate_map: &'static CrateMap) -> *ModEntry {
81+
fn get_entries_and_children<'a>(crate_map: &'a CrateMap<'a>) ->
82+
(&'a [ModEntry], &'a [&'a CrateMap<'a>]) {
8183
match version(crate_map) {
8284
0 => {
8385
unsafe {
84-
let v0: &'static CrateMapV0 = transmute(crate_map);
85-
return v0.entries;
86+
let v0: &'a CrateMapV0<'a> = transmute(crate_map);
87+
return (v0.entries, v0.children);
8688
}
8789
}
8890
1 => return (*crate_map).entries,
@@ -91,100 +93,63 @@ fn entries(crate_map: &'static CrateMap) -> *ModEntry {
9193
}
9294

9395
#[cfg(not(stage0))]
94-
fn iterator(crate_map: &'static CrateMap) -> &'static [&'static CrateMap] {
95-
match version(crate_map) {
96-
0 => {
97-
unsafe {
98-
let v0: &'static CrateMapV0 = transmute(crate_map);
99-
return v0.children;
100-
}
101-
}
102-
1 => return vec::raw::to_ptr((*crate_map).children),
103-
_ => fail2!("Unknown crate map version!")
104-
}
105-
}
106-
107-
fn iter_module_map(mod_entries: *ModEntry, f: &fn(&mut ModEntry)) {
108-
let mut curr = mod_entries;
109-
110-
unsafe {
111-
while !(*curr).name.is_null() {
112-
f(transmute(curr));
113-
curr = curr.offset(1);
114-
}
96+
fn iter_module_map(mod_entries: &[ModEntry], f: &fn(&ModEntry)) {
97+
for entry in mod_entries.iter() {
98+
f(entry);
11599
}
116100
}
117101

118-
119-
120102
#[cfg(not(stage0))]
121-
fn do_iter_crate_map(crate_map: &'static CrateMap, f: &fn(&mut ModEntry),
122-
visited: &mut HashSet<*CrateMap>) {
103+
fn do_iter_crate_map<'a>(crate_map: &'a CrateMap<'a>, f: &fn(&ModEntry),
104+
visited: &mut HashSet<*CrateMap<'a>>) {
123105
if visited.insert(crate_map as *CrateMap) {
124-
iter_module_map(crate_map.entries, |x| f(x));
125-
let child_crates = iterator(crate_map);
126-
127-
let mut i = 0;
128-
while i < child_crates.len() {
129-
do_iter_crate_map(child_crates[i], |x| f(x), visited);
130-
i = i + 1;
106+
let (entries, children) = get_entries_and_children(crate_map);
107+
iter_module_map(entries, |x| f(x));
108+
for child in children.iter() {
109+
do_iter_crate_map(*child, |x| f(x), visited);
131110
}
132111
}
133112
}
134113

135114
#[cfg(stage0)]
136115
/// Iterates recursively over `crate_map` and all child crate maps
137-
pub fn iter_crate_map(crate_map: *u8, f: &fn(&mut ModEntry)) {
116+
pub fn iter_crate_map<'a>(crate_map: &'a CrateMap<'a>, f: &fn(&ModEntry)) {
138117
}
139118

140119
#[cfg(not(stage0))]
141120
/// Iterates recursively over `crate_map` and all child crate maps
142-
pub fn iter_crate_map(crate_map: &'static CrateMap, f: &fn(&mut ModEntry)) {
121+
pub fn iter_crate_map<'a>(crate_map: &'a CrateMap<'a>, f: &fn(&ModEntry)) {
143122
// XXX: use random numbers as keys from the OS-level RNG when there is a nice
144123
// way to do this
145-
let mut v: HashSet<*CrateMap> = HashSet::with_capacity_and_keys(0, 0, 32);
146-
unsafe {
147-
do_iter_crate_map(transmute(crate_map), f, &mut v);
148-
}
124+
let mut v: HashSet<*CrateMap<'a>> = HashSet::with_capacity_and_keys(0, 0, 32);
125+
do_iter_crate_map(crate_map, f, &mut v);
149126
}
150127

151128
#[cfg(test)]
152129
mod tests {
153130
use c_str::ToCStr;
154131
use cast::transmute;
155-
use ptr;
156-
use vec;
157-
158-
use rt::crate_map::{ModEntry, iter_crate_map};
159-
160-
struct CrateMap<'self> {
161-
version: i32,
162-
entries: *ModEntry,
163-
/// a dynamically sized struct, where all pointers to children are listed adjacent
164-
/// to the struct, terminated with NULL
165-
children: &'self [&'self CrateMap<'self>]
166-
}
132+
use rt::crate_map::{CrateMap, ModEntry, iter_crate_map};
167133

168134
#[test]
169135
fn iter_crate_map_duplicates() {
170136
unsafe {
171137
let mod_name1 = "c::m1".to_c_str();
172138
let mut level3: u32 = 3;
173139

174-
let entries: ~[ModEntry] = ~[
140+
let entries = [
175141
ModEntry { name: mod_name1.with_ref(|buf| buf), log_level: &mut level3},
176-
ModEntry { name: ptr::null(), log_level: ptr::mut_null()}
177142
];
178143

179144
let child_crate = CrateMap {
180145
version: 1,
181-
entries: vec::raw::to_ptr(entries),
146+
entries: entries,
182147
children: []
183148
};
184149

185150
let root_crate = CrateMap {
186151
version: 1,
187-
entries: vec::raw::to_ptr([ModEntry { name: ptr::null(), log_level: ptr::mut_null()}]),
152+
entries: [],
188153
children: [&child_crate, &child_crate]
189154
};
190155

@@ -206,29 +171,26 @@ mod tests {
206171
let mut level3: u32 = 3;
207172
let child_crate2 = CrateMap {
208173
version: 1,
209-
entries: vec::raw::to_ptr([
174+
entries: [
210175
ModEntry { name: mod_name1.with_ref(|buf| buf), log_level: &mut level2},
211176
ModEntry { name: mod_name2.with_ref(|buf| buf), log_level: &mut level3},
212-
ModEntry { name: ptr::null(), log_level: ptr::mut_null()}
213-
]),
177+
],
214178
children: []
215179
};
216180

217181
let child_crate1 = CrateMap {
218182
version: 1,
219-
entries: vec::raw::to_ptr([
183+
entries: [
220184
ModEntry { name: "t::f1".to_c_str().with_ref(|buf| buf), log_level: &mut 1},
221-
ModEntry { name: ptr::null(), log_level: ptr::mut_null()}
222-
]),
185+
],
223186
children: [&child_crate2]
224187
};
225188

226189
let root_crate = CrateMap {
227190
version: 1,
228-
entries: vec::raw::to_ptr([
191+
entries: [
229192
ModEntry { name: "t::f1".to_c_str().with_ref(|buf| buf), log_level: &mut 0},
230-
ModEntry { name: ptr::null(), log_level: ptr::mut_null()}
231-
]),
193+
],
232194
children: [&child_crate1]
233195
};
234196

src/libstd/rt/logging.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,12 @@ use libc::{uintptr_t, exit};
1414
use option::{Some, None, Option};
1515
use rt;
1616
use rt::util::dumb_println;
17-
use rt::crate_map::{ModEntry, iter_crate_map};
18-
use rt::crate_map::get_crate_map;
17+
use rt::crate_map::{ModEntry, CrateMap, iter_crate_map, get_crate_map};
1918
use str::StrSlice;
2019
use str::raw::from_c_str;
2120
use u32;
2221
use vec::ImmutableVector;
23-
use send_str::{SendStr, SendStrOwned, SendStrStatic};
24-
use cast::transmute;
22+
#[cfg(test)] use cast::transmute;
2523

2624
struct LogDirective {
2725
name: Option<~str>,
@@ -111,7 +109,7 @@ fn parse_logging_spec(spec: ~str) -> ~[LogDirective]{
111109

112110
/// Set the log level of an entry in the crate map depending on the vector
113111
/// of log directives
114-
fn update_entry(dirs: &[LogDirective], entry: &mut ModEntry) -> u32 {
112+
fn update_entry(dirs: &[LogDirective], entry: &ModEntry) -> u32 {
115113
let mut new_lvl: u32 = DEFAULT_LOG_LEVEL;
116114
let mut longest_match = -1i;
117115
unsafe {
@@ -142,7 +140,7 @@ fn update_entry(dirs: &[LogDirective], entry: &mut ModEntry) -> u32 {
142140
#[fixed_stack_segment] #[inline(never)]
143141
/// Set log level for every entry in crate_map according to the sepecification
144142
/// in settings
145-
fn update_log_settings(crate_map: *u8, settings: ~str) {
143+
fn update_log_settings(crate_map: &CrateMap, settings: ~str) {
146144
let mut dirs = ~[];
147145
if settings.len() > 0 {
148146
if settings == ~"::help" || settings == ~"?" {
@@ -206,7 +204,7 @@ impl rt::io::Writer for StdErrLogger {
206204
pub fn init() {
207205
use os;
208206

209-
let crate_map = get_crate_map() as *u8;
207+
let crate_map = get_crate_map();
210208

211209
let log_spec = os::getenv("RUST_LOG");
212210
match log_spec {

0 commit comments

Comments
 (0)