[llvm] r211145 - Random Number Generator (llvm)

JF Bastien jfb at google.com
Tue Jun 17 23:43:42 PDT 2014


This is broken, reverting and letting Julian investigate.


On Tue, Jun 17, 2014 at 11:23 PM, JF Bastien <jfb at google.com> wrote:

> Author: jfb
> Date: Wed Jun 18 01:23:25 2014
> New Revision: 211145
>
> URL: http://llvm.org/viewvc/llvm-project?rev=211145&view=rev
> Log:
> Random Number Generator (llvm)
>
> Summary:
> 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
>
> Reviewers: ahomescu, rinon, nicholas, jfb
>
> Reviewed By: jfb
>
> Subscribers: jfb, perl
>
> Differential Revision: http://reviews.llvm.org/D3390
>
> Added:
>     llvm/trunk/include/llvm/Support/RandomNumberGenerator.h   (with props)
>     llvm/trunk/lib/Support/RandomNumberGenerator.cpp   (with props)
> Modified:
>     llvm/trunk/include/llvm/IR/Module.h
>     llvm/trunk/lib/IR/Module.cpp
>     llvm/trunk/lib/Support/CMakeLists.txt
>
> Modified: llvm/trunk/include/llvm/IR/Module.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Module.h?rev=211145&r1=211144&r2=211145&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Module.h (original)
> +++ llvm/trunk/include/llvm/IR/Module.h Wed Jun 18 01:23:25 2014
> @@ -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
>  /// @{
>
> Added: llvm/trunk/include/llvm/Support/RandomNumberGenerator.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/RandomNumberGenerator.h?rev=211145&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/RandomNumberGenerator.h (added)
> +++ llvm/trunk/include/llvm/Support/RandomNumberGenerator.h Wed Jun 18
> 01:23:25 2014
> @@ -0,0 +1,53 @@
> +//==- 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 <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
>
> Propchange: llvm/trunk/include/llvm/Support/RandomNumberGenerator.h
>
> ------------------------------------------------------------------------------
>     svn:eol-style = LF
>
> Modified: llvm/trunk/lib/IR/Module.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Module.cpp?rev=211145&r1=211144&r2=211145&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/Module.cpp (original)
> +++ llvm/trunk/lib/IR/Module.cpp Wed Jun 18 01:23:25 2014
> @@ -24,6 +24,8 @@
>  #include "llvm/IR/LLVMContext.h"
>  #include "llvm/IR/LeakDetector.h"
>  #include "llvm/Support/Dwarf.h"
> +#include "llvm/Support/Path.h"
> +#include "llvm/Support/RandomNumberGenerator.h"
>  #include <algorithm>
>  #include <cstdarg>
>  #include <cstdlib>
> @@ -44,7 +46,7 @@ template class llvm::SymbolTableListTrai
>  //
>
>  Module::Module(StringRef MID, LLVMContext &C)
> -    : Context(C), Materializer(), ModuleID(MID), DL("") {
> +    : Context(C), Materializer(), ModuleID(MID), RNG(nullptr), DL("") {
>    ValSymTab = new ValueSymbolTable();
>    NamedMDSymTab = new StringMap<NamedMDNode *>();
>    Context.addModule(this);
> @@ -59,6 +61,7 @@ Module::~Module() {
>    NamedMDList.clear();
>    delete ValSymTab;
>    delete static_cast<StringMap<NamedMDNode *> *>(NamedMDSymTab);
> +  delete RNG;
>  }
>
>  /// getNamedValue - Return the first global value in the module with
> @@ -355,6 +358,16 @@ const DataLayout *Module::getDataLayout(
>    return &DL;
>  }
>
> +// We want reproducible builds, but ModuleID may be a full path so we
> just use
> +// the filename to salt the RNG (although it is not guaranteed to be
> unique).
> +RandomNumberGenerator &Module::getRNG() const {
> +  if (RNG == nullptr) {
> +    StringRef Salt = sys::path::filename(ModuleID);
> +    RNG = new RandomNumberGenerator(Salt);
> +  }
> +  return *RNG;
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // Methods to control the materialization of GlobalValues in the Module.
>  //
>
> Modified: llvm/trunk/lib/Support/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CMakeLists.txt?rev=211145&r1=211144&r2=211145&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/CMakeLists.txt (original)
> +++ llvm/trunk/lib/Support/CMakeLists.txt Wed Jun 18 01:23:25 2014
> @@ -41,6 +41,7 @@ add_llvm_library(LLVMSupport
>    MD5.cpp
>    PluginLoader.cpp
>    PrettyStackTrace.cpp
> +  RandomNumberGenerator.cpp
>    Regex.cpp
>    SmallPtrSet.cpp
>    SmallVector.cpp
>
> Added: llvm/trunk/lib/Support/RandomNumberGenerator.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/RandomNumberGenerator.cpp?rev=211145&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/Support/RandomNumberGenerator.cpp (added)
> +++ llvm/trunk/lib/Support/RandomNumberGenerator.cpp Wed Jun 18 01:23:25
> 2014
> @@ -0,0 +1,52 @@
> +//===-- RandomNumberGenerator.cpp - Implement RNG class
> -------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements random number generation (RNG).
> +// The current implementation is NOT cryptographically secure as it uses
> +// the C++11 <random> facilities.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#define DEBUG_TYPE "rng"
> +#include "llvm/Support/RandomNumberGenerator.h"
> +#include "llvm/Support/CommandLine.h"
> +#include "llvm/Support/Debug.h"
> +
> +using namespace llvm;
> +
> +// Tracking BUG: 19665
> +// http://llvm.org/bugs/show_bug.cgi?id=19665
> +//
> +// Do not change to cl::opt<uint64_t> since this silently breaks argument
> parsing.
> +static cl::opt<unsigned long long>
> +Seed("rng-seed", cl::value_desc("seed"),
> +     cl::desc("Seed for the random number generator"), cl::init(0));
> +
> +RandomNumberGenerator::RandomNumberGenerator(StringRef Salt) {
> +  DEBUG(
> +    if (Seed == 0)
> +      errs() << "Warning! Using unseeded random number generator.\n"
> +  );
> +
> +  // Combine seed and salt using std::seed_seq.
> +  // Entropy: Seed-low, Seed-high, Salt...
> +  size_t Size = Salt.size() + 2;
> +  uint32_t Data[Size];
> +  Data[0] = Seed;
> +  Data[1] = Seed >> 32;
> +  std::copy_n(Salt.begin(), Salt.size(), Data + 2);
> +
> +  std::seed_seq SeedSeq(Data, Data + Size);
> +  Generator.seed(SeedSeq);
> +}
> +
> +uint64_t RandomNumberGenerator::next(uint64_t Max) {
> +  std::uniform_int_distribution<uint64_t> distribution(0, Max - 1);
> +  return distribution(Generator);
> +}
>
> Propchange: llvm/trunk/lib/Support/RandomNumberGenerator.cpp
>
> ------------------------------------------------------------------------------
>     svn:eol-style = LF
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140617/40585b1c/attachment.html>


More information about the llvm-commits mailing list