Duncan P. N. Exon Smith | f1f27bb | 2016-08-30 16:23:55 +0000 | [diff] [blame] | 1 | //===- unittests/IR/ModuleTest.cpp - Module unit tests --------------------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
Duncan P. N. Exon Smith | f1f27bb | 2016-08-30 16:23:55 +0000 | [diff] [blame] | 10 | #include "llvm/IR/Module.h" |
Chandler Carruth | 3c0d607 | 2017-06-06 11:06:56 +0000 | [diff] [blame] | 11 | #include "llvm/IR/GlobalVariable.h" |
Mehdi Amini | 6a59bc7 | 2016-10-11 07:13:01 +0000 | [diff] [blame] | 12 | #include "llvm/Support/RandomNumberGenerator.h" |
Duncan P. N. Exon Smith | f1f27bb | 2016-08-30 16:23:55 +0000 | [diff] [blame] | 13 | #include "gtest/gtest.h" |
| 14 | |
Mehdi Amini | 6a59bc7 | 2016-10-11 07:13:01 +0000 | [diff] [blame] | 15 | #include <random> |
| 16 | |
Duncan P. N. Exon Smith | f1f27bb | 2016-08-30 16:23:55 +0000 | [diff] [blame] | 17 | using namespace llvm; |
| 18 | |
| 19 | namespace { |
| 20 | |
| 21 | bool sortByName(const GlobalVariable &L, const GlobalVariable &R) { |
| 22 | return L.getName() < R.getName(); |
| 23 | } |
| 24 | |
| 25 | bool sortByNameReverse(const GlobalVariable &L, const GlobalVariable &R) { |
| 26 | return sortByName(R, L); |
| 27 | } |
| 28 | |
| 29 | TEST(ModuleTest, sortGlobalsByName) { |
| 30 | LLVMContext Context; |
Duncan P. N. Exon Smith | b161c80 | 2016-08-30 17:34:58 +0000 | [diff] [blame] | 31 | for (auto compare : {&sortByName, &sortByNameReverse}) { |
Duncan P. N. Exon Smith | f1f27bb | 2016-08-30 16:23:55 +0000 | [diff] [blame] | 32 | Module M("M", Context); |
| 33 | Type *T = Type::getInt8Ty(Context); |
| 34 | GlobalValue::LinkageTypes L = GlobalValue::ExternalLinkage; |
| 35 | (void)new GlobalVariable(M, T, false, L, nullptr, "A"); |
| 36 | (void)new GlobalVariable(M, T, false, L, nullptr, "F"); |
| 37 | (void)new GlobalVariable(M, T, false, L, nullptr, "G"); |
| 38 | (void)new GlobalVariable(M, T, false, L, nullptr, "E"); |
| 39 | (void)new GlobalVariable(M, T, false, L, nullptr, "B"); |
| 40 | (void)new GlobalVariable(M, T, false, L, nullptr, "H"); |
| 41 | (void)new GlobalVariable(M, T, false, L, nullptr, "C"); |
| 42 | (void)new GlobalVariable(M, T, false, L, nullptr, "D"); |
| 43 | |
| 44 | // Sort the globals by name. |
| 45 | EXPECT_FALSE(std::is_sorted(M.global_begin(), M.global_end(), compare)); |
| 46 | M.getGlobalList().sort(compare); |
| 47 | EXPECT_TRUE(std::is_sorted(M.global_begin(), M.global_end(), compare)); |
| 48 | } |
| 49 | } |
| 50 | |
Mehdi Amini | 6a59bc7 | 2016-10-11 07:13:01 +0000 | [diff] [blame] | 51 | TEST(ModuleTest, randomNumberGenerator) { |
| 52 | LLVMContext Context; |
| 53 | static char ID; |
| 54 | struct DummyPass : ModulePass { |
| 55 | DummyPass() : ModulePass(ID) {} |
| 56 | bool runOnModule(Module &) { return true; } |
| 57 | } DP; |
| 58 | |
| 59 | Module M("R", Context); |
| 60 | |
| 61 | std::uniform_int_distribution<int> dist; |
Reid Kleckner | ef587f5 | 2016-10-11 18:35:13 +0000 | [diff] [blame] | 62 | const size_t NBCheck = 10; |
Mehdi Amini | 6a59bc7 | 2016-10-11 07:13:01 +0000 | [diff] [blame] | 63 | |
| 64 | std::array<int, NBCheck> RandomStreams[2]; |
| 65 | for (auto &RandomStream : RandomStreams) { |
Serge Guelton | fbec1c9 | 2017-07-12 08:03:44 +0000 | [diff] [blame] | 66 | std::unique_ptr<RandomNumberGenerator> RNG = M.createRNG(&DP); |
Mehdi Amini | 6a59bc7 | 2016-10-11 07:13:01 +0000 | [diff] [blame] | 67 | std::generate(RandomStream.begin(), RandomStream.end(), |
| 68 | [&]() { return dist(*RNG); }); |
| 69 | } |
| 70 | |
| 71 | EXPECT_TRUE(std::equal(RandomStreams[0].begin(), RandomStreams[0].end(), |
| 72 | RandomStreams[1].begin())); |
| 73 | } |
| 74 | |
Duncan P. N. Exon Smith | f1f27bb | 2016-08-30 16:23:55 +0000 | [diff] [blame] | 75 | } // end namespace |