Mercurial > hg > CbC > CbC_llvm
diff flang/runtime/terminator.cpp @ 173:0572611fdcc8 llvm10 llvm12
reorgnization done
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 11:55:54 +0900 |
parents | |
children | 2e18cbf3894f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flang/runtime/terminator.cpp Mon May 25 11:55:54 2020 +0900 @@ -0,0 +1,60 @@ +//===-- runtime/terminate.cpp -----------------------------------*- 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 "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); +} + +static void (*crashHandler)(const char *, va_list &){nullptr}; + +void Terminator::RegisterCrashHandler( + void (*handler)(const char *, va_list &)) { + crashHandler = handler; +} + +[[noreturn]] void Terminator::CrashArgs( + const char *message, va_list &ap) const { + if (crashHandler) { + crashHandler(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); +} + +// TODO: These will be defined in the coarray runtime library +void NotifyOtherImagesOfNormalEnd() {} +void NotifyOtherImagesOfFailImageStatement() {} +void NotifyOtherImagesOfErrorTermination() {} +} // namespace Fortran::runtime