• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2023 The Pigweed Authors
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4# use this file except in compliance with the License. You may obtain a copy of
5# the License at
6#
7#     https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations under
13# the License.
14
15include($ENV{PW_ROOT}/pw_build/pigweed.cmake)
16
17# The core target of this module.
18
19pw_add_library(pw_allocator STATIC
20  HEADERS
21    public/pw_allocator/allocator.h
22    public/pw_allocator/capability.h
23    public/pw_allocator/deallocator.h
24    public/pw_allocator/internal/managed_ptr.h
25    public/pw_allocator/layout.h
26    public/pw_allocator/pool.h
27    public/pw_allocator/unique_ptr.h
28  PUBLIC_INCLUDES
29    public
30  PUBLIC_DEPS
31    pw_allocator.config
32    pw_allocator.hardening
33    pw_numeric.checked_arithmetic
34    pw_bytes
35    pw_preprocessor
36    pw_status
37    pw_result
38  PRIVATE_DEPS
39    pw_assert
40    pw_bytes.alignment
41    pw_third_party.fuchsia.stdcompat
42  SOURCES
43    allocator.cc
44    managed_ptr.cc
45)
46
47# Module configuration
48
49pw_add_module_config(pw_allocator_CONFIG)
50
51pw_add_library(pw_allocator.config INTERFACE
52  HEADERS
53    public/pw_allocator/config.h
54  PUBLIC_INCLUDES
55    public
56  PUBLIC_DEPS
57    ${pw_allocator_CONFIG}
58)
59
60pw_add_library(pw_allocator.test_config INTERFACE
61  PUBLIC_DEFINES
62    PW_ALLOCATOR_HARDENING=PW_ALLOCATOR_HARDENING_DEBUG
63    PW_ALLOCATOR_BLOCK_POISON_INTERVAL=4
64)
65
66# Libraries
67
68# TODO(b/376730645): Remove deprecated alias.
69pw_add_library(pw_allocator.allocator INTERFACE
70  PUBLIC_DEPS
71    pw_allocator
72)
73
74pw_add_library(pw_allocator.allocator_as_pool STATIC
75  HEADERS
76    public/pw_allocator/allocator_as_pool.h
77  PUBLIC_INCLUDES
78    public
79  PUBLIC_DEPS
80    pw_allocator
81    pw_status
82  SOURCES
83    allocator_as_pool.cc
84)
85
86pw_add_library(pw_allocator.best_fit INTERFACE
87  HEADERS
88    public/pw_allocator/best_fit.h
89  PUBLIC_INCLUDES
90    public
91  PUBLIC_DEPS
92    pw_allocator.block_allocator
93    pw_allocator.block.detailed_block
94    pw_allocator.bucket.sorted
95    pw_allocator.bucket.fast_sorted
96    pw_allocator.config
97)
98
99pw_add_library(pw_allocator.best_fit_block_allocator INTERFACE
100  HEADERS
101    public/pw_allocator/best_fit_block_allocator.h
102  PUBLIC_INCLUDES
103    public
104  PUBLIC_DEPS
105    pw_allocator.best_fit
106    pw_allocator.config
107)
108
109# TODO(b/376730645): Deprecated; use pw_allocator.block.detailed_block or
110# similar instead.
111pw_add_library(pw_allocator.block INTERFACE
112  PUBLIC_DEPS
113    pw_allocator.block.detailed_block
114)
115
116pw_add_library(pw_allocator.block_allocator STATIC
117  HEADERS
118    public/pw_allocator/block_allocator.h
119  PUBLIC_INCLUDES
120    public
121  PUBLIC_DEPS
122    pw_allocator
123    pw_allocator.config
124    pw_allocator.block.allocatable
125    pw_allocator.block.basic
126    pw_allocator.block.iterable
127    pw_allocator.block.result
128    pw_allocator.block.poisonable
129    pw_allocator.block.with_layout
130    pw_allocator.fragmentation
131    pw_allocator.hardening
132    pw_bytes
133    pw_result
134    pw_status
135  PRIVATE_DEPS
136    pw_assert
137  SOURCES
138    block_allocator.cc
139)
140
141pw_add_library(pw_allocator.bucket_allocator INTERFACE
142  HEADERS
143    public/pw_allocator/bucket_allocator.h
144  PUBLIC_INCLUDES
145    public
146  PUBLIC_DEPS
147    pw_allocator.block_allocator
148    pw_allocator.block.detailed_block
149    pw_allocator.bucket.unordered
150    pw_status
151)
152
153# TODO(b/376730645): Remove deprecated interfaces.
154pw_add_library(pw_allocator.bucket_block_allocator INTERFACE
155  PUBLIC_DEPS
156    pw_allocator.bucket_allocator
157)
158
159pw_add_library(pw_allocator.buddy_allocator STATIC
160  HEADERS
161    public/pw_allocator/buddy_allocator.h
162  PUBLIC_INCLUDES
163    public
164  PUBLIC_DEPS
165    pw_allocator
166    pw_allocator.block.basic
167    pw_allocator.bucket.unordered
168    pw_allocator.hardening
169    pw_bytes
170    pw_containers.vector
171    pw_status
172  PRIVATE_DEPS
173    pw_assert
174    pw_third_party.fuchsia.stdcompat
175  SOURCES
176    buddy_allocator.cc
177)
178
179pw_add_library(pw_allocator.buffer INTERFACE
180  HEADERS
181    public/pw_allocator/buffer.h
182  PUBLIC_INCLUDES
183    public
184  PUBLIC_DEPS
185    pw_bytes
186    pw_result
187)
188
189pw_add_library(pw_allocator.bump_allocator STATIC
190  HEADERS
191    public/pw_allocator/bump_allocator.h
192  PUBLIC_INCLUDES
193    public
194  PUBLIC_DEPS
195    pw_allocator
196    pw_bytes
197  PRIVATE_DEPS
198    pw_allocator.buffer
199    pw_bytes.alignment
200  SOURCES
201    bump_allocator.cc
202)
203
204pw_add_library(pw_allocator.chunk_pool STATIC
205  HEADERS
206    public/pw_allocator/chunk_pool.h
207  PUBLIC_INCLUDES
208    public
209  PUBLIC_DEPS
210    pw_allocator
211    pw_bytes
212    pw_result
213    pw_status
214  PRIVATE_DEPS
215    pw_allocator.buffer
216    pw_bytes.alignment
217    pw_assert.check
218    pw_third_party.fuchsia.stdcompat
219  SOURCES
220    chunk_pool.cc
221)
222
223# TODO(b/376730645): Remove deprecated alias.
224pw_add_library(pw_allocator.deallocator INTERFACE
225  PUBLIC_DEPS
226    pw_allocator
227)
228
229pw_add_library(pw_allocator.dl_allocator INTERFACE
230  HEADERS
231    public/pw_allocator/dl_allocator.h
232  PUBLIC_INCLUDES
233    public
234  PUBLIC_DEPS
235    pw_allocator.block_allocator
236    pw_allocator.block.detailed_block
237    pw_allocator.bucket.fast_sorted
238    pw_allocator.bucket.unordered
239    pw_allocator.config
240    pw_third_party.fuchsia.stdcompat
241)
242
243  # TODO(b/376730645): Remove deprecated interfaces.
244pw_add_library(pw_allocator.dual_first_fit_block_allocator INTERFACE
245  HEADERS
246    public/pw_allocator/dual_first_fit_block_allocator.h
247  PUBLIC_INCLUDES
248    public
249  PUBLIC_DEPS
250    pw_allocator.first_fit
251)
252
253pw_add_library(pw_allocator.fallback_allocator STATIC
254  SOURCES
255    fallback_allocator.cc
256  HEADERS
257    public/pw_allocator/fallback_allocator.h
258  PUBLIC_INCLUDES
259    public
260  PUBLIC_DEPS
261    pw_allocator
262    pw_result
263    pw_status
264  PRIVATE_DEPS
265    pw_assert.check
266)
267
268pw_add_library(pw_allocator.first_fit INTERFACE
269  HEADERS
270    public/pw_allocator/first_fit.h
271  PUBLIC_INCLUDES
272    public
273  PUBLIC_DEPS
274    pw_allocator.block_allocator
275    pw_allocator.config
276    pw_allocator.block.detailed_block
277    pw_allocator.bucket.sequenced
278)
279
280# TODO(b/376730645): Remove deprecated interfaces.
281pw_add_library(pw_allocator.first_fit_block_allocator INTERFACE
282  HEADERS
283    public/pw_allocator/first_fit_block_allocator.h
284  PUBLIC_INCLUDES
285    public
286  PUBLIC_DEPS
287    pw_allocator.first_fit
288)
289
290pw_add_library(pw_allocator.fragmentation STATIC
291  HEADERS
292    public/pw_allocator/fragmentation.h
293  PUBLIC_INCLUDES
294    public
295  SOURCES
296    fragmentation.cc
297)
298
299pw_add_library(pw_allocator.freelist_heap INTERFACE
300  HEADERS
301    public/pw_allocator/freelist_heap.h
302  PUBLIC_INCLUDES
303    public
304  PUBLIC_DEPS
305    pw_allocator.bucket_allocator
306    pw_allocator.hardening
307    pw_bytes
308)
309
310pw_add_library(pw_allocator.hardening INTERFACE
311  HEADERS
312    public/pw_allocator/hardening.h
313  PUBLIC_INCLUDES
314    public
315  PUBLIC_DEPS
316    pw_allocator.config
317    pw_assert
318    pw_preprocessor
319)
320
321# TODO(b/376730645): Remove deprecated interfaces.
322pw_add_library(pw_allocator.last_fit_block_allocator INTERFACE
323  HEADERS
324    public/pw_allocator/last_fit_block_allocator.h
325  PUBLIC_INCLUDES
326    public
327  PUBLIC_DEPS
328    pw_allocator.first_fit
329)
330
331pw_add_library(pw_allocator.libc_allocator STATIC
332  SOURCES
333    libc_allocator.cc
334  HEADERS
335    public/pw_allocator/libc_allocator.h
336  PUBLIC_INCLUDES
337    public
338  PUBLIC_DEPS
339    pw_allocator
340)
341
342pw_add_library(pw_allocator.null_allocator STATIC
343  SOURCES
344    null_allocator.cc
345  HEADERS
346    public/pw_allocator/null_allocator.h
347  PUBLIC_INCLUDES
348    public
349  PUBLIC_DEPS
350    pw_allocator
351)
352
353pw_add_library(pw_allocator.metrics INTERFACE
354  HEADERS
355    public/pw_allocator/metrics.h
356  PUBLIC_INCLUDES
357    public
358  PUBLIC_DEPS
359    pw_allocator
360    pw_metric
361)
362
363pw_add_library(pw_allocator.pmr_allocator STATIC
364  HEADERS
365    public/pw_allocator/pmr_allocator.h
366  PUBLIC_INCLUDES
367    public
368  PUBLIC_DEPS
369    pw_allocator
370    pw_allocator.config
371    pw_assert
372    pw_status
373    SOURCES
374    pmr_allocator.cc
375)
376
377# TODO(b/376730645): Remove deprecated alias.
378pw_add_library(pw_allocator.pool INTERFACE
379  PUBLIC_DEPS
380    pw_allocator
381)
382
383pw_add_library(pw_allocator.synchronized_allocator INTERFACE
384  HEADERS
385    public/pw_allocator/synchronized_allocator.h
386  PUBLIC_INCLUDES
387    public
388  PUBLIC_DEPS
389    pw_allocator
390    pw_sync.borrow
391    pw_sync.lock_annotations
392)
393
394pw_add_library(pw_allocator.tlsf_allocator INTERFACE
395  HEADERS
396    public/pw_allocator/tlsf_allocator.h
397  PUBLIC_INCLUDES
398    public
399  PUBLIC_DEPS
400    pw_allocator.block_allocator
401    pw_allocator.block.detailed_block
402    pw_allocator.bucket.sorted
403    pw_allocator.bucket.fast_sorted
404    pw_allocator.config
405    pw_third_party.fuchsia.stdcompat
406)
407
408pw_add_library(pw_allocator.tracking_allocator INTERFACE
409  HEADERS
410    public/pw_allocator/tracking_allocator.h
411  PUBLIC_INCLUDES
412    public
413  PUBLIC_DEPS
414    pw_allocator
415    pw_allocator.metrics
416    pw_status
417  PRIVATE_DEPS
418    pw_assert
419)
420
421pw_add_library(pw_allocator.typed_pool INTERFACE
422  HEADERS
423    public/pw_allocator/typed_pool.h
424  PUBLIC_INCLUDES
425    public
426  PUBLIC_DEPS
427    pw_allocator.chunk_pool
428    pw_allocator.hardening
429    pw_bytes
430)
431
432pw_add_library(pw_allocator.worst_fit INTERFACE
433  HEADERS
434    public/pw_allocator/worst_fit.h
435  PUBLIC_INCLUDES
436    public
437  PUBLIC_DEPS
438    pw_allocator.block_allocator
439    pw_allocator.block.detailed_block
440    pw_allocator.bucket.sorted
441    pw_allocator.bucket.fast_sorted
442    pw_allocator.config
443)
444
445pw_add_library(pw_allocator.worst_fit_block_allocator INTERFACE
446  HEADERS
447    public/pw_allocator/worst_fit_block_allocator.h
448  PUBLIC_INCLUDES
449    public
450  PUBLIC_DEPS
451    pw_allocator.worst_fit
452    pw_allocator.config
453)
454
455
456# Test support
457
458pw_add_library(pw_allocator.testing INTERFACE
459  HEADERS
460    public/pw_allocator/testing.h
461  PUBLIC_INCLUDES
462    public
463  PUBLIC_DEPS
464    pw_allocator
465    pw_allocator.buffer
466    pw_allocator.first_fit
467    pw_allocator.hardening
468    pw_allocator.test_config
469    pw_allocator.tracking_allocator
470    pw_bytes
471    pw_result
472    pw_status
473    pw_unit_test
474  PRIVATE_DEPS
475    pw_assert
476)
477
478pw_add_library(pw_allocator.block_allocator_testing STATIC
479  HEADERS
480    public/pw_allocator/block_allocator_testing.h
481  PUBLIC_INCLUDES
482    public
483  PUBLIC_DEPS
484    pw_allocator
485    pw_allocator.block.testing
486    pw_allocator.block_allocator
487    pw_allocator.block.detailed_block
488    pw_allocator.buffer
489    pw_allocator.fuzzing
490    pw_allocator.test_harness
491    pw_unit_test
492  PRIVATE_DEPS
493    pw_assert
494    pw_bytes.alignment
495    pw_status
496    pw_third_party.fuchsia.stdcompat
497  SOURCES
498    block_allocator_testing.cc
499)
500
501pw_add_library(pw_allocator.managed_ptr_testing STATIC
502  HEADERS
503    public/pw_allocator/internal/managed_ptr_testing.h
504  PUBLIC_INCLUDES
505    public
506  PUBLIC_DEPS
507    pw_allocator
508    pw_allocator.testing
509    pw_unit_test
510  SOURCES
511    managed_ptr_testing.cc
512)
513
514pw_add_library(pw_allocator.test_harness STATIC
515  HEADERS
516    public/pw_allocator/test_harness.h
517  PUBLIC_INCLUDES
518    public
519  PUBLIC_DEPS
520    pw_allocator
521    pw_containers.intrusive_list
522    pw_containers.vector
523    pw_random
524  PRIVATE_DEPS
525    pw_assert
526    pw_third_party.fuchsia.stdcompat
527  SOURCES
528    test_harness.cc
529)
530
531pw_add_library(pw_allocator.fuzzing STATIC
532  HEADERS
533    public/pw_allocator/fuzzing.h
534  PUBLIC_INCLUDES
535    public
536  PUBLIC_DEPS
537    pw_allocator
538    pw_allocator.test_harness
539    pw_fuzzer.fuzztest
540  SOURCES
541    fuzzing.cc
542)
543
544# Tests
545
546pw_add_test(pw_allocator.allocator_as_pool_test
547  SOURCES
548    allocator_as_pool_test.cc
549  PRIVATE_DEPS
550    pw_allocator
551    pw_allocator.allocator_as_pool
552    pw_allocator.testing
553  GROUPS
554    modules
555    pw_allocator
556)
557
558pw_add_test(pw_allocator.allocator_test
559  SOURCES
560    allocator_test.cc
561  PRIVATE_DEPS
562    pw_allocator
563    pw_allocator.testing
564  GROUPS
565    modules
566    pw_allocator
567)
568
569pw_add_test(pw_allocator.best_fit_test
570  SOURCES
571    best_fit_test.cc
572  PRIVATE_DEPS
573    pw_allocator.best_fit
574    pw_allocator.best_fit_block_allocator
575    pw_allocator.block_allocator_testing
576    pw_allocator.buffer
577  GROUPS
578    modules
579    pw_allocator
580)
581
582pw_add_test(pw_allocator.bucket_allocator_test
583  SOURCES
584    bucket_allocator_test.cc
585  PRIVATE_DEPS
586    pw_allocator
587    pw_allocator.block_allocator_testing
588    pw_allocator.bucket_allocator
589    pw_allocator.bucket_block_allocator
590  GROUPS
591    modules
592    pw_allocator
593)
594
595pw_add_test(pw_allocator.buddy_allocator_test
596  SOURCES
597    buddy_allocator_test.cc
598  PRIVATE_DEPS
599    pw_allocator.buddy_allocator
600    pw_allocator.fuzzing
601    pw_allocator.testing
602  GROUPS
603    modules
604    pw_allocator
605)
606
607pw_add_test(pw_allocator.buffer_test
608  SOURCES
609    buffer_test.cc
610  PRIVATE_DEPS
611    pw_allocator.buffer
612    pw_allocator.testing
613    pw_bytes
614    pw_result
615    pw_third_party.fuchsia.stdcompat
616  GROUPS
617    modules
618    pw_allocator
619)
620
621pw_add_test(pw_allocator.bump_allocator_test
622  SOURCES
623    bump_allocator_test.cc
624  PRIVATE_DEPS
625    pw_allocator.bump_allocator
626    pw_allocator.testing
627    pw_third_party.fuchsia.stdcompat
628  GROUPS
629    modules
630    pw_allocator
631)
632
633pw_add_test(pw_allocator.chunk_pool_test
634  SOURCES
635    chunk_pool_test.cc
636  PRIVATE_DEPS
637    pw_allocator.chunk_pool
638    pw_allocator.testing
639  GROUPS
640    modules
641    pw_allocator
642)
643
644pw_add_test(pw_allocator.dl_allocator_test
645  SOURCES
646    dl_allocator_test.cc
647  PRIVATE_DEPS
648    pw_allocator.block_allocator_testing
649    pw_allocator.dl_allocator
650  GROUPS
651    modules
652    pw_allocator
653)
654
655pw_add_test(pw_allocator.fallback_allocator_test
656  PRIVATE_DEPS
657    pw_allocator.testing
658    pw_allocator.fallback_allocator
659    pw_status
660  SOURCES
661    fallback_allocator_test.cc
662  GROUPS
663    modules
664    pw_allocator
665)
666
667pw_add_test(pw_allocator.first_fit_test
668  SOURCES
669    first_fit_test.cc
670  PRIVATE_DEPS
671    pw_allocator.block_allocator_testing
672    pw_allocator.buffer
673    pw_allocator.dual_first_fit_block_allocator
674    pw_allocator.first_fit
675    pw_allocator.first_fit_block_allocator
676    pw_allocator.last_fit_block_allocator
677    pw_third_party.fuchsia.stdcompat
678  GROUPS
679    modules
680    pw_allocator
681)
682
683pw_add_test(pw_allocator.fragmentation_test
684  SOURCES
685    fragmentation_test.cc
686  PRIVATE_DEPS
687    pw_allocator.fragmentation
688    pw_allocator.testing
689  GROUPS
690    modules
691    pw_allocator
692)
693
694pw_add_test(pw_allocator.freelist_heap_test
695  SOURCES
696    freelist_heap_test.cc
697  PRIVATE_DEPS
698    pw_allocator.block.testing
699    pw_allocator.freelist_heap
700    pw_allocator.testing
701    pw_bytes.alignment
702    pw_third_party.fuchsia.stdcompat
703  GROUPS
704    modules
705    pw_allocator
706)
707
708pw_add_test(pw_allocator.layout_test
709  SOURCES
710    layout_test.cc
711  PRIVATE_DEPS
712    pw_allocator
713    pw_allocator.testing
714    pw_result
715    pw_status
716  GROUPS
717    modules
718    pw_allocator
719)
720
721pw_add_test(pw_allocator.libc_allocator_test
722  SOURCES
723    libc_allocator_test.cc
724  PRIVATE_DEPS
725    pw_allocator.libc_allocator
726    pw_allocator.testing
727    pw_unit_test
728  GROUPS
729    modules
730    pw_allocator
731)
732
733pw_add_test(pw_allocator.metrics_test
734  SOURCES
735    metrics_test.cc
736  PRIVATE_DEPS
737    pw_allocator.metrics
738    pw_unit_test
739  GROUPS
740    modules
741    pw_allocator
742)
743
744pw_add_test(pw_allocator.null_allocator_test
745  SOURCES
746    null_allocator_test.cc
747  PRIVATE_DEPS
748    pw_allocator.null_allocator
749    pw_allocator.testing
750    pw_unit_test
751  GROUPS
752    modules
753    pw_allocator
754)
755
756pw_add_test(pw_allocator.pmr_allocator_test
757  SOURCES
758    pmr_allocator_test.cc
759  PRIVATE_DEPS
760    pw_allocator.pmr_allocator
761    pw_allocator.testing
762    pw_unit_test
763  GROUPS
764    modules
765    pw_allocator
766)
767
768pw_add_test(pw_allocator.synchronized_allocator_test
769  SOURCES
770    synchronized_allocator_test.cc
771  PRIVATE_DEPS
772    pw_allocator.testing
773    pw_allocator.test_harness
774    pw_allocator.synchronized_allocator
775    pw_containers.vector
776    pw_random
777    pw_status
778    pw_sync.binary_semaphore
779    pw_sync.interrupt_spin_lock
780    pw_sync.mutex
781    pw_thread.test_thread_context
782    pw_thread.thread
783    pw_thread.thread_core
784    pw_thread.yield
785  GROUPS
786    modules
787    pw_allocator
788)
789
790pw_add_test(pw_allocator.tlsf_allocator_test
791  SOURCES
792    tlsf_allocator_test.cc
793  PRIVATE_DEPS
794    pw_allocator.block_allocator_testing
795    pw_allocator.tlsf_allocator
796  GROUPS
797    modules
798    pw_allocator
799)
800
801pw_add_test(pw_allocator.tracking_allocator_test
802  SOURCES
803    tracking_allocator_test.cc
804  PRIVATE_DEPS
805    pw_allocator
806    pw_allocator.first_fit
807    pw_allocator.metrics
808    pw_allocator.testing
809    pw_allocator.tracking_allocator
810    pw_log
811    pw_metric
812  GROUPS
813    modules
814    pw_allocator
815)
816
817pw_add_test(pw_allocator.typed_pool_test
818  SOURCES
819    typed_pool_test.cc
820  PRIVATE_DEPS
821    pw_allocator
822    pw_allocator.testing
823    pw_allocator.typed_pool
824    pw_bytes.alignment
825    pw_unit_test
826  GROUPS
827    modules
828    pw_allocator
829)
830
831pw_add_test(pw_allocator.unique_ptr_test
832  SOURCES
833    unique_ptr_test.cc
834  PRIVATE_DEPS
835    pw_allocator
836    pw_allocator.managed_ptr_testing
837  GROUPS
838    modules
839    pw_allocator
840)
841
842pw_add_test(pw_allocator.worst_fit_test
843  SOURCES
844    worst_fit_test.cc
845  PRIVATE_DEPS
846    pw_allocator.block_allocator_testing
847    pw_allocator.worst_fit
848    pw_allocator.worst_fit_block_allocator
849  GROUPS
850    modules
851    pw_allocator
852)
853
854add_subdirectory(benchmarks)
855add_subdirectory(block)
856add_subdirectory(bucket)
857add_subdirectory(examples)
858