mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 12:16:09 +00:00

Most systems support strerror_r. For the remaining systems (e.g. MSVC) strerror_s and strerror can be used as fallbacks. We don't have a supported operating system/compiler that doesn't provide `strerror`. Close https://github.com/llvm/llvm-project/issues/62804 https://github.com/flang-compiler/f18/pull/1068 added a fallback when strerror is unavailable, but I think the code path is dead. Reviewed By: serge-sans-paille, vzakhari Differential Revision: https://reviews.llvm.org/D151718
69 lines
1.9 KiB
C++
69 lines
1.9 KiB
C++
//===- Errno.cpp - errno support --------------------------------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the errno wrappers.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Support/Errno.h"
|
|
#include "llvm/Config/config.h"
|
|
#include <cstring>
|
|
|
|
#if HAVE_ERRNO_H
|
|
#include <errno.h>
|
|
#endif
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
//=== WARNING: Implementation here must contain only TRULY operating system
|
|
//=== independent code.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
namespace llvm {
|
|
namespace sys {
|
|
|
|
#if HAVE_ERRNO_H
|
|
std::string StrError() {
|
|
return StrError(errno);
|
|
}
|
|
#endif // HAVE_ERRNO_H
|
|
|
|
std::string StrError(int errnum) {
|
|
std::string str;
|
|
if (errnum == 0)
|
|
return str;
|
|
#if defined(HAVE_STRERROR_R) || HAVE_DECL_STRERROR_S
|
|
const int MaxErrStrLen = 2000;
|
|
char buffer[MaxErrStrLen];
|
|
buffer[0] = '\0';
|
|
#endif
|
|
|
|
#ifdef HAVE_STRERROR_R
|
|
// strerror_r is thread-safe.
|
|
#if defined(__GLIBC__) && defined(_GNU_SOURCE)
|
|
// glibc defines its own incompatible version of strerror_r
|
|
// which may not use the buffer supplied.
|
|
str = strerror_r(errnum, buffer, MaxErrStrLen - 1);
|
|
#else
|
|
strerror_r(errnum, buffer, MaxErrStrLen - 1);
|
|
str = buffer;
|
|
#endif
|
|
#elif HAVE_DECL_STRERROR_S // "Windows Secure API"
|
|
strerror_s(buffer, MaxErrStrLen - 1, errnum);
|
|
str = buffer;
|
|
#else
|
|
// Copy the thread un-safe result of strerror into
|
|
// the buffer as fast as possible to minimize impact
|
|
// of collision of strerror in multiple threads.
|
|
str = strerror(errnum);
|
|
#endif
|
|
return str;
|
|
}
|
|
|
|
} // namespace sys
|
|
} // namespace llvm
|