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:fast_type_id", 531 "//absl/types:optional", 532 ], 533) 534 535cc_library( 536 name = "mock_overload_set", 537 testonly = True, 538 hdrs = ["mock_overload_set.h"], 539 linkopts = ABSL_DEFAULT_LINKOPTS, 540 deps = [ 541 ":mock_helpers", 542 "//absl/random:mocking_bit_gen", 543 "@com_google_googletest//:gtest", 544 ], 545) 546 547cc_test( 548 name = "nonsecure_base_test", 549 size = "small", 550 srcs = [ 551 "nonsecure_base_test.cc", 552 ], 553 copts = ABSL_TEST_COPTS, 554 linkopts = ABSL_DEFAULT_LINKOPTS, 555 deps = [ 556 ":nonsecure_base", 557 "//absl/random", 558 "//absl/random:distributions", 559 "//absl/random:seed_sequences", 560 "//absl/strings", 561 "@com_google_googletest//:gtest", 562 "@com_google_googletest//:gtest_main", 563 ], 564) 565 566cc_test( 567 name = "seed_material_test", 568 size = "small", 569 srcs = ["seed_material_test.cc"], 570 copts = ABSL_TEST_COPTS, 571 linkopts = ABSL_DEFAULT_LINKOPTS, 572 deps = [ 573 ":seed_material", 574 "@com_google_googletest//:gtest", 575 "@com_google_googletest//:gtest_main", 576 ], 577) 578 579cc_test( 580 name = "pool_urbg_test", 581 size = "small", 582 srcs = [ 583 "pool_urbg_test.cc", 584 ], 585 copts = ABSL_TEST_COPTS, 586 linkopts = ABSL_DEFAULT_LINKOPTS, 587 deps = [ 588 ":pool_urbg", 589 "//absl/meta:type_traits", 590 "//absl/types:span", 591 "@com_google_googletest//:gtest", 592 "@com_google_googletest//:gtest_main", 593 ], 594) 595 596cc_test( 597 name = "pcg_engine_test", 598 size = "medium", # Trying to measure accuracy. 599 srcs = ["pcg_engine_test.cc"], 600 copts = ABSL_TEST_COPTS, 601 flaky = 1, 602 linkopts = ABSL_DEFAULT_LINKOPTS, 603 deps = [ 604 ":explicit_seed_seq", 605 ":pcg_engine", 606 "//absl/time", 607 "@com_google_googletest//:gtest", 608 "@com_google_googletest//:gtest_main", 609 ], 610) 611 612cc_test( 613 name = "randen_engine_test", 614 size = "medium", 615 srcs = [ 616 "randen_engine_test.cc", 617 ], 618 copts = ABSL_TEST_COPTS, 619 linkopts = ABSL_DEFAULT_LINKOPTS, 620 deps = [ 621 ":explicit_seed_seq", 622 ":randen_engine", 623 "//absl/log", 624 "//absl/strings", 625 "//absl/time", 626 "@com_google_googletest//:gtest", 627 "@com_google_googletest//:gtest_main", 628 ], 629) 630 631cc_test( 632 name = "randen_test", 633 size = "small", 634 srcs = ["randen_test.cc"], 635 copts = ABSL_TEST_COPTS, 636 linkopts = ABSL_DEFAULT_LINKOPTS, 637 deps = [ 638 ":randen", 639 "//absl/meta:type_traits", 640 "@com_google_googletest//:gtest", 641 "@com_google_googletest//:gtest_main", 642 ], 643) 644 645cc_test( 646 name = "randen_slow_test", 647 size = "small", 648 srcs = ["randen_slow_test.cc"], 649 copts = ABSL_TEST_COPTS, 650 linkopts = ABSL_DEFAULT_LINKOPTS, 651 deps = [ 652 ":platform", 653 ":randen_slow", 654 "//absl/base:endian", 655 "@com_google_googletest//:gtest", 656 "@com_google_googletest//:gtest_main", 657 ], 658) 659 660cc_test( 661 name = "randen_hwaes_test", 662 size = "small", 663 srcs = ["randen_hwaes_test.cc"], 664 copts = ABSL_TEST_COPTS + ABSL_RANDOM_RANDEN_COPTS, 665 linkopts = ABSL_DEFAULT_LINKOPTS, 666 tags = ABSL_RANDOM_NONPORTABLE_TAGS, 667 deps = [ 668 ":platform", 669 ":randen_hwaes", 670 ":randen_hwaes_impl", # build_cleaner: keep 671 "//absl/log", 672 "//absl/strings:str_format", 673 "@com_google_googletest//:gtest", 674 ], 675) 676 677cc_test( 678 name = "wide_multiply_test", 679 size = "small", 680 srcs = ["wide_multiply_test.cc"], 681 copts = ABSL_TEST_COPTS, 682 linkopts = ABSL_DEFAULT_LINKOPTS, 683 deps = [ 684 ":wide_multiply", 685 "//absl/numeric:bits", 686 "//absl/numeric:int128", 687 "@com_google_googletest//:gtest", 688 "@com_google_googletest//:gtest_main", 689 ], 690) 691 692cc_library( 693 name = "nanobenchmark", 694 srcs = ["nanobenchmark.cc"], 695 linkopts = ABSL_DEFAULT_LINKOPTS, 696 textual_hdrs = ["nanobenchmark.h"], 697 deps = [ 698 ":platform", 699 ":randen_engine", 700 "//absl/base:config", 701 "//absl/base:core_headers", 702 "//absl/base:raw_logging_internal", 703 ], 704) 705 706cc_library( 707 name = "uniform_helper", 708 hdrs = ["uniform_helper.h"], 709 copts = ABSL_DEFAULT_COPTS, 710 linkopts = ABSL_DEFAULT_LINKOPTS, 711 deps = [ 712 ":traits", 713 "//absl/base:config", 714 "//absl/meta:type_traits", 715 "//absl/numeric:int128", 716 ], 717) 718 719cc_test( 720 name = "nanobenchmark_test", 721 size = "small", 722 srcs = ["nanobenchmark_test.cc"], 723 flaky = 1, 724 linkopts = ABSL_DEFAULT_LINKOPTS, 725 tags = [ 726 "benchmark", 727 "no_test_ios_x86_64", 728 "no_test_loonix", # Crashing. 729 "no_test_wasm", 730 ], 731 deps = [ 732 ":nanobenchmark", 733 "//absl/log", 734 "//absl/log:check", 735 "//absl/strings", 736 "//absl/strings:str_format", 737 ], 738) 739 740cc_test( 741 name = "randen_benchmarks", 742 size = "medium", 743 timeout = "long", 744 srcs = ["randen_benchmarks.cc"], 745 copts = ABSL_TEST_COPTS + ABSL_RANDOM_RANDEN_COPTS, 746 flaky = 1, 747 linkopts = ABSL_DEFAULT_LINKOPTS, 748 tags = ABSL_RANDOM_NONPORTABLE_TAGS + ["benchmark"], 749 deps = [ 750 ":nanobenchmark", 751 ":platform", 752 ":randen", 753 ":randen_engine", 754 ":randen_hwaes", 755 ":randen_hwaes_impl", 756 ":randen_slow", 757 "//absl/base:raw_logging_internal", 758 "//absl/strings", 759 ], 760) 761 762cc_test( 763 name = "iostream_state_saver_test", 764 srcs = ["iostream_state_saver_test.cc"], 765 linkopts = ABSL_DEFAULT_LINKOPTS, 766 deps = [ 767 ":iostream_state_saver", 768 "@com_google_googletest//:gtest", 769 "@com_google_googletest//:gtest_main", 770 ], 771) 772 773cc_test( 774 name = "uniform_helper_test", 775 size = "small", 776 srcs = ["uniform_helper_test.cc"], 777 copts = ABSL_TEST_COPTS, 778 linkopts = ABSL_DEFAULT_LINKOPTS, 779 deps = [ 780 ":uniform_helper", 781 "@com_google_googletest//:gtest", 782 "@com_google_googletest//:gtest_main", 783 ], 784) 785