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