[llvm-commits] [llvm] r74621 - in /llvm/trunk: autoconf/configure.ac cmake/config-ix.cmake include/llvm/Config/config.h.cmake include/llvm/System/Errno.h lib/System/CMakeLists.txt lib/System/Errno.cpp lib/System/Unix/Unix.h tools/gold/gold-plugin

Jeffrey Yasskin jyasskin at google.com
Fri Jul 3 15:52:27 PDT 2009


So I can avoid this in the future, what exactly broke? #elif
HAVE_STRERROR_S should only differ from #elif defined(HAVE_STRERROR_S)
when HAVE_STRERROR_S is defined to 0. Is cmake defining things to 0
instead of 1 when it wants them to be true on Windows?

On Thu, Jul 2, 2009 at 4:35 AM, Howard Su<howard0su at gmail.com> wrote:
> this break windows build. Please apply the following patch:
> Index: Errno.cpp
> ===================================================================
> --- Errno.cpp (revision 74696)
> +++ Errno.cpp (working copy)
> @@ -47,10 +47,10 @@
>  # else
>      strerror_r(errnum,buffer,MaxErrStrLen-1);
>  # endif
> -#elif HAVE_STRERROR_S  // Windows.
> +#elif defined(HAVE_STRERROR_S)  // Windows.
>      if (errnum)
>        strerror_s(buffer, errnum);
> -#elif HAVE_STRERROR
> +#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.
>
> On Thu, Jul 2, 2009 at 2:11 AM, Jeffrey Yasskin <jyasskin at google.com> wrote:
>>
>> Author: jyasskin
>> Date: Wed Jul  1 13:11:20 2009
>> New Revision: 74621
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=74621&view=rev
>> Log:
>> Add a portable strerror*() wrapper, llvm::sys::StrError().  This includes
>> the
>> Windows variant, strerror_s, but I couldn't test that.
>>
>> I'll update configure and config.h.in in a subsequent patch.
>>
>> Added:
>>    llvm/trunk/include/llvm/System/Errno.h
>>    llvm/trunk/lib/System/Errno.cpp
>> Modified:
>>    llvm/trunk/autoconf/configure.ac
>>    llvm/trunk/cmake/config-ix.cmake
>>    llvm/trunk/include/llvm/Config/config.h.cmake
>>    llvm/trunk/lib/System/CMakeLists.txt
>>    llvm/trunk/lib/System/Unix/Unix.h
>>    llvm/trunk/tools/gold/gold-plugin.cpp
>>
>> Modified: llvm/trunk/autoconf/configure.ac
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/autoconf/configure.ac?rev=74621&r1=74620&r2=74621&view=diff
>>
>>
>> ==============================================================================
>> --- llvm/trunk/autoconf/configure.ac (original)
>> +++ llvm/trunk/autoconf/configure.ac Wed Jul  1 13:11:20 2009
>> @@ -914,7 +914,8 @@
>>  AC_CHECK_FUNCS([powf fmodf strtof round ])
>>  AC_CHECK_FUNCS([getpagesize getrusage getrlimit setrlimit gettimeofday ])
>>  AC_CHECK_FUNCS([isatty mkdtemp mkstemp ])
>> -AC_CHECK_FUNCS([mktemp realpath sbrk setrlimit strdup strerror strerror_r
>> ])
>> +AC_CHECK_FUNCS([mktemp realpath sbrk setrlimit strdup ])
>> +AC_CHECK_FUNCS([strerror strerror_r strerror_s ])
>>  AC_CHECK_FUNCS([strtoll strtoq sysconf malloc_zone_statistics ])
>>  AC_CHECK_FUNCS([setjmp longjmp sigsetjmp siglongjmp])
>>  AC_C_PRINTF_A
>>
>> Modified: llvm/trunk/cmake/config-ix.cmake
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/config-ix.cmake?rev=74621&r1=74620&r2=74621&view=diff
>>
>>
>> ==============================================================================
>> --- llvm/trunk/cmake/config-ix.cmake (original)
>> +++ llvm/trunk/cmake/config-ix.cmake Wed Jul  1 13:11:20 2009
>> @@ -67,6 +67,9 @@
>>                     HAVE_MALLOC_ZONE_STATISTICS)
>>  check_symbol_exists(pthread_mutex_lock pthread.h HAVE_PTHREAD_MUTEX_LOCK)
>>  check_symbol_exists(strtoll stdlib.h HAVE_STRTOLL)
>> +check_symbol_exists(strerror string.h HAVE_STRERROR)
>> +check_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
>> +check_symbol_exists(strerror_s string.h HAVE_STRERROR_S)
>>
>>  check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC)
>>  if( LLVM_USING_GLIBC )
>>
>> Modified: llvm/trunk/include/llvm/Config/config.h.cmake
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Config/config.h.cmake?rev=74621&r1=74620&r2=74621&view=diff
>>
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Config/config.h.cmake (original)
>> +++ llvm/trunk/include/llvm/Config/config.h.cmake Wed Jul  1 13:11:20 2009
>> @@ -364,10 +364,13 @@
>>  #undef HAVE_STRDUP
>>
>>  /* Define to 1 if you have the `strerror' function. */
>> -#undef HAVE_STRERROR
>> +#cmakedefine HAVE_STRERROR
>>
>>  /* Define to 1 if you have the `strerror_r' function. */
>> -#undef HAVE_STRERROR_R
>> +#cmakedefine HAVE_STRERROR_R
>> +
>> +/* Define to 1 if you have the `strerror_s' function. */
>> +#cmakedefine HAVE_STRERROR_S
>>
>>  /* Define to 1 if you have the <strings.h> header file. */
>>  #undef HAVE_STRINGS_H
>>
>> Added: llvm/trunk/include/llvm/System/Errno.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Errno.h?rev=74621&view=auto
>>
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/System/Errno.h (added)
>> +++ llvm/trunk/include/llvm/System/Errno.h Wed Jul  1 13:11:20 2009
>> @@ -0,0 +1,34 @@
>> +//===- llvm/System/Errno.h - Portable+convenient errno handling -*- C++
>> -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// This file declares some portable and convenient functions to deal with
>> errno.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_SYSTEM_ERRNO_H
>> +#define LLVM_SYSTEM_ERRNO_H
>> +
>> +#include <string>
>> +
>> +namespace llvm {
>> +namespace sys {
>> +
>> +/// Returns a string representation of the errno value, using whatever
>> +/// thread-safe variant of strerror() is available.  Be sure to call this
>> +/// immediately after the function that set errno, or errno may have been
>> +/// overwritten by an intervening call.
>> +std::string StrError();
>> +
>> +/// Like the no-argument version above, but uses \p errnum instead of
>> errno.
>> +std::string StrError(int errnum);
>> +
>> +}  // namespace sys
>> +}  // namespace llvm
>> +
>> +#endif  // LLVM_SYSTEM_ERRNO_H
>>
>> Modified: llvm/trunk/lib/System/CMakeLists.txt
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/CMakeLists.txt?rev=74621&r1=74620&r2=74621&view=diff
>>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/System/CMakeLists.txt (original)
>> +++ llvm/trunk/lib/System/CMakeLists.txt Wed Jul  1 13:11:20 2009
>> @@ -3,6 +3,7 @@
>>   Atomic.cpp
>>   Disassembler.cpp
>>   DynamicLibrary.cpp
>> +  Errno.cpp
>>   Host.cpp
>>   IncludeFile.cpp
>>   Memory.cpp
>>
>> Added: llvm/trunk/lib/System/Errno.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Errno.cpp?rev=74621&view=auto
>>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/System/Errno.cpp (added)
>> +++ llvm/trunk/lib/System/Errno.cpp Wed Jul  1 13:11:20 2009
>> @@ -0,0 +1,71 @@
>> +//===- Errno.cpp - errno support --------------------------------*- C++
>> -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// This file implements the errno wrappers.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "llvm/System/Errno.h"
>> +#include "llvm/Config/config.h"     // Get autoconf configuration
>> settings
>> +
>> +#if HAVE_STRING_H
>> +#include <string.h>
>> +
>>
>> +//===----------------------------------------------------------------------===//
>> +//=== WARNING: Implementation here must contain only TRULY operating
>> system
>> +//===          independent code.
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +namespace llvm {
>> +namespace sys {
>> +
>> +#if HAVE_ERRNO_H
>> +#include <errno.h>
>> +std::string StrError() {
>> +  return StrError(errno);
>> +}
>> +#endif  // HAVE_ERRNO_H
>> +
>> +std::string StrError(int errnum) {
>> +  const int MaxErrStrLen = 2000;
>> +  char buffer[MaxErrStrLen];
>> +  buffer[0] = '\0';
>> +  char* str = buffer;
>> +#ifdef HAVE_STRERROR_R
>> +  // strerror_r is thread-safe.
>> +  if (errnum)
>> +# 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);
>> +# endif
>> +#elif HAVE_STRERROR_S  // Windows.
>> +    if (errnum)
>> +      strerror_s(buffer, errnum);
>> +#elif 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.
>> +  if (errnum)
>> +    strncpy(buffer,strerror(errnum),MaxErrStrLen-1);
>> +  buffer[MaxErrStrLen-1] = '\0';
>> +#else
>> +  // Strange that this system doesn't even have strerror
>> +  // but, oh well, just use a generic message
>> +  sprintf(buffer, "Error #%d", errnum);
>> +#endif
>> +  return str;
>> +}
>> +
>> +}  // namespace sys
>> +}  // namespace llvm
>> +
>> +#endif  // HAVE_STRING_H
>>
>> Modified: llvm/trunk/lib/System/Unix/Unix.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Unix.h?rev=74621&r1=74620&r2=74621&view=diff
>>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/System/Unix/Unix.h (original)
>> +++ llvm/trunk/lib/System/Unix/Unix.h Wed Jul  1 13:11:20 2009
>> @@ -20,6 +20,7 @@
>>
>>  //===----------------------------------------------------------------------===//
>>
>>  #include "llvm/Config/config.h"     // Get autoconf configuration
>> settings
>> +#include "llvm/System/Errno.h"
>>  #include <cstdlib>
>>  #include <cstdio>
>>  #include <cstring>
>> @@ -77,34 +78,9 @@
>>   std::string* ErrMsg, const std::string& prefix, int errnum = -1) {
>>   if (!ErrMsg)
>>     return true;
>> -  char buffer[MAXPATHLEN];
>> -  buffer[0] = 0;
>> -  char* str = buffer;
>>   if (errnum == -1)
>>     errnum = errno;
>> -#ifdef HAVE_STRERROR_R
>> -  // strerror_r is thread-safe.
>> -  if (errnum)
>> -# 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,MAXPATHLEN-1);
>> -# else
>> -    strerror_r(errnum,buffer,MAXPATHLEN-1);
>> -# endif
>> -#elif 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.
>> -  if (errnum)
>> -    strncpy(buffer,strerror(errnum),MAXPATHLEN-1);
>> -  buffer[MAXPATHLEN-1] = 0;
>> -#else
>> -  // Strange that this system doesn't even have strerror
>> -  // but, oh well, just use a generic message
>> -  sprintf(buffer, "Error #%d", errnum);
>> -#endif
>> -  *ErrMsg = prefix + ": " + str;
>> +  *ErrMsg = prefix + ": " + llvm::sys::StrError(errnum);
>>   return true;
>>  }
>>
>>
>> Modified: llvm/trunk/tools/gold/gold-plugin.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=74621&r1=74620&r2=74621&view=diff
>>
>>
>> ==============================================================================
>> --- llvm/trunk/tools/gold/gold-plugin.cpp (original)
>> +++ llvm/trunk/tools/gold/gold-plugin.cpp Wed Jul  1 13:11:20 2009
>> @@ -17,6 +17,7 @@
>>  #include "llvm-c/lto.h"
>>
>>  #include "llvm/Support/raw_ostream.h"
>> +#include "llvm/System/Errno.h"
>>  #include "llvm/System/Path.h"
>>  #include "llvm/System/Program.h"
>>
>> @@ -183,7 +184,7 @@
>>       (*message)(LDPL_ERROR,
>>                  "Failed to seek to archive member of %s at offset %d:
>> %s\n",
>>                  file->name,
>> -                 file->offset, strerror(errno));
>> +                 file->offset, sys::StrError(errno).c_str());
>>       return LDPS_ERR;
>>     }
>>     buf = malloc(file->filesize);
>> @@ -198,7 +199,7 @@
>>                  "Failed to read archive member of %s at offset %d: %s\n",
>>                  file->name,
>>                  file->offset,
>> -                 strerror(errno));
>> +                 sys::StrError(errno).c_str());
>>       free(buf);
>>       return LDPS_ERR;
>>     }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
> --
> -Howard
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>




More information about the llvm-commits mailing list