| //===-- runtime/terminate.cpp ---------------------------------------------===// |
| // |
| // 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 "terminator.h" |
| #include <cstdio> |
| #include <cstdlib> |
| |
| namespace Fortran::runtime { |
| |
| [[noreturn]] void Terminator::Crash(const char *message, ...) const { |
| va_list ap; |
| va_start(ap, message); |
| CrashArgs(message, ap); |
| va_end(ap); |
| } |
| |
| static void (*crashHandler)(const char *, int, const char *, va_list &){ |
| nullptr}; |
| |
| void Terminator::RegisterCrashHandler( |
| void (*handler)(const char *, int, const char *, va_list &)) { |
| crashHandler = handler; |
| } |
| |
| [[noreturn]] void Terminator::CrashArgs( |
| const char *message, va_list &ap) const { |
| if (crashHandler) { |
| crashHandler(sourceFileName_, sourceLine_, message, ap); |
| } |
| std::fputs("\nfatal Fortran runtime error", stderr); |
| if (sourceFileName_) { |
| std::fprintf(stderr, "(%s", sourceFileName_); |
| if (sourceLine_) { |
| std::fprintf(stderr, ":%d", sourceLine_); |
| } |
| fputc(')', stderr); |
| } |
| std::fputs(": ", stderr); |
| std::vfprintf(stderr, message, ap); |
| fputc('\n', stderr); |
| va_end(ap); |
| io::FlushOutputOnCrash(*this); |
| NotifyOtherImagesOfErrorTermination(); |
| std::abort(); |
| } |
| |
| [[noreturn]] void Terminator::CheckFailed( |
| const char *predicate, const char *file, int line) const { |
| Crash("Internal error: RUNTIME_CHECK(%s) failed at %s(%d)", predicate, file, |
| line); |
| } |
| |
| [[noreturn]] void Terminator::CheckFailed(const char *predicate) const { |
| Crash("Internal error: RUNTIME_CHECK(%s) failed at %s(%d)", predicate, |
| sourceFileName_, sourceLine_); |
| } |
| |
| // TODO: These will be defined in the coarray runtime library |
| void NotifyOtherImagesOfNormalEnd() {} |
| void NotifyOtherImagesOfFailImageStatement() {} |
| void NotifyOtherImagesOfErrorTermination() {} |
| } // namespace Fortran::runtime |