Files
swift-mirror/stdlib/public/Concurrency/Error.cpp
T
Doug Gregor cb5b0ee938 [Embedded Concurrency] Route fatal errors to a new _swift_fatalError
Fatal errors in the concurrency runtime used a mix of
swift_Concurrency_fatalError[v] and manual calls to abort(). Drop the
dependency on abort() by routing all true fatal errors through
swift_Concurrency_fatalErrorv and eventually to a new
`_swift_fatalError` C entrypoint defined in the Embedded Swift
runtime, which (optionally) prints and then (always) traps.
2026-05-05 18:06:30 -07:00

50 lines
1.7 KiB
C++

//===--- Error.cpp - Error handling support code --------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "swift/Threading/Errors.h"
#include <cstdio>
#include "Error.h"
#if SWIFT_CONCURRENCY_EMBEDDED
/// In Embedded Swift, this entrypoint is provided to produce a fatal error. It
/// allows hooking of the fatal error operation at the Swift level and avoids
/// any dependencies on the C standard library to abort.
extern "C" SWIFT_NORETURN void _swift_fatalError(const char *message);
#endif
// swift::fatalError is not exported from libswiftCore and not shared, so define
// another internal function instead. In Embedded Swift, we do have a
// `swift_fatalError` that we can call with a string. It does not formatting,
// however.
SWIFT_NORETURN
SWIFT_VFORMAT(2)
void swift::swift_Concurrency_fatalErrorv(uint32_t flags, const char *format,
va_list val) {
#if !SWIFT_CONCURRENCY_EMBEDDED
vfprintf(stderr, format, val);
abort();
#else
_swift_fatalError(format);
#endif
}
SWIFT_NORETURN
SWIFT_FORMAT(2, 3)
void swift::swift_Concurrency_fatalError(uint32_t flags, const char *format,
...) {
va_list val;
va_start(val, format);
swift_Concurrency_fatalErrorv(flags, format, val);
}