Skip to content

Commit fa326d3

Browse files
committed
---
yaml --- r: 140453 b: refs/heads/try2 c: 1f65e4a h: refs/heads/master i: 140451: c3b3d36 v: v3
1 parent 7b0feb6 commit fa326d3

File tree

33 files changed

+582
-215
lines changed

33 files changed

+582
-215
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 86efd97a10fda1f81f5bead0de36e3343a9faa0e
8+
refs/heads/try2: 1f65e4a1d54417cebaed30816c75ae1cb0334566
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libcore/cleanup.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,22 +126,29 @@ struct AnnihilateStats {
126126
n_bytes_freed: uint
127127
}
128128

129-
unsafe fn each_live_alloc(f: &fn(box: *mut BoxRepr, uniq: bool) -> bool) {
129+
unsafe fn each_live_alloc(read_next_before: bool,
130+
f: &fn(box: *mut BoxRepr, uniq: bool) -> bool) {
131+
//! Walks the internal list of allocations
132+
130133
use managed;
131134

132135
let task: *Task = transmute(rustrt::rust_get_task());
133136
let box = (*task).boxed_region.live_allocs;
134137
let mut box: *mut BoxRepr = transmute(copy box);
135138
while box != mut_null() {
136-
let next = transmute(copy (*box).header.next);
139+
let next_before = transmute(copy (*box).header.next);
137140
let uniq =
138141
(*box).header.ref_count == managed::raw::RC_MANAGED_UNIQUE;
139142

140143
if ! f(box, uniq) {
141144
break
142145
}
143146

144-
box = next
147+
if read_next_before {
148+
box = next_before;
149+
} else {
150+
box = transmute(copy (*box).header.next);
151+
}
145152
}
146153
}
147154

@@ -173,7 +180,10 @@ pub unsafe fn annihilate() {
173180
};
174181

175182
// Pass 1: Make all boxes immortal.
176-
for each_live_alloc |box, uniq| {
183+
//
184+
// In this pass, nothing gets freed, so it does not matter whether
185+
// we read the next field before or after the callback.
186+
for each_live_alloc(true) |box, uniq| {
177187
stats.n_total_boxes += 1;
178188
if uniq {
179189
stats.n_unique_boxes += 1;
@@ -183,7 +193,11 @@ pub unsafe fn annihilate() {
183193
}
184194

185195
// Pass 2: Drop all boxes.
186-
for each_live_alloc |box, uniq| {
196+
//
197+
// In this pass, unique-managed boxes may get freed, but not
198+
// managed boxes, so we must read the `next` field *after* the
199+
// callback, as the original value may have been freed.
200+
for each_live_alloc(false) |box, uniq| {
187201
if !uniq {
188202
let tydesc: *TypeDesc = transmute(copy (*box).header.type_desc);
189203
let drop_glue: DropGlue = transmute(((*tydesc).drop_glue, 0));
@@ -192,7 +206,12 @@ pub unsafe fn annihilate() {
192206
}
193207

194208
// Pass 3: Free all boxes.
195-
for each_live_alloc |box, uniq| {
209+
//
210+
// In this pass, managed boxes may get freed (but not
211+
// unique-managed boxes, though I think that none of those are
212+
// left), so we must read the `next` field before, since it will
213+
// not be valid after.
214+
for each_live_alloc(true) |box, uniq| {
196215
if !uniq {
197216
stats.n_bytes_freed +=
198217
(*((*box).header.type_desc)).size

branches/try2/src/libcore/os.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,28 @@ pub fn list_dir_path(p: &Path) -> ~[~Path] {
772772
list_dir(p).map(|f| ~p.push(*f))
773773
}
774774
775+
/// Removes a directory at the specified path, after removing
776+
/// all its contents. Use carefully!
777+
pub fn remove_dir_recursive(p: &Path) -> bool {
778+
let mut error_happened = false;
779+
for walk_dir(p) |inner| {
780+
if !error_happened {
781+
if path_is_dir(inner) {
782+
if !remove_dir_recursive(inner) {
783+
error_happened = true;
784+
}
785+
}
786+
else {
787+
if !remove_file(inner) {
788+
error_happened = true;
789+
}
790+
}
791+
}
792+
};
793+
// Directory should now be empty
794+
!error_happened && remove_dir(p)
795+
}
796+
775797
/// Removes a directory at the specified path
776798
pub fn remove_dir(p: &Path) -> bool {
777799
return rmdir(p);
@@ -877,6 +899,10 @@ pub fn copy_file(from: &Path, to: &Path) -> bool {
877899
if istream as uint == 0u {
878900
return false;
879901
}
902+
// Preserve permissions
903+
let from_mode = from.get_mode().expect("copy_file: couldn't get permissions \
904+
for source file");
905+
880906
let ostream = do as_c_charp(to.to_str()) |top| {
881907
do as_c_charp("w+b") |modebuf| {
882908
libc::fopen(top, modebuf)
@@ -908,6 +934,15 @@ pub fn copy_file(from: &Path, to: &Path) -> bool {
908934
}
909935
fclose(istream);
910936
fclose(ostream);
937+
938+
// Give the new file the old file's permissions
939+
unsafe {
940+
if do str::as_c_str(to.to_str()) |to_buf| {
941+
libc::chmod(to_buf, from_mode as mode_t)
942+
} != 0 {
943+
return false; // should be a condition...
944+
}
945+
}
911946
return ok;
912947
}
913948
}
@@ -1594,13 +1629,15 @@ mod tests {
15941629
== buf.len() as size_t))
15951630
}
15961631
assert!((libc::fclose(ostream) == (0u as c_int)));
1632+
let in_mode = in.get_mode();
15971633
let rs = os::copy_file(&in, &out);
15981634
if (!os::path_exists(&in)) {
15991635
fail!(fmt!("%s doesn't exist", in.to_str()));
16001636
}
16011637
assert!((rs));
16021638
let rslt = run::run_program(~"diff", ~[in.to_str(), out.to_str()]);
16031639
assert!((rslt == 0));
1640+
assert!(out.get_mode() == in_mode);
16041641
assert!((remove_file(&in)));
16051642
assert!((remove_file(&out)));
16061643
}

branches/try2/src/libcore/task/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use result::Result;
3939
use comm::{stream, Chan, GenericChan, GenericPort, Port};
4040
use prelude::*;
4141
use result;
42-
use task::rt::{task_id, sched_id, rust_task};
42+
use task::rt::{task_id, sched_id};
4343
use util;
4444
use util::replace;
4545
use unstable::finally::Finally;

branches/try2/src/libcore/unstable/lang.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ use str;
1717
use sys;
1818
use unstable::exchange_alloc;
1919
use cast::transmute;
20+
#[cfg(not(stage0))]
2021
use rt::{context, OldTaskContext};
22+
#[cfg(not(stage0))]
2123
use rt::local_services::borrow_local_services;
2224

2325
#[allow(non_camel_case_types)]

branches/try2/src/librustc/back/link.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -752,18 +752,26 @@ pub fn link_binary(sess: Session,
752752
// instead of hard-coded gcc.
753753
// For win32, there is no cc command,
754754
// so we add a condition to make it use gcc.
755-
let cc_prog: ~str = if sess.targ_cfg.os == session::os_android {
756-
match &sess.opts.android_cross_path {
757-
&Some(copy path) => {
758-
fmt!("%s/bin/arm-linux-androideabi-gcc", path)
759-
}
760-
&None => {
761-
sess.fatal(~"need Android NDK path for linking \
762-
(--android-cross-path)")
755+
let cc_prog: ~str = match sess.opts.linker {
756+
Some(copy linker) => linker,
757+
None => {
758+
if sess.targ_cfg.os == session::os_android {
759+
match &sess.opts.android_cross_path {
760+
&Some(copy path) => {
761+
fmt!("%s/bin/arm-linux-androideabi-gcc", path)
762+
}
763+
&None => {
764+
sess.fatal(~"need Android NDK path for linking \
765+
(--android-cross-path)")
766+
}
767+
}
768+
} else if sess.targ_cfg.os == session::os_win32 {
769+
~"gcc"
770+
} else {
771+
~"cc"
763772
}
764773
}
765-
} else if sess.targ_cfg.os == session::os_win32 { ~"gcc" }
766-
else { ~"cc" };
774+
};
767775
// The invocations of cc share some flags across platforms
768776
769777

branches/try2/src/librustc/back/rpath.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub fn get_rpath_flags(sess: session::Session, out_filename: &Path)
4040
// where rustrt is and we know every rust program needs it
4141
let libs = vec::append_one(libs, get_sysroot_absolute_rt_lib(sess));
4242

43-
let rpaths = get_rpaths(os, &sysroot, output, libs,
43+
let rpaths = get_rpaths(os, sysroot, output, libs,
4444
sess.opts.target_triple);
4545
rpaths_to_flags(rpaths)
4646
}

branches/try2/src/librustc/driver/driver.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ pub fn build_session_options(binary: @~str,
603603
link::output_type_bitcode
604604
} else { link::output_type_exe };
605605
let sysroot_opt = getopts::opt_maybe_str(matches, ~"sysroot");
606-
let sysroot_opt = sysroot_opt.map(|m| Path(*m));
606+
let sysroot_opt = sysroot_opt.map(|m| @Path(*m));
607607
let target_opt = getopts::opt_maybe_str(matches, ~"target");
608608
let target_feature_opt = getopts::opt_maybe_str(matches, ~"target-feature");
609609
let save_temps = getopts::opt_present(matches, ~"save-temps");
@@ -650,7 +650,7 @@ pub fn build_session_options(binary: @~str,
650650
};
651651
652652
let addl_lib_search_paths = getopts::opt_strs(matches, ~"L").map(|s| Path(*s));
653-
653+
let linker = getopts::opt_maybe_str(matches, ~"linker");
654654
let linker_args = getopts::opt_strs(matches, ~"link-args").flat_map( |a| {
655655
let mut args = ~[];
656656
for str::each_split_char(*a, ' ') |arg| {
@@ -676,6 +676,7 @@ pub fn build_session_options(binary: @~str,
676676
jit: jit,
677677
output_type: output_type,
678678
addl_lib_search_paths: addl_lib_search_paths,
679+
linker: linker,
679680
linker_args: linker_args,
680681
maybe_sysroot: sysroot_opt,
681682
target_triple: target,
@@ -760,6 +761,7 @@ pub fn optgroups() -> ~[getopts::groups::OptGroup] {
760761
optmulti("L", "", "Add a directory to the library search path",
761762
"PATH"),
762763
optflag("", "lib", "Compile a library crate"),
764+
optopt("", "linker", "Program to use for linking instead of the default.", "LINKER"),
763765
optmulti("", "link-args", "FLAGS is a space-separated list of flags
764766
passed to the linker", "FLAGS"),
765767
optflag("", "ls", "List the symbols defined by a library crate"),

branches/try2/src/librustc/driver/session.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,9 @@ pub struct options {
124124
jit: bool,
125125
output_type: back::link::output_type,
126126
addl_lib_search_paths: ~[Path],
127+
linker: Option<~str>,
127128
linker_args: ~[~str],
128-
maybe_sysroot: Option<Path>,
129+
maybe_sysroot: Option<@Path>,
129130
target_triple: ~str,
130131
target_feature: ~str,
131132
// User-specified cfg meta items. The compiler itself will add additional
@@ -302,7 +303,8 @@ pub fn basic_options() -> @options {
302303
jit: false,
303304
output_type: link::output_type_exe,
304305
addl_lib_search_paths: ~[],
305-
linker_args:~[],
306+
linker: None,
307+
linker_args: ~[],
306308
maybe_sysroot: None,
307309
target_triple: host_triple(),
308310
target_feature: ~"",

branches/try2/src/librustc/metadata/filesearch.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,41 +20,48 @@ pub fn pick_file(file: Path, path: &Path) -> Option<Path> {
2020
}
2121

2222
pub trait FileSearch {
23-
fn sysroot(&self) -> Path;
24-
fn lib_search_paths(&self) -> ~[Path];
23+
fn sysroot(&self) -> @Path;
24+
fn for_each_lib_search_path(&self, f: &fn(&Path) -> bool);
2525
fn get_target_lib_path(&self) -> Path;
2626
fn get_target_lib_file_path(&self, file: &Path) -> Path;
2727
}
2828

29-
pub fn mk_filesearch(maybe_sysroot: &Option<Path>,
29+
pub fn mk_filesearch(maybe_sysroot: &Option<@Path>,
3030
target_triple: &str,
3131
addl_lib_search_paths: ~[Path])
3232
-> @FileSearch {
3333
struct FileSearchImpl {
34-
sysroot: Path,
34+
sysroot: @Path,
3535
addl_lib_search_paths: ~[Path],
3636
target_triple: ~str
3737
}
3838
impl FileSearch for FileSearchImpl {
39-
fn sysroot(&self) -> Path { /*bad*/copy self.sysroot }
40-
fn lib_search_paths(&self) -> ~[Path] {
41-
let mut paths = /*bad*/copy self.addl_lib_search_paths;
42-
43-
paths.push(
44-
make_target_lib_path(&self.sysroot,
45-
self.target_triple));
46-
match get_rustpkg_lib_path_nearest() {
47-
result::Ok(ref p) => paths.push((/*bad*/copy *p)),
48-
result::Err(_) => ()
39+
fn sysroot(&self) -> @Path { self.sysroot }
40+
fn for_each_lib_search_path(&self, f: &fn(&Path) -> bool) {
41+
debug!("filesearch: searching additional lib search paths");
42+
// a little weird
43+
self.addl_lib_search_paths.each(f);
44+
45+
debug!("filesearch: searching target lib path");
46+
if !f(&make_target_lib_path(self.sysroot,
47+
self.target_triple)) {
48+
return;
4949
}
50-
match get_rustpkg_lib_path() {
51-
result::Ok(ref p) => paths.push((/*bad*/copy *p)),
52-
result::Err(_) => ()
53-
}
54-
paths
50+
debug!("filesearch: searching rustpkg lib path nearest");
51+
if match get_rustpkg_lib_path_nearest() {
52+
result::Ok(ref p) => f(p),
53+
result::Err(_) => true
54+
} {
55+
return;
56+
}
57+
debug!("filesearch: searching rustpkg lib path");
58+
match get_rustpkg_lib_path() {
59+
result::Ok(ref p) => f(p),
60+
result::Err(_) => true
61+
};
5562
}
5663
fn get_target_lib_path(&self) -> Path {
57-
make_target_lib_path(&self.sysroot, self.target_triple)
64+
make_target_lib_path(self.sysroot, self.target_triple)
5865
}
5966
fn get_target_lib_file_path(&self, file: &Path) -> Path {
6067
self.get_target_lib_path().push_rel(file)
@@ -72,7 +79,7 @@ pub fn mk_filesearch(maybe_sysroot: &Option<Path>,
7279

7380
pub fn search<T:Copy>(filesearch: @FileSearch, pick: pick<T>) -> Option<T> {
7481
let mut rslt = None;
75-
for filesearch.lib_search_paths().each |lib_search_path| {
82+
for filesearch.for_each_lib_search_path() |lib_search_path| {
7683
debug!("searching %s", lib_search_path.to_str());
7784
for os::list_dir_path(lib_search_path).each |path| {
7885
debug!("testing %s", path.to_str());
@@ -108,10 +115,10 @@ fn get_or_default_sysroot() -> Path {
108115
}
109116
}
110117
111-
fn get_sysroot(maybe_sysroot: &Option<Path>) -> Path {
118+
fn get_sysroot(maybe_sysroot: &Option<@Path>) -> @Path {
112119
match *maybe_sysroot {
113-
option::Some(ref sr) => (/*bad*/copy *sr),
114-
option::None => get_or_default_sysroot()
120+
option::Some(sr) => sr,
121+
option::None => @get_or_default_sysroot()
115122
}
116123
}
117124

branches/try2/src/librustc/metadata/loader.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ fn get_metadata_section(os: os,
196196
while llvm::LLVMIsSectionIteratorAtEnd(of.llof, si.llsi) == False {
197197
let name_buf = llvm::LLVMGetSectionName(si.llsi);
198198
let name = unsafe { str::raw::from_c_str(name_buf) };
199-
debug!("get_matadata_section: name %s", name);
199+
debug!("get_metadata_section: name %s", name);
200200
if name == read_meta_section_name(os) {
201201
let cbuf = llvm::LLVMGetSectionContents(si.llsi);
202202
let csz = llvm::LLVMGetSectionSize(si.llsi) as uint;

0 commit comments

Comments
 (0)