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