1# 2# Copyright 2019 The Abseil Authors. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# https://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17# Internal-only implementation classes for Abseil Random 18load( 19 "//absl:copts/configure_copts.bzl", 20 "ABSL_DEFAULT_COPTS", 21 "ABSL_DEFAULT_LINKOPTS", 22 "ABSL_RANDOM_RANDEN_COPTS", 23 "ABSL_TEST_COPTS", 24 "absl_random_randen_copts_init", 25) 26 27default_package_visibility = [ 28 "//absl/random:__pkg__", 29] 30 31package( 32 default_visibility = default_package_visibility, 33 features = [ 34 "header_modules", 35 "layering_check", 36 "parse_headers", 37 ], 38) 39 40licenses(["notice"]) 41 42cc_library( 43 name = "traits", 44 hdrs = ["traits.h"], 45 copts = ABSL_DEFAULT_COPTS, 46 linkopts = ABSL_DEFAULT_LINKOPTS, 47 deps = [ 48 "//absl/base:config", 49 "//absl/numeric:bits", 50 "//absl/numeric:int128", 51 ], 52) 53 54cc_library( 55 name = "distribution_caller", 56 hdrs = ["distribution_caller.h"], 57 copts = ABSL_DEFAULT_COPTS, 58 linkopts = ABSL_DEFAULT_LINKOPTS, 59 deps = [ 60 "//absl/base:config", 61 "//absl/base:fast_type_id", 62 "//absl/meta:type_traits", 63 "//absl/utility", 64 ], 65) 66 67cc_library( 68 name = "fast_uniform_bits", 69 hdrs = [ 70 "fast_uniform_bits.h", 71 ], 72 copts = ABSL_DEFAULT_COPTS, 73 linkopts = ABSL_DEFAULT_LINKOPTS, 74 deps = [ 75 ":traits", 76 "//absl/base:config", 77 "//absl/meta:type_traits", 78 ], 79) 80 81cc_library( 82 name = "seed_material", 83 srcs = [ 84 "seed_material.cc", 85 ], 86 hdrs = [ 87 "seed_material.h", 88 ], 89 copts = ABSL_DEFAULT_COPTS, 90 linkopts = ABSL_DEFAULT_LINKOPTS + select({ 91 "//absl:msvc_compiler": ["-DEFAULTLIB:bcrypt.lib"], 92 "//absl:clang-cl_compiler": ["-DEFAULTLIB:bcrypt.lib"], 93 "//absl:mingw_compiler": [ 94 "-DEFAULTLIB:bcrypt.lib", 95 "-lbcrypt", 96 ], 97 "//conditions:default": [], 98 }), 99 deps = [ 100 ":fast_uniform_bits", 101 "//absl/base:core_headers", 102 "//absl/base:dynamic_annotations", 103 "//absl/base:raw_logging_internal", 104 "//absl/strings", 105 "//absl/types:optional", 106 "//absl/types:span", 107 ], 108) 109 110cc_library( 111 name = "pool_urbg", 112 srcs = [ 113 "pool_urbg.cc", 114 ], 115 hdrs = [ 116 "pool_urbg.h", 117 ], 118 copts = ABSL_DEFAULT_COPTS, 119 linkopts = select({ 120 "//absl:msvc_compiler": [], 121 "//absl:clang-cl_compiler": [], 122 "//absl:wasm": [], 123 "//conditions:default": ["-pthread"], 124 }) + ABSL_DEFAULT_LINKOPTS, 125 deps = [ 126 ":randen", 127 ":seed_material", 128 ":traits", 129 "//absl/base", 130 "//absl/base:config", 131 "//absl/base:core_headers", 132 "//absl/base:endian", 133 "//absl/base:raw_logging_internal", 134 "//absl/random:seed_gen_exception", 135 "//absl/types:span", 136 ], 137) 138 139cc_library( 140 name = "explicit_seed_seq", 141 testonly = True, 142 hdrs = [ 143 "explicit_seed_seq.h", 144 ], 145 copts = ABSL_DEFAULT_COPTS, 146 linkopts = ABSL_DEFAULT_LINKOPTS, 147 deps = [ 148 "//absl/base:config", 149 "//absl/base:endian", 150 ], 151) 152 153cc_library( 154 name = "sequence_urbg", 155 testonly = True, 156 hdrs = [ 157 "sequence_urbg.h", 158 ], 159 copts = ABSL_DEFAULT_COPTS, 160 linkopts = ABSL_DEFAULT_LINKOPTS, 161 deps = ["//absl/base:config"], 162) 163 164cc_library( 165 name = "salted_seed_seq", 166 hdrs = [ 167 "salted_seed_seq.h", 168 ], 169 copts = ABSL_DEFAULT_COPTS, 170 linkopts = ABSL_DEFAULT_LINKOPTS, 171 deps = [ 172 ":seed_material", 173 "//absl/container:inlined_vector", 174 "//absl/meta:type_traits", 175 "//absl/types:optional", 176 "//absl/types:span", 177 ], 178) 179 180cc_library( 181 name = "iostream_state_saver", 182 hdrs = ["iostream_state_saver.h"], 183 copts = ABSL_DEFAULT_COPTS, 184 linkopts = ABSL_DEFAULT_LINKOPTS, 185 deps = [ 186 "//absl/meta:type_traits", 187 "//absl/numeric:int128", 188 ], 189) 190 191cc_library( 192 name = "generate_real", 193 hdrs = [ 194 "generate_real.h", 195 ], 196 copts = ABSL_DEFAULT_COPTS, 197 linkopts = ABSL_DEFAULT_LINKOPTS, 198 deps = [ 199 ":fastmath", 200 ":traits", 201 "//absl/meta:type_traits", 202 "//absl/numeric:bits", 203 ], 204) 205 206cc_library( 207 name = "fastmath", 208 hdrs = [ 209 "fastmath.h", 210 ], 211 copts = ABSL_DEFAULT_COPTS, 212 linkopts = ABSL_DEFAULT_LINKOPTS, 213 deps = ["//absl/numeric:bits"], 214) 215 216cc_library( 217 name = "wide_multiply", 218 hdrs = ["wide_multiply.h"], 219 copts = ABSL_DEFAULT_COPTS, 220 linkopts = ABSL_DEFAULT_LINKOPTS, 221 deps = [ 222 ":traits", 223 "//absl/base:config", 224 "//absl/numeric:bits", 225 "//absl/numeric:int128", 226 ], 227) 228 229cc_library( 230 name = "nonsecure_base", 231 hdrs = ["nonsecure_base.h"], 232 copts = ABSL_DEFAULT_COPTS, 233 linkopts = ABSL_DEFAULT_LINKOPTS, 234 deps = [ 235 ":pool_urbg", 236 ":salted_seed_seq", 237 ":seed_material", 238 "//absl/base:core_headers", 239 "//absl/container:inlined_vector", 240 "//absl/meta:type_traits", 241 "//absl/types:span", 242 ], 243) 244 245cc_library( 246 name = "pcg_engine", 247 hdrs = ["pcg_engine.h"], 248 copts = ABSL_DEFAULT_COPTS, 249 linkopts = ABSL_DEFAULT_LINKOPTS, 250 deps = [ 251 ":fastmath", 252 ":iostream_state_saver", 253 "//absl/base:config", 254 "//absl/meta:type_traits", 255 "//absl/numeric:bits", 256 "//absl/numeric:int128", 257 ], 258) 259 260cc_library( 261 name = "randen_engine", 262 hdrs = ["randen_engine.h"], 263 copts = ABSL_DEFAULT_COPTS, 264 linkopts = ABSL_DEFAULT_LINKOPTS, 265 visibility = default_package_visibility + [ 266 ], 267 deps = [ 268 ":iostream_state_saver", 269 ":randen", 270 "//absl/base:endian", 271 "//absl/meta:type_traits", 272 ], 273) 274 275cc_library( 276 name = "platform", 277 srcs = [ 278 "randen_round_keys.cc", 279 ], 280 hdrs = [ 281 "randen_traits.h", 282 ], 283 copts = ABSL_DEFAULT_COPTS, 284 linkopts = ABSL_DEFAULT_LINKOPTS, 285 textual_hdrs = [ 286 "platform.h", 287 ], 288 deps = ["//absl/base:config"], 289) 290 291cc_library( 292 name = "randen", 293 srcs = [ 294 "randen.cc", 295 ], 296 hdrs = [ 297 "randen.h", 298 ], 299 copts = ABSL_DEFAULT_COPTS, 300 linkopts = ABSL_DEFAULT_LINKOPTS, 301 deps = [ 302 ":platform", 303 ":randen_hwaes", 304 ":randen_slow", 305 "//absl/base:raw_logging_internal", 306 ], 307) 308 309cc_library( 310 name = "randen_slow", 311 srcs = ["randen_slow.cc"], 312 hdrs = ["randen_slow.h"], 313 copts = ABSL_DEFAULT_COPTS, 314 linkopts = ABSL_DEFAULT_LINKOPTS, 315 deps = [ 316 ":platform", 317 "//absl/base:config", 318 "//absl/base:core_headers", 319 "//absl/base:endian", 320 "//absl/numeric:int128", 321 ], 322) 323 324absl_random_randen_copts_init() 325 326cc_library( 327 name = "randen_hwaes", 328 srcs = [ 329 "randen_detect.cc", 330 ], 331 hdrs = [ 332 "randen_detect.h", 333 "randen_hwaes.h", 334 ], 335 copts = ABSL_DEFAULT_COPTS, 336 linkopts = ABSL_DEFAULT_LINKOPTS, 337 deps = [ 338 ":platform", 339 ":randen_hwaes_impl", 340 "//absl/base:config", 341 ], 342) 343 344# build with --save_temps to see assembly language output. 345cc_library( 346 name = "randen_hwaes_impl", 347 srcs = [ 348 "randen_hwaes.cc", 349 "randen_hwaes.h", 350 ], 351 copts = ABSL_DEFAULT_COPTS + ABSL_RANDOM_RANDEN_COPTS + select({ 352 "//absl:msvc_compiler": [], 353 "//absl:clang-cl_compiler": [], 354 "//conditions:default": ["-Wno-pass-failed"], 355 }), 356 linkopts = ABSL_DEFAULT_LINKOPTS, 357 deps = [ 358 ":platform", 359 "//absl/base:config", 360 "//absl/base:core_headers", 361 "//absl/numeric:int128", 362 ], 363) 364 365cc_binary( 366 name = "gaussian_distribution_gentables", 367 srcs = [ 368 "gaussian_distribution_gentables.cc", 369 ], 370 linkopts = ABSL_DEFAULT_LINKOPTS, 371 deps = [ 372 "//absl/base:core_headers", 373 "//absl/random:distributions", 374 ], 375) 376 377cc_library( 378 name = "distribution_test_util", 379 testonly = True, 380 srcs = [ 381 "chi_square.cc", 382 "distribution_test_util.cc", 383 ], 384 hdrs = [ 385 "chi_square.h", 386 "distribution_test_util.h", 387 ], 388 copts = ABSL_DEFAULT_COPTS, 389 linkopts = ABSL_DEFAULT_LINKOPTS, 390 deps = [ 391 "//absl/base:config", 392 "//absl/base:core_headers", 393 "//absl/base:raw_logging_internal", 394 "//absl/strings", 395 "//absl/strings:str_format", 396 "//absl/types:span", 397 ], 398) 399 400# Common tags for tests, etc. 401ABSL_RANDOM_NONPORTABLE_TAGS = [ 402 "no_test_android_arm", 403 "no_test_android_arm64", 404 "no_test_android_x86", 405 "no_test_darwin_x86_64", 406 "no_test_ios_x86_64", 407 "no_test_loonix", 408 "no_test_lexan", 409 "no_test_wasm", 410] 411 412cc_test( 413 name = "traits_test", 414 size = "small", 415 srcs = ["traits_test.cc"], 416 copts = ABSL_TEST_COPTS, 417 linkopts = ABSL_DEFAULT_LINKOPTS, 418 deps = [ 419 ":traits", 420 "@com_google_googletest//:gtest", 421 "@com_google_googletest//:gtest_main", 422 ], 423) 424 425cc_test( 426 name = "generate_real_test", 427 size = "small", 428 srcs = [ 429 "generate_real_test.cc", 430 ], 431 copts = ABSL_TEST_COPTS, 432 linkopts = ABSL_DEFAULT_LINKOPTS, 433 deps = [ 434 ":generate_real", 435 "//absl/flags:flag", 436 "//absl/numeric:bits", 437 "@com_google_googletest//:gtest", 438 "@com_google_googletest//:gtest_main", 439 ], 440) 441 442cc_test( 443 name = "distribution_test_util_test", 444 size = "small", 445 srcs = ["distribution_test_util_test.cc"], 446 copts = ABSL_TEST_COPTS, 447 linkopts = ABSL_DEFAULT_LINKOPTS, 448 deps = [ 449 ":distribution_test_util", 450 "@com_google_googletest//:gtest", 451 "@com_google_googletest//:gtest_main", 452 ], 453) 454 455cc_test( 456 name = "fastmath_test", 457 size = "small", 458 srcs = ["fastmath_test.cc"], 459 copts = ABSL_TEST_COPTS, 460 linkopts = ABSL_DEFAULT_LINKOPTS, 461 deps = [ 462 ":fastmath", 463 "@com_google_googletest//:gtest", 464 "@com_google_googletest//:gtest_main", 465 ], 466) 467 468cc_test( 469 name = "explicit_seed_seq_test", 470 size = "small", 471 srcs = ["explicit_seed_seq_test.cc"], 472 copts = ABSL_TEST_COPTS, 473 linkopts = ABSL_DEFAULT_LINKOPTS, 474 deps = [ 475 ":explicit_seed_seq", 476 "//absl/random:seed_sequences", 477 "@com_google_googletest//:gtest", 478 "@com_google_googletest//:gtest_main", 479 ], 480) 481 482cc_test( 483 name = "salted_seed_seq_test", 484 size = "small", 485 srcs = ["salted_seed_seq_test.cc"], 486 copts = ABSL_TEST_COPTS, 487 linkopts = ABSL_DEFAULT_LINKOPTS, 488 deps = [ 489 ":salted_seed_seq", 490 "@com_google_googletest//:gtest", 491 "@com_google_googletest//:gtest_main", 492 ], 493) 494 495cc_test( 496 name = "chi_square_test", 497 size = "small", 498 srcs = [ 499 "chi_square_test.cc", 500 ], 501 copts = ABSL_TEST_COPTS, 502 linkopts = ABSL_DEFAULT_LINKOPTS, 503 deps = [ 504 ":distribution_test_util", 505 "//absl/base:core_headers", 506 "@com_google_googletest//:gtest", 507 "@com_google_googletest//:gtest_main", 508 ], 509) 510 511cc_test( 512 name = "fast_uniform_bits_test", 513 size = "small", 514 srcs = [ 515 "fast_uniform_bits_test.cc", 516 ], 517 copts = ABSL_TEST_COPTS, 518 linkopts = ABSL_DEFAULT_LINKOPTS, 519 deps = [ 520 ":fast_uniform_bits", 521 "@com_google_googletest//:gtest", 522 "@com_google_googletest//:gtest_main", 523 ], 524) 525 526cc_library( 527 name = "mock_helpers", 528 hdrs = ["mock_helpers.h"], 529 linkopts = ABSL_DEFAULT_LINKOPTS, 530 deps = [ 531 "//absl/base:config", 532 "//absl/base:fast_type_id", 533 "//absl/types:optional", 534 ], 535) 536 537cc_library( 538 name = "mock_overload_set", 539 testonly = True, 540 hdrs = ["mock_overload_set.h"], 541 linkopts = ABSL_DEFAULT_LINKOPTS, 542 deps = [ 543 ":mock_helpers", 544 "//absl/base:config", 545 "//absl/random:mocking_bit_gen", 546 "@com_google_googletest//:gtest", 547 ], 548) 549 550cc_test( 551 name = "nonsecure_base_test", 552 size = "small", 553 srcs = [ 554 "nonsecure_base_test.cc", 555 ], 556 copts = ABSL_TEST_COPTS, 557 linkopts = ABSL_DEFAULT_LINKOPTS, 558 deps = [ 559 ":nonsecure_base", 560 "//absl/random", 561 "//absl/random:distributions", 562 "//absl/random:seed_sequences", 563 "//absl/strings", 564 "@com_google_googletest//:gtest", 565 "@com_google_googletest//:gtest_main", 566 ], 567) 568 569cc_test( 570 name = "seed_material_test", 571 size = "small", 572 srcs = ["seed_material_test.cc"], 573 copts = ABSL_TEST_COPTS, 574 linkopts = ABSL_DEFAULT_LINKOPTS, 575 deps = [ 576 ":seed_material", 577 "@com_google_googletest//:gtest", 578 "@com_google_googletest//:gtest_main", 579 ], 580) 581 582cc_test( 583 name = "pool_urbg_test", 584 size = "small", 585 srcs = [ 586 "pool_urbg_test.cc", 587 ], 588 copts = ABSL_TEST_COPTS, 589 linkopts = ABSL_DEFAULT_LINKOPTS, 590 deps = [ 591 ":pool_urbg", 592 "//absl/meta:type_traits", 593 "//absl/types:span", 594 "@com_google_googletest//:gtest", 595 "@com_google_googletest//:gtest_main", 596 ], 597) 598 599cc_test( 600 name = "pcg_engine_test", 601 size = "medium", # Trying to measure accuracy. 602 srcs = ["pcg_engine_test.cc"], 603 copts = ABSL_TEST_COPTS, 604 flaky = 1, 605 linkopts = ABSL_DEFAULT_LINKOPTS, 606 deps = [ 607 ":explicit_seed_seq", 608 ":pcg_engine", 609 "//absl/time", 610 "@com_google_googletest//:gtest", 611 "@com_google_googletest//:gtest_main", 612 ], 613) 614 615cc_test( 616 name = "randen_engine_test", 617 size = "medium", 618 srcs = [ 619 "randen_engine_test.cc", 620 ], 621 copts = ABSL_TEST_COPTS, 622 linkopts = ABSL_DEFAULT_LINKOPTS, 623 deps = [ 624 ":explicit_seed_seq", 625 ":randen_engine", 626 "//absl/log", 627 "//absl/strings", 628 "//absl/time", 629 "@com_google_googletest//:gtest", 630 "@com_google_googletest//:gtest_main", 631 ], 632) 633 634cc_test( 635 name = "randen_test", 636 size = "small", 637 srcs = ["randen_test.cc"], 638 copts = ABSL_TEST_COPTS, 639 linkopts = ABSL_DEFAULT_LINKOPTS, 640 deps = [ 641 ":randen", 642 "//absl/meta:type_traits", 643 "@com_google_googletest//:gtest", 644 "@com_google_googletest//:gtest_main", 645 ], 646) 647 648cc_test( 649 name = "randen_slow_test", 650 size = "small", 651 srcs = ["randen_slow_test.cc"], 652 copts = ABSL_TEST_COPTS, 653 linkopts = ABSL_DEFAULT_LINKOPTS, 654 deps = [ 655 ":platform", 656 ":randen_slow", 657 "//absl/base:endian", 658 "@com_google_googletest//:gtest", 659 "@com_google_googletest//:gtest_main", 660 ], 661) 662 663cc_test( 664 name = "randen_hwaes_test", 665 size = "small", 666 srcs = ["randen_hwaes_test.cc"], 667 copts = ABSL_TEST_COPTS + ABSL_RANDOM_RANDEN_COPTS, 668 linkopts = ABSL_DEFAULT_LINKOPTS, 669 tags = ABSL_RANDOM_NONPORTABLE_TAGS, 670 deps = [ 671 ":platform", 672 ":randen_hwaes", 673 ":randen_hwaes_impl", # build_cleaner: keep 674 "//absl/log", 675 "//absl/strings:str_format", 676 "@com_google_googletest//:gtest", 677 ], 678) 679 680cc_test( 681 name = "wide_multiply_test", 682 size = "small", 683 srcs = ["wide_multiply_test.cc"], 684 copts = ABSL_TEST_COPTS, 685 linkopts = ABSL_DEFAULT_LINKOPTS, 686 deps = [ 687 ":wide_multiply", 688 "//absl/numeric:bits", 689 "//absl/numeric:int128", 690 "@com_google_googletest//:gtest", 691 "@com_google_googletest//:gtest_main", 692 ], 693) 694 695cc_library( 696 name = "nanobenchmark", 697 srcs = ["nanobenchmark.cc"], 698 linkopts = ABSL_DEFAULT_LINKOPTS, 699 textual_hdrs = ["nanobenchmark.h"], 700 deps = [ 701 ":platform", 702 ":randen_engine", 703 "//absl/base:config", 704 "//absl/base:core_headers", 705 "//absl/base:raw_logging_internal", 706 ], 707) 708 709cc_library( 710 name = "uniform_helper", 711 hdrs = ["uniform_helper.h"], 712 copts = ABSL_DEFAULT_COPTS, 713 linkopts = ABSL_DEFAULT_LINKOPTS, 714 deps = [ 715 ":traits", 716 "//absl/base:config", 717 "//absl/meta:type_traits", 718 ], 719) 720 721cc_library( 722 name = "mock_validators", 723 hdrs = ["mock_validators.h"], 724 deps = [ 725 ":iostream_state_saver", 726 ":uniform_helper", 727 "//absl/base:config", 728 "//absl/base:raw_logging_internal", 729 "//absl/strings", 730 "//absl/strings:string_view", 731 ], 732) 733 734cc_test( 735 name = "nanobenchmark_test", 736 size = "small", 737 srcs = ["nanobenchmark_test.cc"], 738 flaky = 1, 739 linkopts = ABSL_DEFAULT_LINKOPTS, 740 tags = [ 741 "benchmark", 742 "no_test_ios_x86_64", 743 "no_test_loonix", # Crashing. 744 "no_test_wasm", 745 ], 746 deps = [ 747 ":nanobenchmark", 748 "//absl/log", 749 "//absl/log:check", 750 "//absl/strings", 751 "//absl/strings:str_format", 752 ], 753) 754 755cc_test( 756 name = "randen_benchmarks", 757 size = "medium", 758 timeout = "long", 759 srcs = ["randen_benchmarks.cc"], 760 copts = ABSL_TEST_COPTS + ABSL_RANDOM_RANDEN_COPTS, 761 flaky = 1, 762 linkopts = ABSL_DEFAULT_LINKOPTS, 763 tags = ABSL_RANDOM_NONPORTABLE_TAGS + ["benchmark"], 764 deps = [ 765 ":nanobenchmark", 766 ":platform", 767 ":randen", 768 ":randen_engine", 769 ":randen_hwaes", 770 ":randen_hwaes_impl", 771 ":randen_slow", 772 "//absl/base:raw_logging_internal", 773 "//absl/strings", 774 ], 775) 776 777cc_test( 778 name = "iostream_state_saver_test", 779 srcs = ["iostream_state_saver_test.cc"], 780 linkopts = ABSL_DEFAULT_LINKOPTS, 781 deps = [ 782 ":iostream_state_saver", 783 "@com_google_googletest//:gtest", 784 "@com_google_googletest//:gtest_main", 785 ], 786) 787 788cc_test( 789 name = "uniform_helper_test", 790 size = "small", 791 srcs = ["uniform_helper_test.cc"], 792 copts = ABSL_TEST_COPTS, 793 linkopts = ABSL_DEFAULT_LINKOPTS, 794 deps = [ 795 ":uniform_helper", 796 "@com_google_googletest//:gtest", 797 "@com_google_googletest//:gtest_main", 798 ], 799) 800