about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Chevalier <catamorphism@gmail.com>2012-07-19 19:01:22 -0700
committerTim Chevalier <catamorphism@gmail.com>2012-07-19 19:01:22 -0700
commitce46e113c59b5113d2ad2c1787d432697f064f2d (patch)
treea379cffbf5cbea455f12607620c83372975ce7ee
parentac9cf98564cc394672cd9a96a02093569951027c (diff)
parent28c1f21433a927bf9e3b399ec293cd7f7b688af6 (diff)
Merge pull request #2910 from gwillen/bug-2360
Better error when rustc fails to write output.
-rw-r--r--src/rustc/back/link.rs26
-rw-r--r--src/rustc/lib/llvm.rs2
-rw-r--r--src/rustllvm/RustWrapper.cpp7
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) {