| Index: src/IceRNG.cpp | 
| diff --git a/src/IceRNG.cpp b/src/IceRNG.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..6a9f51552e475d7d6b974b8de3c33d69f18588f6 | 
| --- /dev/null | 
| +++ b/src/IceRNG.cpp | 
| @@ -0,0 +1,46 @@ | 
| +//===- subzero/src/IceRNG.cpp - PRNG implementation -----------------------===// | 
| +// | 
| +//                        The Subzero Code Generator | 
| +// | 
| +// This file is distributed under the University of Illinois Open Source | 
| +// License. See LICENSE.TXT for details. | 
| +// | 
| +//===----------------------------------------------------------------------===// | 
| +// | 
| +// This file implements the random number generator. | 
| +// | 
| +//===----------------------------------------------------------------------===// | 
| + | 
| +#include <time.h> | 
| + | 
| +#include "llvm/Support/CommandLine.h" | 
| + | 
| +#include "IceRNG.h" | 
| + | 
| +namespace Ice { | 
| + | 
| +namespace { | 
| +namespace cl = llvm::cl; | 
| + | 
| +cl::opt<unsigned long long> | 
| +RandomSeed("rng-seed", cl::desc("Seed the random number generator"), | 
| +           cl::init(time(0))); | 
| + | 
| +} // end of anonymous namespace | 
| + | 
| +// TODO(wala,stichnot): Switch to RNG implementation from LLVM or C++11. | 
| +// | 
| +// TODO(wala,stichnot): Make it possible to replay the RNG sequence in a | 
| +// subsequent run, for reproducing a bug.  Print the seed in a comment | 
| +// in the asm output.  Embed the seed in the binary via metadata that an | 
| +// attacker can't introspect. | 
| +RandomNumberGenerator::RandomNumberGenerator(llvm::StringRef) | 
| +    : State(RandomSeed) {} | 
| + | 
| +uint64_t RandomNumberGenerator::next(uint64_t Max) { | 
| +  // Lewis, Goodman, and Miller (1969) | 
| +  State = (16807 * State) % 2147483647; | 
| +  return State % Max; | 
| +} | 
| + | 
| +} // end of namespace Ice | 
|  |