Skip to content

Commit

Permalink
exit with status code 101 on fatal LLVM error
Browse files Browse the repository at this point in the history
Fixes #54992.
  • Loading branch information
euclio committed Oct 12, 2018
1 parent e9e27e6 commit 00e1f5b
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/librustc_codegen_llvm/llvm/ffi.rs
Expand Up @@ -482,6 +482,8 @@ pub mod debuginfo {
extern { pub type ModuleBuffer; }

extern "C" {
pub fn LLVMRustInstallFatalErrorHandler();

// Create and destroy contexts.
pub fn LLVMRustContextCreate(shouldDiscardNames: bool) -> &'static mut Context;
pub fn LLVMContextDispose(C: &'static mut Context);
Expand Down
2 changes: 2 additions & 0 deletions src/librustc_codegen_llvm/llvm_util.rs
Expand Up @@ -56,6 +56,8 @@ unsafe fn configure_llvm(sess: &Session) {
let mut llvm_c_strs = Vec::with_capacity(n_args + 1);
let mut llvm_args = Vec::with_capacity(n_args + 1);

llvm::LLVMRustInstallFatalErrorHandler();

{
let mut add = |arg: &str| {
let s = CString::new(arg).unwrap();
Expand Down
24 changes: 24 additions & 0 deletions src/rustllvm/RustWrapper.cpp
Expand Up @@ -17,6 +17,7 @@
#include "llvm/Object/Archive.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Bitcode/BitcodeWriterPass.h"
#include "llvm/Support/Signals.h"

#include "llvm/IR/CallSite.h"

Expand All @@ -26,6 +27,8 @@
#include <cstdlib>
#endif

#include <iostream>

//===----------------------------------------------------------------------===
//
// This file defines alternate interfaces to core functions that are more
Expand Down Expand Up @@ -62,6 +65,27 @@ static AtomicOrdering fromRust(LLVMAtomicOrdering Ordering) {

static LLVM_THREAD_LOCAL char *LastError;

// Custom error handler for fatal LLVM errors.
//
// Notably it exits the process with code 101, unlike LLVM's default of 1.
static void FatalErrorHandler(void *UserData,
const std::string& Reason,
bool GenCrashDiag) {
// Do the same thing that the default error handler does.
std::cerr << "LLVM ERROR: " << Reason << std::endl;

// Since this error handler exits the process, we have to run any cleanup that
// LLVM would run after handling the error. This might change with an LLVM
// upgrade.
sys::RunInterruptHandlers();

exit(101);
}

extern "C" void LLVMRustInstallFatalErrorHandler() {
install_fatal_error_handler(FatalErrorHandler);
}

extern "C" LLVMMemoryBufferRef
LLVMRustCreateMemoryBufferWithContentsOfFile(const char *Path) {
ErrorOr<std::unique_ptr<MemoryBuffer>> BufOr =
Expand Down

0 comments on commit 00e1f5b

Please sign in to comment.