Author: jkorous Date: Thu Sep 12 15:55:55 2019 New Revision: 371787 URL: http://llvm.org/viewvc/llvm-project?rev=371787&view=rev Log: [libclang] Expose abort()-ing LLVM fatal error handler
Differential Revision: https://reviews.llvm.org/D66775 Added: cfe/trunk/include/clang-c/FatalErrorHandler.h cfe/trunk/tools/libclang/FatalErrorHandler.cpp cfe/trunk/unittests/libclang/CrashTests/ cfe/trunk/unittests/libclang/CrashTests/CMakeLists.txt cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp Modified: cfe/trunk/tools/libclang/CIndex.cpp cfe/trunk/tools/libclang/CMakeLists.txt cfe/trunk/tools/libclang/libclang.exports cfe/trunk/unittests/libclang/CMakeLists.txt Added: cfe/trunk/include/clang-c/FatalErrorHandler.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/FatalErrorHandler.h?rev=371787&view=auto ============================================================================== --- cfe/trunk/include/clang-c/FatalErrorHandler.h (added) +++ cfe/trunk/include/clang-c/FatalErrorHandler.h Thu Sep 12 15:55:55 2019 @@ -0,0 +1,33 @@ +/*===-- clang-c/FatalErrorHandler.h - Fatal Error Handling --------*- C -*-===*\ +|* *| +|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| +|* Exceptions. *| +|* See https://llvm.org/LICENSE.txt for license information. *| +|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| +|* *| +\*===----------------------------------------------------------------------===*/ + +#ifndef LLVM_CLANG_C_FATAL_ERROR_HANDLER_H +#define LLVM_CLANG_C_FATAL_ERROR_HANDLER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Installs error handler that prints error message to stderr and calls abort(). + * Replaces currently installed error handler (if any). + */ +void clang_install_aborting_llvm_fatal_error_handler(); + +/** + * Removes currently installed error handler (if any). + * If no error handler is intalled, the default strategy is to print error + * message to stderr and call exit(1). + */ +void clang_uninstall_llvm_fatal_error_handler(); + +#ifdef __cplusplus +} +#endif +#endif Modified: cfe/trunk/tools/libclang/CIndex.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=371787&r1=371786&r2=371787&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CIndex.cpp (original) +++ cfe/trunk/tools/libclang/CIndex.cpp Thu Sep 12 15:55:55 2019 @@ -20,6 +20,7 @@ #include "CXTranslationUnit.h" #include "CXType.h" #include "CursorVisitor.h" +#include "clang-c/FatalErrorHandler.h" #include "clang/AST/Attr.h" #include "clang/AST/Mangle.h" #include "clang/AST/StmtVisitor.h" @@ -3243,18 +3244,10 @@ RefNamePieces buildPieces(unsigned NameF // Misc. API hooks. //===----------------------------------------------------------------------===// -static void fatal_error_handler(void *user_data, const std::string& reason, - bool gen_crash_diag) { - // Write the result out to stderr avoiding errs() because raw_ostreams can - // call report_fatal_error. - fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str()); - ::abort(); -} - namespace { struct RegisterFatalErrorHandler { RegisterFatalErrorHandler() { - llvm::install_fatal_error_handler(fatal_error_handler, nullptr); + clang_install_aborting_llvm_fatal_error_handler(); } }; } Modified: cfe/trunk/tools/libclang/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CMakeLists.txt?rev=371787&r1=371786&r2=371787&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CMakeLists.txt (original) +++ cfe/trunk/tools/libclang/CMakeLists.txt Thu Sep 12 15:55:55 2019 @@ -19,6 +19,7 @@ set(SOURCES CXString.cpp CXType.cpp Indexing.cpp + FatalErrorHandler.cpp ADDITIONAL_HEADERS CIndexDiagnostic.h @@ -43,6 +44,7 @@ set(LIBS clangSema clangSerialization clangTooling + LLVMSupport ) if (CLANG_ENABLE_ARCMT) Added: cfe/trunk/tools/libclang/FatalErrorHandler.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/FatalErrorHandler.cpp?rev=371787&view=auto ============================================================================== --- cfe/trunk/tools/libclang/FatalErrorHandler.cpp (added) +++ cfe/trunk/tools/libclang/FatalErrorHandler.cpp Thu Sep 12 15:55:55 2019 @@ -0,0 +1,28 @@ +/*===-- clang-c/FatalErrorHandler.cpp - Fatal Error Handling ------*- C -*-===*\ +|* *| +|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| +|* Exceptions. *| +|* See https://llvm.org/LICENSE.txt for license information. *| +|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| +|* *| +\*===----------------------------------------------------------------------===*/ + +#include "clang-c/FatalErrorHandler.h" +#include "llvm/Support/ErrorHandling.h" + +static void aborting_fatal_error_handler(void *, const std::string &reason, + bool) { + // Write the result out to stderr avoiding errs() because raw_ostreams can + // call report_fatal_error. + fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str()); + ::abort(); +} + +void clang_install_aborting_llvm_fatal_error_handler() { + llvm::remove_fatal_error_handler(); + llvm::install_fatal_error_handler(aborting_fatal_error_handler, nullptr); +} + +void clang_uninstall_llvm_fatal_error_handler() { + llvm::remove_fatal_error_handler(); +} Modified: cfe/trunk/tools/libclang/libclang.exports URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=371787&r1=371786&r2=371787&view=diff ============================================================================== --- cfe/trunk/tools/libclang/libclang.exports (original) +++ cfe/trunk/tools/libclang/libclang.exports Thu Sep 12 15:55:55 2019 @@ -379,3 +379,5 @@ clang_EvalResult_dispose clang_PrintingPolicy_getProperty clang_PrintingPolicy_setProperty clang_PrintingPolicy_dispose +clang_install_aborting_llvm_fatal_error_handler +clang_uninstall_llvm_fatal_error_handler Modified: cfe/trunk/unittests/libclang/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/CMakeLists.txt?rev=371787&r1=371786&r2=371787&view=diff ============================================================================== --- cfe/trunk/unittests/libclang/CMakeLists.txt (original) +++ cfe/trunk/unittests/libclang/CMakeLists.txt Thu Sep 12 15:55:55 2019 @@ -6,3 +6,5 @@ target_link_libraries(libclangTests PRIVATE libclang ) + +add_subdirectory(CrashTests) Added: cfe/trunk/unittests/libclang/CrashTests/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/CrashTests/CMakeLists.txt?rev=371787&view=auto ============================================================================== --- cfe/trunk/unittests/libclang/CrashTests/CMakeLists.txt (added) +++ cfe/trunk/unittests/libclang/CrashTests/CMakeLists.txt Thu Sep 12 15:55:55 2019 @@ -0,0 +1,8 @@ +add_clang_unittest(libclangCrashTests + LibclangCrashTest.cpp + ) + +target_link_libraries(libclangCrashTests + PRIVATE + libclang + ) Added: cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp?rev=371787&view=auto ============================================================================== --- cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp (added) +++ cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp Thu Sep 12 15:55:55 2019 @@ -0,0 +1,36 @@ +//===- unittests/libclang/LibclangCrashTest.cpp --- libclang tests --------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "../TestUtils.h" +#include "clang-c/FatalErrorHandler.h" +#include "gtest/gtest.h" +#include <string> + +TEST_F(LibclangParseTest, InstallAbortingLLVMFatalErrorHandler) { + clang_toggleCrashRecovery(0); + clang_install_aborting_llvm_fatal_error_handler(); + + std::string Main = "main.h"; + WriteFile(Main, "#pragma clang __debug llvm_fatal_error"); + + EXPECT_DEATH(clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0, + nullptr, 0, TUFlags), + ""); +} + +TEST_F(LibclangParseTest, UninstallAbortingLLVMFatalErrorHandler) { + clang_toggleCrashRecovery(0); + clang_install_aborting_llvm_fatal_error_handler(); + clang_uninstall_llvm_fatal_error_handler(); + + std::string Main = "main.h"; + WriteFile(Main, "#pragma clang __debug llvm_fatal_error"); + + EXPECT_NO_FATAL_FAILURE(clang_parseTranslationUnit( + Index, Main.c_str(), nullptr, 0, nullptr, 0, TUFlags)); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits