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