summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJF Bastien <jfb@google.com>2014-06-25 15:21:42 +0000
committerJF Bastien <jfb@google.com>2014-06-25 15:21:42 +0000
commitb4840d7a4d357b3f79071cccdeaadefe278b912a (patch)
tree8f88b049eebe2f703c17b70044f1ec35f5cc397e /include
parentb209f33bc7e73f8125f6b911a4c8b21a1cccc125 (diff)
downloadllvm-b4840d7a4d357b3f79071cccdeaadefe278b912a.tar.gz
llvm-b4840d7a4d357b3f79071cccdeaadefe278b912a.tar.bz2
llvm-b4840d7a4d357b3f79071cccdeaadefe278b912a.tar.xz
Random Number Generator (llvm)
Provides an abstraction for a random number generator (RNG) that produces a stream of pseudo-random numbers. The current implementation uses C++11 facilities and is therefore not cryptographically secure. The RNG is salted with the text of the current command line invocation. In addition, a user may specify a seed (reproducible builds). In clang, the seed can be set via -frandom-seed=X In the back end, the seed can be set via -rng-seed=X This is the llvm part of the patch. clang part: D3391 URL: http://reviews.llvm.org/D3390 Author: yln I'm landing this for the second time, it broke Windows bots the first time around. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211705 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/IR/Module.h8
-rw-r--r--include/llvm/Support/RandomNumberGenerator.h54
2 files changed, 62 insertions, 0 deletions
diff --git a/include/llvm/IR/Module.h b/include/llvm/IR/Module.h
index 7230df9f79..77e5d21e29 100644
--- a/include/llvm/IR/Module.h
+++ b/include/llvm/IR/Module.h
@@ -29,6 +29,7 @@ namespace llvm {
class FunctionType;
class GVMaterializer;
class LLVMContext;
+class RandomNumberGenerator;
class StructType;
template<typename T> struct DenseMapInfo;
template<typename KeyT, typename ValueT, typename KeyInfoT> class DenseMap;
@@ -201,6 +202,8 @@ private:
std::string ModuleID; ///< Human readable identifier for the module
std::string TargetTriple; ///< Platform target triple Module compiled on
void *NamedMDSymTab; ///< NamedMDNode names.
+ // Allow lazy initialization in const method.
+ mutable RandomNumberGenerator *RNG; ///< The random number generator for this module.
// We need to keep the string because the C API expects us to own the string
// representation.
@@ -249,6 +252,11 @@ public:
/// @returns a string containing the module-scope inline assembly blocks.
const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; }
+ /// Get the RandomNumberGenerator for this module. The RNG can be
+ /// seeded via -rng-seed=<uint64> and is salted with the ModuleID.
+ /// The returned RNG should not be shared across threads.
+ RandomNumberGenerator &getRNG() const;
+
/// @}
/// @name Module Level Mutators
/// @{
diff --git a/include/llvm/Support/RandomNumberGenerator.h b/include/llvm/Support/RandomNumberGenerator.h
new file mode 100644
index 0000000000..1ec2c7eca9
--- /dev/null
+++ b/include/llvm/Support/RandomNumberGenerator.h
@@ -0,0 +1,54 @@
+//==- llvm/Support/RandomNumberGenerator.h - RNG for diversity ---*- C++ -*-==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines an abstraction for random number generation (RNG).
+// Note that the current implementation is not cryptographically secure
+// as it uses the C++11 <random> facilities.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_SUPPORT_RANDOMNUMBERGENERATOR_H_
+#define LLVM_SUPPORT_RANDOMNUMBERGENERATOR_H_
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/DataTypes.h" // Needed for uint64_t on Windows.
+#include <random>
+
+namespace llvm {
+
+/// A random number generator.
+/// Instances of this class should not be shared across threads.
+class RandomNumberGenerator {
+public:
+ /// Seeds and salts the underlying RNG engine. The salt of type StringRef
+ /// is passed into the constructor. The seed can be set on the command
+ /// line via -rng-seed=<uint64>.
+ /// The reason for the salt is to ensure different random streams even if
+ /// the same seed is used for multiple invocations of the compiler.
+ /// A good salt value should add additional entropy and be constant across
+ /// different machines (i.e., no paths) to allow for reproducible builds.
+ /// An instance of this class can be retrieved from the current Module.
+ /// \see Module::getRNG
+ RandomNumberGenerator(StringRef Salt);
+
+ /// Returns a random number in the range [0, Max).
+ uint64_t next(uint64_t Max);
+
+private:
+ // 64-bit Mersenne Twister by Matsumoto and Nishimura, 2000
+ // http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
+ std::mt19937_64 Generator;
+
+ // Noncopyable.
+ RandomNumberGenerator(const RandomNumberGenerator &other) = delete;
+ RandomNumberGenerator &operator=(const RandomNumberGenerator &other) = delete;
+};
+}
+
+#endif