## Purpose This patch is one in a series of code-mods that annotate LLVM’s public interface for export. This patch annotates the `llvm/Support` library. These annotations currently have no meaningful impact on the LLVM build; however, they are a prerequisite to support an LLVM Windows DLL (shared library) build. ## Background This effort is tracked in #109483. Additional context is provided in [this discourse](https://discourse.llvm.org/t/psa-annotating-llvm-public-interface/85307), and documentation for `LLVM_ABI` and related annotations is found in the LLVM repo [here](https://github.com/llvm/llvm-project/blob/main/llvm/docs/InterfaceExportAnnotations.rst). The bulk of these changes were generated automatically using the [Interface Definition Scanner (IDS)](https://github.com/compnerd/ids) tool, followed formatting with `git clang-format`. The following manual adjustments were also applied after running IDS on Linux: - Add `#include "llvm/Support/Compiler.h"` to files where it was not auto-added by IDS due to no pre-existing block of include statements. - Add `LLVM_ABI` to Windows-only code (auto generated with IDS on Windows) - Explicitly make classes non-copyable where needed to due IDS adding `LLVM_ABI` at the class level - Add `LLVM_TEMPLATE_ABI` and `LLVM_EXPORT_TEMPLATE` to exported instantiated templates - Add `LLVM_ABI_FRIEND` to a small number of `friend` function declarations - Add `LLVM_ABI` to a subset of private class methods and fields that require export - Add `LLVM_ABI` to a small number of symbols that require export but are not declared in headers - Add `LLVM_ABI` functions defined via X-macro ## Validation Local builds and tests to validate cross-platform compatibility. This included llvm, clang, and lldb on the following configurations: - Windows with MSVC - Windows with Clang - Linux with GCC - Linux with Clang - Darwin with Clang
70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
//==- llvm/Support/RandomNumberGenerator.h - RNG for diversity ---*- C++ -*-==//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines an abstraction for deterministic 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/Support/Compiler.h"
|
|
#include "llvm/Support/DataTypes.h" // Needed for uint64_t on Windows.
|
|
#include <random>
|
|
#include <system_error>
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
|
|
/// A random number generator.
|
|
///
|
|
/// Instances of this class should not be shared across threads. The
|
|
/// seed should be set by passing the -rng-seed=<uint64> option. Use
|
|
/// Module::createRNG to create a new RNG instance for use with that
|
|
/// module.
|
|
class RandomNumberGenerator {
|
|
|
|
// 64-bit Mersenne Twister by Matsumoto and Nishimura, 2000
|
|
// http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
|
|
// This RNG is deterministically portable across C++11
|
|
// implementations.
|
|
using generator_type = std::mt19937_64;
|
|
|
|
public:
|
|
using result_type = generator_type::result_type;
|
|
|
|
/// Returns a random number in the range [0, Max).
|
|
LLVM_ABI result_type operator()();
|
|
|
|
static constexpr result_type min() { return generator_type::min(); }
|
|
static constexpr result_type max() { return generator_type::max(); }
|
|
|
|
private:
|
|
/// Seeds and salts the underlying RNG engine.
|
|
///
|
|
/// This constructor should not be used directly. Instead use
|
|
/// Module::createRNG to create a new RNG salted with the Module ID.
|
|
RandomNumberGenerator(StringRef Salt);
|
|
|
|
generator_type Generator;
|
|
|
|
// Noncopyable.
|
|
RandomNumberGenerator(const RandomNumberGenerator &other) = delete;
|
|
RandomNumberGenerator &operator=(const RandomNumberGenerator &other) = delete;
|
|
|
|
friend class Module;
|
|
};
|
|
|
|
// Get random vector of specified size
|
|
LLVM_ABI std::error_code getRandomBytes(void *Buffer, size_t Size);
|
|
}
|
|
|
|
#endif
|