[llvm] r200767 - Implemented support for Process::GetRandomNumber on Windows.

Aaron Ballman aaron at aaronballman.com
Tue Feb 11 09:07:17 PST 2014


Yes, and Galina's bot is using MinGW, not MinGW-w64, which is why the
build was failing.

~Aaron

On Tue, Feb 11, 2014 at 12:03 PM, Yaron Keren <yaron.keren at gmail.com> wrote:
> There are two MinGW out there,
>
> 1) Original MinGW
> http://mingw.org
>
> 2)| MinGW-w64
> http://sourceforge.net/projects/mingw-w64/
> http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/
>
> They use different header files. The former still does not support rand_s():
>
>   http://sourceforge.net/p/mingw/bugs/2122/
>
> while the later had supported it for couple of versions.
>
> I had worked with both releases and found MinGW-w64 (mingw-builds) to be
> more compatible and useful than the original one, not to mention the 64-bit
> support.
>
> Yaron
>
>
>
> 2014-02-11 18:26 GMT+02:00 Aaron Ballman <aaron at aaronballman.com>:
>>
>> That doesn't appear to be the case for the MinGW bot Galina had -- it
>> was also lacking errno_t, so my guess is that it's an age problem. The
>> new implementation skirts the issue by using the underlying Win32 APIs
>> to generate the random numbers.
>>
>> ~Aaron
>>
>> On Tue, Feb 11, 2014 at 1:48 AM, Yaron Keren <yaron.keren at gmail.com>
>> wrote:
>> > Hi,
>> >
>> > Sorry for not catching this thread earlier, MinGW does have rand_s if
>> > _CRT_RAND_S is defined.
>> > From stdio.h:
>> >
>> > #ifdef _CRT_RAND_S
>> >   _CRTIMP errno_t __cdecl rand_s(unsigned int *randomValue);
>> > #endif
>> >
>> > libcxx already uses rand_s in random_device and compiles with MinGW,
>> > here is
>> > the discussion:
>> >
>> >
>> >
>> > http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131007/090656.html
>> >
>> > Yaron
>> >
>> >
>> >
>> >
>> >
>> > 2014-02-11 5:46 GMT+02:00 Aaron Ballman <aaron at aaronballman.com>:
>> >>
>> >> This is hopefully resolved in r201124; I reimplemented the original
>> >> patch using CryptGenRandom, which is effectively what rand_s() uses
>> >> internally anyway.
>> >>
>> >> ~Aaron
>> >>
>> >> On Mon, Feb 10, 2014 at 8:52 PM, Aaron Ballman <aaron at aaronballman.com>
>> >> wrote:
>> >> > It appears there is no rand_s() implementation for MinGW 32, so the
>> >> > question becomes whether we back this change out, or fall back on
>> >> > rand(). Unfortunately, r185126 is relying on this, and I'm loathe to
>> >> > start backing out other people's work because of this. So instead, I
>> >> > will gin up a replacement for MinGW 32 and hopefully Stephan can
>> >> > either come up with a better fix, or mine will be sufficient for the
>> >> > task.
>> >> >
>> >> > ~Aaron
>> >> >
>> >> > On Mon, Feb 10, 2014 at 2:15 PM, Aaron Ballman
>> >> > <aaron at aaronballman.com>
>> >> > wrote:
>> >> >> Thank you for pointing this out, Galina and sorry for the
>> >> >> difficulties!
>> >> >>
>> >> >> Stephan, would you be able to look into this?
>> >> >>
>> >> >> ~Aaron
>> >> >>
>> >> >> On Mon, Feb 10, 2014 at 2:05 PM, Galina Kistanova
>> >> >> <gkistanova at gmail.com> wrote:
>> >> >>> Hi Aaron,
>> >> >>>
>> >> >>> Seems this revision broke clang-native-mingw32-win7 builder:
>> >> >>>
>> >> >>>
>> >> >>> http://lab.llvm.org:8011/builders/clang-native-mingw32-win7/builds/5557
>> >> >>>
>> >> >>> The last successful build was for revision 200765:
>> >> >>>
>> >> >>>
>> >> >>> http://lab.llvm.org:8011/builders/clang-native-mingw32-win7/builds/5578
>> >> >>> Please have a look at it.
>> >> >>>
>> >> >>> Thanks
>> >> >>>
>> >> >>> Galina
>> >> >>>
>> >> >>>
>> >> >>>
>> >> >>> On Tue, Feb 4, 2014 at 6:49 AM, Aaron Ballman
>> >> >>> <aaron at aaronballman.com>
>> >> >>> wrote:
>> >> >>>>
>> >> >>>> Author: aaronballman
>> >> >>>> Date: Tue Feb  4 08:49:21 2014
>> >> >>>> New Revision: 200767
>> >> >>>>
>> >> >>>> URL: http://llvm.org/viewvc/llvm-project?rev=200767&view=rev
>> >> >>>> Log:
>> >> >>>> Implemented support for Process::GetRandomNumber on Windows.
>> >> >>>>
>> >> >>>> Patch thanks to Stephan Tolksdorf!
>> >> >>>>
>> >> >>>> Modified:
>> >> >>>>     llvm/trunk/lib/Support/Process.cpp
>> >> >>>>     llvm/trunk/lib/Support/Windows/Process.inc
>> >> >>>>     llvm/trunk/unittests/Support/ProcessTest.cpp
>> >> >>>>
>> >> >>>> Modified: llvm/trunk/lib/Support/Process.cpp
>> >> >>>> URL:
>> >> >>>>
>> >> >>>>
>> >> >>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Process.cpp?rev=200767&r1=200766&r2=200767&view=diff
>> >> >>>>
>> >> >>>>
>> >> >>>>
>> >> >>>> ==============================================================================
>> >> >>>> --- llvm/trunk/lib/Support/Process.cpp (original)
>> >> >>>> +++ llvm/trunk/lib/Support/Process.cpp Tue Feb  4 08:49:21 2014
>> >> >>>> @@ -12,6 +12,11 @@
>> >> >>>>
>> >> >>>>
>> >> >>>>
>> >> >>>> //===----------------------------------------------------------------------===//
>> >> >>>>
>> >> >>>>  #include "llvm/Config/config.h"
>> >> >>>> +#if LLVM_ON_WIN32
>> >> >>>> +  // This define makes stdlib.h declare the rand_s function.
>> >> >>>> +#define _CRT_RAND_S
>> >> >>>> +#include <stdlib.h>
>> >> >>>> +#endif
>> >> >>>>  #include "llvm/Support/ErrorHandling.h"
>> >> >>>>  #include "llvm/Support/Process.h"
>> >> >>>>
>> >> >>>>
>> >> >>>> Modified: llvm/trunk/lib/Support/Windows/Process.inc
>> >> >>>> URL:
>> >> >>>>
>> >> >>>>
>> >> >>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Process.inc?rev=200767&r1=200766&r2=200767&view=diff
>> >> >>>>
>> >> >>>>
>> >> >>>>
>> >> >>>> ==============================================================================
>> >> >>>> --- llvm/trunk/lib/Support/Windows/Process.inc (original)
>> >> >>>> +++ llvm/trunk/lib/Support/Windows/Process.inc Tue Feb  4 08:49:21
>> >> >>>> 2014
>> >> >>>> @@ -360,3 +360,10 @@ const char *Process::ResetColor() {
>> >> >>>>    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
>> >> >>>> defaultColors());
>> >> >>>>    return 0;
>> >> >>>>  }
>> >> >>>> +
>> >> >>>> +unsigned Process::GetRandomNumber() {
>> >> >>>> +  unsigned int result;
>> >> >>>> +  const errno_t ec = rand_s(&result);
>> >> >>>> +  assert(ec == 0 && "rand_s failed");
>> >> >>>> +  return result;
>> >> >>>> +}
>> >> >>>>
>> >> >>>> Modified: llvm/trunk/unittests/Support/ProcessTest.cpp
>> >> >>>> URL:
>> >> >>>>
>> >> >>>>
>> >> >>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ProcessTest.cpp?rev=200767&r1=200766&r2=200767&view=diff
>> >> >>>>
>> >> >>>>
>> >> >>>>
>> >> >>>> ==============================================================================
>> >> >>>> --- llvm/trunk/unittests/Support/ProcessTest.cpp (original)
>> >> >>>> +++ llvm/trunk/unittests/Support/ProcessTest.cpp Tue Feb  4
>> >> >>>> 08:49:21
>> >> >>>> 2014
>> >> >>>> @@ -39,6 +39,13 @@ TEST(ProcessTest, SelfProcess) {
>> >> >>>>    EXPECT_GT(TimeValue::MaxTime,
>> >> >>>> process::get_self()->get_wall_time());
>> >> >>>>  }
>> >> >>>>
>> >> >>>> +TEST(ProcessTest, GetRandomNumberTest) {
>> >> >>>> +  const unsigned r1 = Process::GetRandomNumber();
>> >> >>>> +  const unsigned r2 = Process::GetRandomNumber();
>> >> >>>> +  // It should be extremely unlikely that both r1 and r2 are 0.
>> >> >>>> +  EXPECT_NE((r1 | r2), 0);
>> >> >>>> +}
>> >> >>>> +
>> >> >>>>  #ifdef _MSC_VER
>> >> >>>>  #define setenv(name, var, ignore) _putenv_s(name, var)
>> >> >>>>  #endif
>> >> >>>>
>> >> >>>>
>> >> >>>> _______________________________________________
>> >> >>>> llvm-commits mailing list
>> >> >>>> llvm-commits at cs.uiuc.edu
>> >> >>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> >> >>>
>> >> >>>
>> >> >>>
>> >> >>>
>> >> >>> --
>> >> >>> Thanks
>> >> >>>
>> >> >>> Galina
>> >> _______________________________________________
>> >> 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