blob: a069da7d7b2ea380aac61baabbcb5a6eff7f2619 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/stdlib/_Exit.h"
#include <zircon/sanitizer.h>
#include <zircon/syscalls.h>
#include "src/__support/common.h"
#include "src/unistd/_exit.h"
namespace LIBC_NAMESPACE {
namespace {
[[noreturn]] void Exit(int status) noexcept {
status = __sanitizer_process_exit_hook(status);
for (;;) {
_zx_process_exit(status);
}
}
} // namespace
// Standard C specifies _Exit and C++ declares it noexcept.
// POSIX specifies _exit and in C++ it's not declared noexcept.
// They're actually the same thing, but a strict C++ compiler
// won't let us make them [[gnu::alias]] aliases directly here
// because the noexcept constitutes a type difference. So both
// are separately defined identically and will be ICF'd together
// for the same effect as the alias, but we can't use the alias
// (unless we resort to assembly, but this seems cleaner).
LLVM_LIBC_FUNCTION(void, _Exit, (int status)) { Exit(status); }
LLVM_LIBC_FUNCTION(void, _exit, (int status)) { Exit(status); }
} // namespace LIBC_NAMESPACE