Skip to content

Commit

Permalink
auto merge of #13531 : alexcrichton/rust/fix-some-ices, r=brson
Browse files Browse the repository at this point in the history
See the commits for the affected issues.
  • Loading branch information
bors committed Apr 24, 2014
2 parents 8678989 + b0d85e3 commit c0a5e34
Show file tree
Hide file tree
Showing 9 changed files with 95 additions and 37 deletions.
7 changes: 5 additions & 2 deletions src/librustc/back/link.rs
Expand Up @@ -60,7 +60,7 @@ pub fn llvm_err(sess: &Session, msg: ~str) -> ! {
if cstr == ptr::null() {
sess.fatal(msg);
} else {
let err = CString::new(cstr, false);
let err = CString::new(cstr, true);
let err = str::from_utf8_lossy(err.as_bytes());
sess.fatal(msg + ": " + err.as_slice());
}
Expand Down Expand Up @@ -516,7 +516,10 @@ pub mod write {

pub fn find_crate_id(attrs: &[ast::Attribute], out_filestem: &str) -> CrateId {
match attr::find_crateid(attrs) {
None => from_str(out_filestem).unwrap(),
None => from_str(out_filestem).unwrap_or_else(|| {
let mut s = out_filestem.chars().filter(|c| c.is_XID_continue());
from_str(s.collect::<~str>()).or(from_str("rust-out")).unwrap()
}),
Some(s) => s,
}
}
Expand Down
44 changes: 25 additions & 19 deletions src/librustc/driver/driver.rs
Expand Up @@ -493,7 +493,7 @@ pub fn stop_after_phase_5(sess: &Session) -> bool {
fn write_out_deps(sess: &Session,
input: &Input,
outputs: &OutputFilenames,
krate: &ast::Crate) -> io::IoResult<()> {
krate: &ast::Crate) {
let id = link::find_crate_id(krate.attrs.as_slice(), outputs.out_filestem);

let mut out_filenames = Vec::new();
Expand Down Expand Up @@ -522,28 +522,34 @@ fn write_out_deps(sess: &Session,
StrInput(..) => {
sess.warn("can not write --dep-info without a filename \
when compiling stdin.");
return Ok(());
return
},
},
_ => return Ok(()),
_ => return,
};

// Build a list of files used to compile the output and
// write Makefile-compatible dependency rules
let files: Vec<~str> = sess.codemap().files.borrow()
.iter().filter_map(|fmap| {
if fmap.is_real_file() {
Some(fmap.name.clone())
} else {
None
}
}).collect();
let mut file = try!(io::File::create(&deps_filename));
for path in out_filenames.iter() {
try!(write!(&mut file as &mut Writer,
"{}: {}\n\n", path.display(), files.connect(" ")));
let result = (|| {
// Build a list of files used to compile the output and
// write Makefile-compatible dependency rules
let files: Vec<~str> = sess.codemap().files.borrow()
.iter().filter(|fmap| fmap.is_real_file())
.map(|fmap| fmap.name.clone())
.collect();
let mut file = try!(io::File::create(&deps_filename));
for path in out_filenames.iter() {
try!(write!(&mut file as &mut Writer,
"{}: {}\n\n", path.display(), files.connect(" ")));
}
Ok(())
})();

match result {
Ok(()) => {}
Err(e) => {
sess.fatal(format!("error writing dependencies to `{}`: {}",
deps_filename.display(), e));
}
}
Ok(())
}

pub fn compile_input(sess: Session, cfg: ast::CrateConfig, input: &Input,
Expand All @@ -567,7 +573,7 @@ pub fn compile_input(sess: Session, cfg: ast::CrateConfig, input: &Input,
krate, &id);
(outputs, expanded_crate, ast_map)
};
write_out_deps(&sess, input, &outputs, &expanded_crate).unwrap();
write_out_deps(&sess, input, &outputs, &expanded_crate);

if stop_after_phase_2(&sess) { return; }

Expand Down
4 changes: 2 additions & 2 deletions src/rustllvm/PassWrapper.cpp
Expand Up @@ -75,7 +75,7 @@ LLVMRustCreateTargetMachine(const char *triple,
const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Trip.getTriple(),
Error);
if (TheTarget == NULL) {
LLVMRustError = Error.c_str();
LLVMRustSetLastError(Error.c_str());
return NULL;
}

Expand Down Expand Up @@ -178,7 +178,7 @@ LLVMRustWriteOutputFile(LLVMTargetMachineRef Target,
raw_fd_ostream OS(path, ErrorInfo, raw_fd_ostream::F_Binary);
#endif
if (ErrorInfo != "") {
LLVMRustError = ErrorInfo.c_str();
LLVMRustSetLastError(ErrorInfo.c_str());
return false;
}
formatted_raw_ostream FOS(OS);
Expand Down
36 changes: 23 additions & 13 deletions src/rustllvm/RustWrapper.cpp
Expand Up @@ -23,18 +23,28 @@ using namespace llvm;
using namespace llvm::sys;
using namespace llvm::object;

const char *LLVMRustError;
static char *LastError;

extern "C" LLVMMemoryBufferRef
LLVMRustCreateMemoryBufferWithContentsOfFile(const char *Path) {
LLVMMemoryBufferRef MemBuf = NULL;
LLVMCreateMemoryBufferWithContentsOfFile(Path, &MemBuf,
const_cast<char **>(&LLVMRustError));
char *err = NULL;
LLVMCreateMemoryBufferWithContentsOfFile(Path, &MemBuf, &err);
if (err != NULL) {
LLVMRustSetLastError(err);
}
return MemBuf;
}

extern "C" const char *LLVMRustGetLastError(void) {
return LLVMRustError;
extern "C" char *LLVMRustGetLastError(void) {
char *ret = LastError;
LastError = NULL;
return ret;
}

void LLVMRustSetLastError(const char *err) {
free((void*) LastError);
LastError = strdup(err);
}

extern "C" void
Expand Down Expand Up @@ -609,14 +619,14 @@ LLVMRustLinkInExternalBitcode(LLVMModuleRef dst, char *bc, size_t len) {
MemoryBuffer* buf = MemoryBuffer::getMemBufferCopy(StringRef(bc, len));
ErrorOr<Module *> Src = llvm::getLazyBitcodeModule(buf, Dst->getContext());
if (!Src) {
LLVMRustError = Src.getError().message().c_str();
LLVMRustSetLastError(Src.getError().message().c_str());
delete buf;
return false;
}

std::string Err;
if (Linker::LinkModules(Dst, *Src, Linker::DestroySource, &Err)) {
LLVMRustError = Err.c_str();
LLVMRustSetLastError(Err.c_str());
return false;
}
return true;
Expand All @@ -629,13 +639,13 @@ LLVMRustLinkInExternalBitcode(LLVMModuleRef dst, char *bc, size_t len) {
std::string Err;
Module *Src = llvm::getLazyBitcodeModule(buf, Dst->getContext(), &Err);
if (!Src) {
LLVMRustError = Err.c_str();
LLVMRustSetLastError(Err.c_str());
delete buf;
return false;
}

if (Linker::LinkModules(Dst, Src, Linker::DestroySource, &Err)) {
LLVMRustError = Err.c_str();
LLVMRustSetLastError(Err.c_str());
return false;
}
return true;
Expand All @@ -648,12 +658,12 @@ LLVMRustOpenArchive(char *path) {
std::unique_ptr<MemoryBuffer> buf;
error_code err = MemoryBuffer::getFile(path, buf);
if (err) {
LLVMRustError = err.message().c_str();
LLVMRustSetLastError(err.message().c_str());
return NULL;
}
Archive *ret = new Archive(buf.release(), err);
if (err) {
LLVMRustError = err.message().c_str();
LLVMRustSetLastError(err.message().c_str());
return NULL;
}
return ret;
Expand All @@ -664,12 +674,12 @@ LLVMRustOpenArchive(char *path) {
OwningPtr<MemoryBuffer> buf;
error_code err = MemoryBuffer::getFile(path, buf);
if (err) {
LLVMRustError = err.message().c_str();
LLVMRustSetLastError(err.message().c_str());
return NULL;
}
Archive *ret = new Archive(buf.take(), err);
if (err) {
LLVMRustError = err.message().c_str();
LLVMRustSetLastError(err.message().c_str());
return NULL;
}
return ret;
Expand Down
2 changes: 1 addition & 1 deletion src/rustllvm/rustllvm.h
Expand Up @@ -68,4 +68,4 @@
#include <unistd.h>
#endif

extern const char* LLVMRustError;
void LLVMRustSetLastError(const char*);
8 changes: 8 additions & 0 deletions src/test/run-make/error-writing-dependencies/Makefile
@@ -0,0 +1,8 @@
-include ../tools.mk

all:
# Let's get a nice error message
$(RUSTC) foo.rs --dep-info foo/bar/baz 2>&1 | \
grep "error writing dependencies"
# Make sure the filename shows up
$(RUSTC) foo.rs --dep-info foo/bar/baz 2>&1 | grep "baz"
11 changes: 11 additions & 0 deletions src/test/run-make/error-writing-dependencies/foo.rs
@@ -0,0 +1,11 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

fn main() {}
9 changes: 9 additions & 0 deletions src/test/run-make/weird-output-filenames/Makefile
@@ -0,0 +1,9 @@
-include ../tools.mk

all:
$(RUSTC) foo.rs -o $(TMPDIR)/.foo
rm $(TMPDIR)/.foo
$(RUSTC) foo.rs -o $(TMPDIR)/.foo.bar
rm $(TMPDIR)/.foo.bar
$(RUSTC) foo.rs -o $(TMPDIR)/+foo+bar
rm $(TMPDIR)/+foo+bar
11 changes: 11 additions & 0 deletions src/test/run-make/weird-output-filenames/foo.rs
@@ -0,0 +1,11 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

fn main() {}

0 comments on commit c0a5e34

Please sign in to comment.