173
|
1 //===-- runtime/terminate.cpp -----------------------------------*- C++ -*-===//
|
|
2 //
|
|
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4 // See https://llvm.org/LICENSE.txt for license information.
|
|
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6 //
|
|
7 //===----------------------------------------------------------------------===//
|
|
8
|
|
9 #include "terminator.h"
|
|
10 #include <cstdio>
|
|
11 #include <cstdlib>
|
|
12
|
|
13 namespace Fortran::runtime {
|
|
14
|
|
15 [[noreturn]] void Terminator::Crash(const char *message, ...) const {
|
|
16 va_list ap;
|
|
17 va_start(ap, message);
|
|
18 CrashArgs(message, ap);
|
|
19 }
|
|
20
|
|
21 static void (*crashHandler)(const char *, va_list &){nullptr};
|
|
22
|
|
23 void Terminator::RegisterCrashHandler(
|
|
24 void (*handler)(const char *, va_list &)) {
|
|
25 crashHandler = handler;
|
|
26 }
|
|
27
|
|
28 [[noreturn]] void Terminator::CrashArgs(
|
|
29 const char *message, va_list &ap) const {
|
|
30 if (crashHandler) {
|
|
31 crashHandler(message, ap);
|
|
32 }
|
|
33 std::fputs("\nfatal Fortran runtime error", stderr);
|
|
34 if (sourceFileName_) {
|
|
35 std::fprintf(stderr, "(%s", sourceFileName_);
|
|
36 if (sourceLine_) {
|
|
37 std::fprintf(stderr, ":%d", sourceLine_);
|
|
38 }
|
|
39 fputc(')', stderr);
|
|
40 }
|
|
41 std::fputs(": ", stderr);
|
|
42 std::vfprintf(stderr, message, ap);
|
|
43 fputc('\n', stderr);
|
|
44 va_end(ap);
|
|
45 io::FlushOutputOnCrash(*this);
|
|
46 NotifyOtherImagesOfErrorTermination();
|
|
47 std::abort();
|
|
48 }
|
|
49
|
|
50 [[noreturn]] void Terminator::CheckFailed(
|
|
51 const char *predicate, const char *file, int line) const {
|
|
52 Crash("Internal error: RUNTIME_CHECK(%s) failed at %s(%d)", predicate, file,
|
|
53 line);
|
|
54 }
|
|
55
|
|
56 // TODO: These will be defined in the coarray runtime library
|
|
57 void NotifyOtherImagesOfNormalEnd() {}
|
|
58 void NotifyOtherImagesOfFailImageStatement() {}
|
|
59 void NotifyOtherImagesOfErrorTermination() {}
|
|
60 } // namespace Fortran::runtime
|