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