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) {