diff options
Diffstat (limited to 'llvm/lib/Support/Errno.cpp')
| -rw-r--r-- | llvm/lib/Support/Errno.cpp | 75 | 
1 files changed, 75 insertions, 0 deletions
| diff --git a/llvm/lib/Support/Errno.cpp b/llvm/lib/Support/Errno.cpp new file mode 100644 index 000000000000..d18231c6ebf5 --- /dev/null +++ b/llvm/lib/Support/Errno.cpp @@ -0,0 +1,75 @@ +//===- 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 "llvm/Support/raw_ostream.h" +#include <string.h> + +#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; +#elif defined(HAVE_STRERROR) +  // 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); +#else +  // Strange that this system doesn't even have strerror +  // but, oh well, just use a generic message +  raw_string_ostream stream(str); +  stream << "Error #" << errnum; +  stream.flush(); +#endif +  return str; +} + +}  // namespace sys +}  // namespace llvm | 
