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