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