diff options
| author | Tim Chevalier <catamorphism@gmail.com> | 2012-07-19 19:01:22 -0700 |
|---|---|---|
| committer | Tim Chevalier <catamorphism@gmail.com> | 2012-07-19 19:01:22 -0700 |
| commit | ce46e113c59b5113d2ad2c1787d432697f064f2d (patch) | |
| tree | a379cffbf5cbea455f12607620c83372975ce7ee | |
| parent | ac9cf98564cc394672cd9a96a02093569951027c (diff) | |
| parent | 28c1f21433a927bf9e3b399ec293cd7f7b688af6 (diff) | |
Merge pull request #2910 from gwillen/bug-2360
Better error when rustc fails to write output.
| -rw-r--r-- | src/rustc/back/link.rs | 26 | ||||
| -rw-r--r-- | src/rustc/lib/llvm.rs | 2 | ||||
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 7 |
3 files changed, 29 insertions, 6 deletions
diff --git a/src/rustc/back/link.rs b/src/rustc/back/link.rs index 22a9150df56..36c30f40825 100644 --- a/src/rustc/back/link.rs +++ b/src/rustc/back/link.rs @@ -1,4 +1,4 @@ -import libc::{c_int, c_uint}; +import libc::{c_int, c_uint, c_char}; import driver::session; import session::session; import lib::llvm::llvm; @@ -32,6 +32,21 @@ fn llvm_err(sess: session, msg: ~str) -> ! unsafe { } else { sess.fatal(msg + ~": " + str::unsafe::from_c_str(cstr)); } } +fn WriteOutputFile(sess:session, + PM: lib::llvm::PassManagerRef, M: ModuleRef, + Triple: *c_char, + // FIXME: When #2334 is fixed, change + // c_uint to FileType + Output: *c_char, FileType: c_uint, + OptLevel: c_int, + EnableSegmentedStacks: bool) { + let result = llvm::LLVMRustWriteOutputFile( + PM, M, Triple, Output, FileType, OptLevel, EnableSegmentedStacks); + if (!result) { + llvm_err(sess, "Could not write output"); + } +} + mod write { fn is_object_or_assembly_or_exe(ot: output_type) -> bool { if ot == output_type_assembly || ot == output_type_object || @@ -161,7 +176,8 @@ mod write { sess.targ_cfg.target_strs.target_triple, |buf_t| { str::as_c_str(output, |buf_o| { - llvm::LLVMRustWriteOutputFile( + WriteOutputFile( + sess, pm.llpm, llmod, buf_t, @@ -182,7 +198,8 @@ mod write { sess.targ_cfg.target_strs.target_triple, |buf_t| { str::as_c_str(output, |buf_o| { - llvm::LLVMRustWriteOutputFile( + WriteOutputFile( + sess, pm.llpm, llmod, buf_t, @@ -201,7 +218,8 @@ mod write { sess.targ_cfg.target_strs.target_triple, |buf_t| { str::as_c_str(output, |buf_o| { - llvm::LLVMRustWriteOutputFile( + WriteOutputFile( + sess, pm.llpm, llmod, buf_t, diff --git a/src/rustc/lib/llvm.rs b/src/rustc/lib/llvm.rs index 0c00a8674a5..641a4f5460c 100644 --- a/src/rustc/lib/llvm.rs +++ b/src/rustc/lib/llvm.rs @@ -941,7 +941,7 @@ extern mod llvm { // c_uint to FileType Output: *c_char, FileType: c_uint, OptLevel: c_int, - EnableSegmentedStacks: bool); + EnableSegmentedStacks: bool) -> bool; /** Returns a string describing the last error caused by an LLVMRust* call. */ diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 6d99b0f4cb1..6c19a299757 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -75,7 +75,7 @@ extern "C" bool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src) { return true; } -extern "C" void +extern "C" bool LLVMRustWriteOutputFile(LLVMPassManagerRef PMR, LLVMModuleRef M, const char *triple, @@ -107,6 +107,10 @@ LLVMRustWriteOutputFile(LLVMPassManagerRef PMR, std::string ErrorInfo; raw_fd_ostream OS(path, ErrorInfo, raw_fd_ostream::F_Binary); + if (ErrorInfo != "") { + LLVMRustError = ErrorInfo.c_str(); + return false; + } formatted_raw_ostream FOS(OS); bool foo = Target->addPassesToEmitFile(*PM, FOS, FileType, NoVerify); @@ -114,6 +118,7 @@ LLVMRustWriteOutputFile(LLVMPassManagerRef PMR, (void)foo; PM->run(*unwrap(M)); delete Target; + return true; } extern "C" LLVMModuleRef LLVMRustParseAssemblyFile(const char *Filename) { |
