set_property(DIRECTORY . PROPERTY FOLDER "bmalloc")

set(bmalloc_PRIVATE_INCLUDE_DIRECTORIES
    "${BMALLOC_DIR}"
    "${BMALLOC_DIR}/bmalloc"
    "${BMALLOC_DIR}/libpas/src/libpas"
)

set(bmalloc_SOURCES
    bmalloc/AllIsoHeaps.cpp
    bmalloc/Allocator.cpp
    bmalloc/AvailableMemory.cpp
    bmalloc/Cache.cpp
    bmalloc/CryptoRandom.cpp
    bmalloc/Deallocator.cpp
    bmalloc/DebugHeap.cpp
    bmalloc/Environment.cpp
    bmalloc/FreeList.cpp
    bmalloc/Gigacage.cpp
    bmalloc/Heap.cpp
    bmalloc/HeapConstants.cpp
    bmalloc/HeapKind.cpp
    bmalloc/IsoHeap.cpp
    bmalloc/IsoHeapImpl.cpp
    bmalloc/IsoMallocFallback.cpp
    bmalloc/IsoPage.cpp
    bmalloc/IsoSharedHeap.cpp
    bmalloc/IsoSharedPage.cpp
    bmalloc/IsoTLS.cpp
    bmalloc/IsoTLSEntry.cpp
    bmalloc/IsoTLSLayout.cpp
    bmalloc/LargeMap.cpp
    bmalloc/Logging.cpp
    bmalloc/Mutex.cpp
    bmalloc/ObjectType.cpp
    bmalloc/ObjectTypeTable.cpp
    bmalloc/PerProcess.cpp
    bmalloc/Scavenger.cpp
    bmalloc/TZoneHeap.cpp
    bmalloc/TZoneHeapManager.cpp
    bmalloc/bmalloc.cpp

    libpas/src/libpas/bmalloc_heap.c
    libpas/src/libpas/bmalloc_heap_config.c
    libpas/src/libpas/jit_heap.c
    libpas/src/libpas/pas_bitfit_page_config_kind.c
    libpas/src/libpas/pas_heap_config_kind.c
    libpas/src/libpas/pas_segregated_page_config_kind.c
)

set_source_files_properties(
    libpas/src/libpas/bmalloc_heap.c
    libpas/src/libpas/bmalloc_heap_config.c
    libpas/src/libpas/jit_heap.c
    libpas/src/libpas/pas_bitfit_page_config_kind.c
    libpas/src/libpas/pas_heap_config_kind.c
    libpas/src/libpas/pas_segregated_page_config_kind.c
    PROPERTIES LANGUAGE CXX
)

set(bmalloc_C_SOURCES
    libpas/src/libpas/bmalloc_type.c
    libpas/src/libpas/hotbit_heap.c
    libpas/src/libpas/hotbit_heap_config.c
    libpas/src/libpas/iso_heap.c
    libpas/src/libpas/iso_heap_config.c
    libpas/src/libpas/iso_test_heap.c
    libpas/src/libpas/iso_test_heap_config.c
    libpas/src/libpas/jit_heap_config.c
    libpas/src/libpas/minalign32_heap.c
    libpas/src/libpas/minalign32_heap_config.c
    libpas/src/libpas/pagesize64k_heap.c
    libpas/src/libpas/pagesize64k_heap_config.c
    libpas/src/libpas/pas_alignment.c
    libpas/src/libpas/pas_all_heaps.c
    libpas/src/libpas/pas_all_shared_page_directories.c
    libpas/src/libpas/pas_allocation_callbacks.c
    libpas/src/libpas/pas_allocation_result.c
    libpas/src/libpas/pas_baseline_allocator.c
    libpas/src/libpas/pas_baseline_allocator_table.c
    libpas/src/libpas/pas_basic_heap_config_enumerator_data.c
    libpas/src/libpas/pas_bitfit_allocator.c
    libpas/src/libpas/pas_bitfit_directory.c
    libpas/src/libpas/pas_bitfit_heap.c
    libpas/src/libpas/pas_bitfit_page.c
    libpas/src/libpas/pas_bitfit_size_class.c
    libpas/src/libpas/pas_bitfit_view.c
    libpas/src/libpas/pas_bootstrap_free_heap.c
    libpas/src/libpas/pas_bootstrap_heap_page_provider.c
    libpas/src/libpas/pas_coalign.c
    libpas/src/libpas/pas_commit_span.c
    libpas/src/libpas/pas_committed_pages_vector.c
    libpas/src/libpas/pas_compact_bootstrap_free_heap.c
    libpas/src/libpas/pas_compact_expendable_memory.c
    libpas/src/libpas/pas_compact_heap_reservation.c
    libpas/src/libpas/pas_compact_large_utility_free_heap.c
    libpas/src/libpas/pas_compute_summary_object_callbacks.c
    libpas/src/libpas/pas_create_basic_heap_page_caches_with_reserved_memory.c
    libpas/src/libpas/pas_deallocate.c
    libpas/src/libpas/pas_debug_spectrum.c
    libpas/src/libpas/pas_deferred_decommit_log.c
    libpas/src/libpas/pas_designated_intrinsic_heap.c
    libpas/src/libpas/pas_dyld_state.c
    libpas/src/libpas/pas_dynamic_primitive_heap_map.c
    libpas/src/libpas/pas_ensure_heap_forced_into_reserved_memory.c
    libpas/src/libpas/pas_ensure_heap_with_page_caches.c
    libpas/src/libpas/pas_enumerable_page_malloc.c
    libpas/src/libpas/pas_enumerable_range_list.c
    libpas/src/libpas/pas_enumerate_bitfit_heaps.c
    libpas/src/libpas/pas_enumerate_initially_unaccounted_pages.c
    libpas/src/libpas/pas_enumerate_large_heaps.c
    libpas/src/libpas/pas_enumerate_segregated_heaps.c
    libpas/src/libpas/pas_enumerate_unaccounted_pages_as_meta.c
    libpas/src/libpas/pas_enumerator.c
    libpas/src/libpas/pas_enumerator_region.c
    libpas/src/libpas/pas_epoch.c
    libpas/src/libpas/pas_exclusive_view_template_memo_table.c
    libpas/src/libpas/pas_expendable_memory.c
    libpas/src/libpas/pas_extended_gcd.c
    libpas/src/libpas/pas_fast_large_free_heap.c
    libpas/src/libpas/pas_fast_megapage_cache.c
    libpas/src/libpas/pas_fast_megapage_table.c
    libpas/src/libpas/pas_fd_stream.c
    libpas/src/libpas/pas_free_granules.c
    libpas/src/libpas/pas_heap.c
    libpas/src/libpas/pas_heap_config.c
    libpas/src/libpas/pas_heap_config_utils.c
    libpas/src/libpas/pas_heap_for_config.c
    libpas/src/libpas/pas_heap_lock.c
    libpas/src/libpas/pas_heap_ref.c
    libpas/src/libpas/pas_heap_runtime_config.c
    libpas/src/libpas/pas_heap_summary.c
    libpas/src/libpas/pas_heap_table.c
    libpas/src/libpas/pas_immortal_heap.c
    libpas/src/libpas/pas_large_expendable_memory.c
    libpas/src/libpas/pas_large_free_heap_deferred_commit_log.c
    libpas/src/libpas/pas_large_free_heap_helpers.c
    libpas/src/libpas/pas_large_heap.c
    libpas/src/libpas/pas_large_heap_physical_page_sharing_cache.c
    libpas/src/libpas/pas_large_map.c
    libpas/src/libpas/pas_large_sharing_pool.c
    libpas/src/libpas/pas_large_utility_free_heap.c
    libpas/src/libpas/pas_lenient_compact_unsigned_ptr.c
    libpas/src/libpas/pas_local_allocator.c
    libpas/src/libpas/pas_local_allocator_scavenger_data.c
    libpas/src/libpas/pas_local_view_cache.c
    libpas/src/libpas/pas_lock.c
    libpas/src/libpas/pas_lock_free_read_ptr_ptr_hashtable.c
    libpas/src/libpas/pas_log.c
    libpas/src/libpas/pas_malloc_stack_logging.c
    libpas/src/libpas/pas_medium_megapage_cache.c
    libpas/src/libpas/pas_megapage_cache.c
    libpas/src/libpas/pas_monotonic_time.c
    libpas/src/libpas/pas_page_base.c
    libpas/src/libpas/pas_page_base_config.c
    libpas/src/libpas/pas_page_header_table.c
    libpas/src/libpas/pas_page_malloc.c
    libpas/src/libpas/pas_page_sharing_participant.c
    libpas/src/libpas/pas_page_sharing_pool.c
    libpas/src/libpas/pas_payload_reservation_page_list.c
    libpas/src/libpas/pas_physical_memory_transaction.c
    libpas/src/libpas/pas_primitive_heap_ref.c
    libpas/src/libpas/pas_probabilistic_guard_malloc_allocator.c
    libpas/src/libpas/pas_ptr_worklist.c
    libpas/src/libpas/pas_race_test_hooks.c
    libpas/src/libpas/pas_random.c
    libpas/src/libpas/pas_red_black_tree.c
    libpas/src/libpas/pas_redundant_local_allocator_node.c
    libpas/src/libpas/pas_report_crash.c
    libpas/src/libpas/pas_reserved_memory_provider.c
    libpas/src/libpas/pas_root.c
    libpas/src/libpas/pas_scavenger.c
    libpas/src/libpas/pas_segregated_directory.c
    libpas/src/libpas/pas_segregated_exclusive_view.c
    libpas/src/libpas/pas_segregated_heap.c
    libpas/src/libpas/pas_segregated_page.c
    libpas/src/libpas/pas_segregated_page_config.c
    libpas/src/libpas/pas_segregated_page_config_kind_and_role.c
    libpas/src/libpas/pas_segregated_partial_view.c
    libpas/src/libpas/pas_segregated_shared_handle.c
    libpas/src/libpas/pas_segregated_shared_page_directory.c
    libpas/src/libpas/pas_segregated_shared_view.c
    libpas/src/libpas/pas_segregated_size_directory.c
    libpas/src/libpas/pas_segregated_view.c
    libpas/src/libpas/pas_shared_page_directory_by_size.c
    libpas/src/libpas/pas_simple_free_heap_helpers.c
    libpas/src/libpas/pas_simple_large_free_heap.c
    libpas/src/libpas/pas_simple_type.c
    libpas/src/libpas/pas_small_medium_bootstrap_free_heap.c
    libpas/src/libpas/pas_small_medium_bootstrap_heap_page_provider.c
    libpas/src/libpas/pas_status_reporter.c
    libpas/src/libpas/pas_stream.c
    libpas/src/libpas/pas_string_stream.c
    libpas/src/libpas/pas_thread_local_cache.c
    libpas/src/libpas/pas_thread_local_cache_layout.c
    libpas/src/libpas/pas_thread_local_cache_layout_node.c
    libpas/src/libpas/pas_thread_local_cache_node.c
    libpas/src/libpas/pas_thread_suspend_lock.c
    libpas/src/libpas/pas_utility_heap.c
    libpas/src/libpas/pas_utility_heap_config.c
    libpas/src/libpas/pas_utils.c
    libpas/src/libpas/pas_versioned_field.c
    libpas/src/libpas/pas_virtual_range.c
    libpas/src/libpas/thingy_heap.c
    libpas/src/libpas/thingy_heap_config.c
)

set(bmalloc_PUBLIC_HEADERS
    bmalloc/Algorithm.h
    bmalloc/AllIsoHeaps.h
    bmalloc/AllIsoHeapsInlines.h
    bmalloc/AllocationCounts.h
    bmalloc/CompactAllocationMode.h
    bmalloc/Allocator.h
    bmalloc/AvailableMemory.h
    bmalloc/BAssert.h
    bmalloc/BCompiler.h
    bmalloc/BExport.h
    bmalloc/BInline.h
    bmalloc/BMalloced.h
    bmalloc/BPlatform.h
    bmalloc/BSyscall.h
    bmalloc/BVMTags.h
    bmalloc/Bits.h
    bmalloc/BulkDecommit.h
    bmalloc/BumpAllocator.h
    bmalloc/BumpRange.h
    bmalloc/Cache.h
    bmalloc/Chunk.h
    bmalloc/CryptoRandom.h
    bmalloc/Deallocator.h
    bmalloc/DebugHeap.h
    bmalloc/DeferredDecommit.h
    bmalloc/DeferredDecommitInlines.h
    bmalloc/DeferredTrigger.h
    bmalloc/DeferredTriggerInlines.h
    bmalloc/EligibilityResult.h
    bmalloc/EligibilityResultInlines.h
    bmalloc/Environment.h
    bmalloc/FailureAction.h
    bmalloc/FixedVector.h
    bmalloc/FreeList.h
    bmalloc/FreeListInlines.h
    bmalloc/Gigacage.h
    bmalloc/GigacageConfig.h
    bmalloc/GigacageKind.h
    bmalloc/Heap.h
    bmalloc/HeapConstants.h
    bmalloc/HeapKind.h
    bmalloc/IsoAllocator.h
    bmalloc/IsoAllocatorInlines.h
    bmalloc/IsoConfig.h
    bmalloc/IsoDeallocator.h
    bmalloc/IsoDeallocatorInlines.h
    bmalloc/IsoDirectory.h
    bmalloc/IsoDirectoryInlines.h
    bmalloc/IsoDirectoryPage.h
    bmalloc/IsoDirectoryPageInlines.h
    bmalloc/IsoHeap.h
    bmalloc/IsoHeapImpl.h
    bmalloc/IsoHeapImplInlines.h
    bmalloc/IsoHeapInlines.h
    bmalloc/IsoMallocFallback.h
    bmalloc/IsoPage.h
    bmalloc/IsoPageInlines.h
    bmalloc/IsoPageTrigger.h
    bmalloc/IsoSharedConfig.h
    bmalloc/IsoSharedHeap.h
    bmalloc/IsoSharedHeapInlines.h
    bmalloc/IsoSharedPage.h
    bmalloc/IsoSharedPageInlines.h
    bmalloc/IsoTLS.h
    bmalloc/IsoTLSAllocatorEntry.h
    bmalloc/IsoTLSAllocatorEntryInlines.h
    bmalloc/IsoTLSDeallocatorEntry.h
    bmalloc/IsoTLSDeallocatorEntryInlines.h
    bmalloc/IsoTLSEntry.h
    bmalloc/IsoTLSEntryInlines.h
    bmalloc/IsoTLSInlines.h
    bmalloc/IsoTLSLayout.h
    bmalloc/LargeMap.h
    bmalloc/LargeRange.h
    bmalloc/LineMetadata.h
    bmalloc/List.h
    bmalloc/Logging.h
    bmalloc/Map.h
    bmalloc/Mutex.h
    bmalloc/Object.h
    bmalloc/ObjectType.h
    bmalloc/ObjectTypeTable.h
    bmalloc/Packed.h
    bmalloc/PerHeapKind.h
    bmalloc/PerProcess.h
    bmalloc/PerThread.h
    bmalloc/PhysicalPageMap.h
    bmalloc/ProcessCheck.h
    bmalloc/Range.h
    bmalloc/Scavenger.h
    bmalloc/ScopeExit.h
    bmalloc/SegmentedVector.h
    bmalloc/Sizes.h
    bmalloc/SmallLine.h
    bmalloc/SmallPage.h
    bmalloc/StaticPerProcess.h
    bmalloc/TZoneHeap.h
    bmalloc/TZoneHeapInlines.h
    bmalloc/TZoneHeapManager.h
    bmalloc/VMAllocate.h
    bmalloc/Vector.h
    bmalloc/Zone.h
    bmalloc/bmalloc.h
    bmalloc/valgrind.h

    libpas/src/libpas/bmalloc_heap_config.h
    libpas/src/libpas/bmalloc_heap.h
    libpas/src/libpas/bmalloc_heap_inlines.h
    libpas/src/libpas/bmalloc_heap_innards.h
    libpas/src/libpas/bmalloc_heap_ref.h
    libpas/src/libpas/bmalloc_type.h
    libpas/src/libpas/hotbit_heap_config.h
    libpas/src/libpas/hotbit_heap.h
    libpas/src/libpas/hotbit_heap_inlines.h
    libpas/src/libpas/hotbit_heap_innards.h
    libpas/src/libpas/iso_heap_config.h
    libpas/src/libpas/iso_heap.h
    libpas/src/libpas/iso_heap_inlines.h
    libpas/src/libpas/iso_heap_innards.h
    libpas/src/libpas/iso_heap_ref.h
    libpas/src/libpas/iso_test_heap_config.h
    libpas/src/libpas/iso_test_heap.h
    libpas/src/libpas/jit_heap_config.h
    libpas/src/libpas/jit_heap_config_root_data.h
    libpas/src/libpas/jit_heap.h
    libpas/src/libpas/minalign32_heap_config.h
    libpas/src/libpas/minalign32_heap.h
    libpas/src/libpas/pagesize64k_heap_config.h
    libpas/src/libpas/pagesize64k_heap.h
    libpas/src/libpas/pas_aligned_allocation_result.h
    libpas/src/libpas/pas_aligned_allocator.h
    libpas/src/libpas/pas_alignment.h
    libpas/src/libpas/pas_all_heap_configs.h
    libpas/src/libpas/pas_all_heaps.h
    libpas/src/libpas/pas_allocation_callbacks.h
    libpas/src/libpas/pas_allocation_config.h
    libpas/src/libpas/pas_allocation_kind.h
    libpas/src/libpas/pas_allocation_mode.h
    libpas/src/libpas/pas_allocation_result.h
    libpas/src/libpas/pas_allocator_counts.h
    libpas/src/libpas/pas_allocator_index.h
    libpas/src/libpas/pas_allocator_scavenge_action.h
    libpas/src/libpas/pas_all_shared_page_directories.h
    libpas/src/libpas/pas_baseline_allocator.h
    libpas/src/libpas/pas_baseline_allocator_result.h
    libpas/src/libpas/pas_baseline_allocator_table.h
    libpas/src/libpas/pas_basic_heap_config_enumerator_data.h
    libpas/src/libpas/pas_basic_heap_config_root_data.h
    libpas/src/libpas/pas_basic_heap_page_caches.h
    libpas/src/libpas/pas_basic_heap_runtime_config.h
    libpas/src/libpas/pas_biasing_directory_kind.h
    libpas/src/libpas/pas_bitfield_vector.h
    libpas/src/libpas/pas_bitfit_allocation_result.h
    libpas/src/libpas/pas_bitfit_allocator.h
    libpas/src/libpas/pas_bitfit_allocator_inlines.h
    libpas/src/libpas/pas_bitfit_directory.h
    libpas/src/libpas/pas_bitfit_directory_inlines.h
    libpas/src/libpas/pas_bitfit_heap.h
    libpas/src/libpas/pas_bitfit_max_free.h
    libpas/src/libpas/pas_bitfit_page_config.h
    libpas/src/libpas/pas_bitfit_page_config_inlines.h
    libpas/src/libpas/pas_bitfit_page_config_kind.def
    libpas/src/libpas/pas_bitfit_page_config_kind.h
    libpas/src/libpas/pas_bitfit_page_config_utils.h
    libpas/src/libpas/pas_bitfit_page_config_utils_inlines.h
    libpas/src/libpas/pas_bitfit_page_config_variant.h
    libpas/src/libpas/pas_bitfit_page.h
    libpas/src/libpas/pas_bitfit_page_inlines.h
    libpas/src/libpas/pas_bitfit_size_class.h
    libpas/src/libpas/pas_bitfit_view_and_index.h
    libpas/src/libpas/pas_bitfit_view.h
    libpas/src/libpas/pas_bitfit_view_inlines.h
    libpas/src/libpas/pas_bitvector.h
    libpas/src/libpas/pas_bootstrap_free_heap.h
    libpas/src/libpas/pas_bootstrap_heap_page_provider.h
    libpas/src/libpas/pas_cares_about_size_mode.h
    libpas/src/libpas/pas_cartesian_tree.h
    libpas/src/libpas/pas_coalign.h
    libpas/src/libpas/pas_commit_mode.h
    libpas/src/libpas/pas_commit_span.h
    libpas/src/libpas/pas_committed_pages_vector.h
    libpas/src/libpas/pas_compact_atomic_allocator_index_ptr.h
    libpas/src/libpas/pas_compact_atomic_biasing_directory_ptr.h
    libpas/src/libpas/pas_compact_atomic_bitfit_biasing_directory_ptr.h
    libpas/src/libpas/pas_compact_atomic_bitfit_global_size_class_ptr.h
    libpas/src/libpas/pas_compact_atomic_bitfit_heap_ptr.h
    libpas/src/libpas/pas_compact_atomic_bitfit_size_class_ptr.h
    libpas/src/libpas/pas_compact_atomic_bitfit_view_ptr.h
    libpas/src/libpas/pas_compact_atomic_enumerable_range_list_chunk_ptr.h
    libpas/src/libpas/pas_compact_atomic_page_sharing_pool_ptr.h
    libpas/src/libpas/pas_compact_atomic_ptr.h
    libpas/src/libpas/pas_compact_atomic_segregated_exclusive_view_ptr.h
    libpas/src/libpas/pas_compact_atomic_segregated_heap_page_sharing_pools_ptr.h
    libpas/src/libpas/pas_compact_atomic_segregated_partial_view_ptr.h
    libpas/src/libpas/pas_compact_atomic_segregated_size_directory_ptr.h
    libpas/src/libpas/pas_compact_atomic_segregated_view.h
    libpas/src/libpas/pas_compact_atomic_thread_local_cache_layout_node.h
    libpas/src/libpas/pas_compact_atomic_unsigned_ptr.h
    libpas/src/libpas/pas_compact_biasing_directory_ptr.h
    libpas/src/libpas/pas_compact_bitfit_directory_ptr.h
    libpas/src/libpas/pas_compact_bitfit_global_directory_ptr.h
    libpas/src/libpas/pas_compact_bitfit_view_ptr.h
    libpas/src/libpas/pas_compact_bootstrap_free_heap.h
    libpas/src/libpas/pas_compact_cartesian_tree_node_ptr.h
    libpas/src/libpas/pas_compact_expendable_memory.h
    libpas/src/libpas/pas_compact_heap_ptr.h
    libpas/src/libpas/pas_compact_heap_reservation.h
    libpas/src/libpas/pas_compact_large_utility_free_heap.h
    libpas/src/libpas/pas_compact_page_granule_use_count_ptr.h
    libpas/src/libpas/pas_compact_ptr.h
    libpas/src/libpas/pas_compact_segregated_biasing_directory_ptr.h
    libpas/src/libpas/pas_compact_segregated_exclusive_view_ptr.h
    libpas/src/libpas/pas_compact_segregated_heap_ptr.h
    libpas/src/libpas/pas_compact_segregated_shared_page_directory_ptr.h
    libpas/src/libpas/pas_compact_segregated_shared_view_ptr.h
    libpas/src/libpas/pas_compact_segregated_size_directory_ptr.h
    libpas/src/libpas/pas_compact_segregated_view.h
    libpas/src/libpas/pas_compact_tagged_atomic_ptr.h
    libpas/src/libpas/pas_compact_tagged_page_granule_use_count_ptr.h
    libpas/src/libpas/pas_compact_tagged_ptr.h
    libpas/src/libpas/pas_compact_tagged_unsigned_ptr.h
    libpas/src/libpas/pas_compact_thread_local_cache_layout_node.h
    libpas/src/libpas/pas_compact_unsigned_ptr.h
    libpas/src/libpas/pas_compute_summary_object_callbacks.h
    libpas/src/libpas/pas_config.h
    libpas/src/libpas/pas_config_prefix.h
    libpas/src/libpas/pas_create_basic_heap_page_caches_with_reserved_memory.h
    libpas/src/libpas/pas_darwin_spi.h
    libpas/src/libpas/pas_deallocate.h
    libpas/src/libpas/pas_deallocation_mode.h
    libpas/src/libpas/pas_deallocator.h
    libpas/src/libpas/pas_deallocator_scavenge_action.h
    libpas/src/libpas/pas_decommit_exclusion_range.h
    libpas/src/libpas/pas_debug_heap.h
    libpas/src/libpas/pas_debug_spectrum.h
    libpas/src/libpas/pas_deferred_decommit_log.h
    libpas/src/libpas/pas_designated_intrinsic_heap.h
    libpas/src/libpas/pas_designated_intrinsic_heap_inlines.h
    libpas/src/libpas/pas_dyld_state.h
    libpas/src/libpas/pas_dynamic_primitive_heap_map.h
    libpas/src/libpas/pas_ensure_heap_forced_into_reserved_memory.h
    libpas/src/libpas/pas_ensure_heap_with_page_caches.h
    libpas/src/libpas/pas_enumerable_page_malloc.h
    libpas/src/libpas/pas_enumerable_range_list.h
    libpas/src/libpas/pas_enumerate_bitfit_heaps.h
    libpas/src/libpas/pas_enumerate_initially_unaccounted_pages.h
    libpas/src/libpas/pas_enumerate_large_heaps.h
    libpas/src/libpas/pas_enumerate_segregated_heaps.h
    libpas/src/libpas/pas_enumerate_unaccounted_pages_as_meta.h
    libpas/src/libpas/pas_enumerator.h
    libpas/src/libpas/pas_enumerator_internal.h
    libpas/src/libpas/pas_enumerator_region.h
    libpas/src/libpas/pas_epoch.h
    libpas/src/libpas/pas_exclusive_view_template_memo_table.h
    libpas/src/libpas/pas_expendable_memory.h
    libpas/src/libpas/pas_extended_gcd.h
    libpas/src/libpas/pas_fast_large_free_heap.h
    libpas/src/libpas/pas_fast_megapage_cache.h
    libpas/src/libpas/pas_fast_megapage_kind.h
    libpas/src/libpas/pas_fast_megapage_table.h
    libpas/src/libpas/pas_fast_path_allocation_result.h
    libpas/src/libpas/pas_fast_path_allocation_result_kind.h
    libpas/src/libpas/pas_fast_tls.h
    libpas/src/libpas/pas_fd_stream.h
    libpas/src/libpas/pas_first_level_tiny_large_map_entry.h
    libpas/src/libpas/pas_found_bit_index.h
    libpas/src/libpas/pas_found_index.h
    libpas/src/libpas/pas_free_granules.h
    libpas/src/libpas/pas_free_mode.h
    libpas/src/libpas/pas_free_range_kind.h
    libpas/src/libpas/pas_full_alloc_bits.h
    libpas/src/libpas/pas_full_alloc_bits_inlines.h
    libpas/src/libpas/pas_generic_large_free_heap.h
    libpas/src/libpas/pas_get_allocation_size.h
    libpas/src/libpas/pas_get_heap.h
    libpas/src/libpas/pas_get_object_kind.h
    libpas/src/libpas/pas_get_page_base.h
    libpas/src/libpas/pas_get_page_base_and_kind_for_small_other_in_fast_megapage.h
    libpas/src/libpas/pas_hashtable.h
    libpas/src/libpas/pas_has_object.h
    libpas/src/libpas/pas_heap_config.h
    libpas/src/libpas/pas_heap_config_inlines.h
    libpas/src/libpas/pas_heap_config_kind.def
    libpas/src/libpas/pas_heap_config_kind.h
    libpas/src/libpas/pas_heap_config_utils.h
    libpas/src/libpas/pas_heap_config_utils_inlines.h
    libpas/src/libpas/pas_heap_for_config.h
    libpas/src/libpas/pas_heap.h
    libpas/src/libpas/pas_heap_inlines.h
    libpas/src/libpas/pas_heap_kind.h
    libpas/src/libpas/pas_heap_lock.h
    libpas/src/libpas/pas_heap_page_provider.h
    libpas/src/libpas/pas_heap_ref.h
    libpas/src/libpas/pas_heap_ref_kind.h
    libpas/src/libpas/pas_heap_ref_prefix.h
    libpas/src/libpas/pas_heap_runtime_config.h
    libpas/src/libpas/pas_heap_summary.h
    libpas/src/libpas/pas_heap_table.h
    libpas/src/libpas/pas_heap_table_state.h
    libpas/src/libpas/pas_immortal_heap.h
    libpas/src/libpas/pas_immutable_vector.h
    libpas/src/libpas/pas_internal_config.h
    libpas/src/libpas/pas_intrinsic_heap_support.h
    libpas/src/libpas/pas_large_expendable_memory.h
    libpas/src/libpas/pas_large_free.h
    libpas/src/libpas/pas_large_free_heap_config.h
    libpas/src/libpas/pas_large_free_heap_declarations.def
    libpas/src/libpas/pas_large_free_heap_deferred_commit_log.h
    libpas/src/libpas/pas_large_free_heap_definitions.def
    libpas/src/libpas/pas_large_free_heap_helpers.h
    libpas/src/libpas/pas_large_free_inlines.h
    libpas/src/libpas/pas_large_free_visitor.h
    libpas/src/libpas/pas_large_heap.h
    libpas/src/libpas/pas_large_heap_physical_page_sharing_cache.h
    libpas/src/libpas/pas_large_map_entry.h
    libpas/src/libpas/pas_large_map.h
    libpas/src/libpas/pas_large_sharing_pool_epoch_update_mode.h
    libpas/src/libpas/pas_large_sharing_pool.h
    libpas/src/libpas/pas_large_utility_free_heap.h
    libpas/src/libpas/pas_large_virtual_range.h
    libpas/src/libpas/pas_large_virtual_range_min_heap.h
    libpas/src/libpas/pas_lenient_compact_ptr.h
    libpas/src/libpas/pas_lenient_compact_ptr_inlines.h
    libpas/src/libpas/pas_lenient_compact_unsigned_ptr.h
    libpas/src/libpas/pas_line_word_config.h
    libpas/src/libpas/pas_list_direction.h
    libpas/src/libpas/pas_local_allocator_config_kind.h
    libpas/src/libpas/pas_local_allocator.h
    libpas/src/libpas/pas_local_allocator_inlines.h
    libpas/src/libpas/pas_local_allocator_kind.h
    libpas/src/libpas/pas_local_allocator_refill_mode.h
    libpas/src/libpas/pas_local_allocator_result.h
    libpas/src/libpas/pas_local_allocator_scavenger_data.h
    libpas/src/libpas/pas_local_view_cache.h
    libpas/src/libpas/pas_lock_free_read_ptr_ptr_hashtable.h
    libpas/src/libpas/pas_lock.h
    libpas/src/libpas/pas_log.h
    libpas/src/libpas/pas_malloc_stack_logging.h
    libpas/src/libpas/pas_medium_megapage_cache.h
    libpas/src/libpas/pas_megapage_cache.h
    libpas/src/libpas/pas_min_heap.h
    libpas/src/libpas/pas_mmap_capability.h
    libpas/src/libpas/pas_monotonic_time.h
    libpas/src/libpas/pas_mutation_count.h
    libpas/src/libpas/pas_object_kind.h
    libpas/src/libpas/pas_page_base_and_kind.h
    libpas/src/libpas/pas_page_base_config.h
    libpas/src/libpas/pas_page_base_config_inlines.h
    libpas/src/libpas/pas_page_base_config_utils.h
    libpas/src/libpas/pas_page_base_config_utils_inlines.h
    libpas/src/libpas/pas_page_base.h
    libpas/src/libpas/pas_page_base_inlines.h
    libpas/src/libpas/pas_page_config_kind.h
    libpas/src/libpas/pas_page_config_size_category.h
    libpas/src/libpas/pas_page_granule_use_count.h
    libpas/src/libpas/pas_page_header_placement_mode.h
    libpas/src/libpas/pas_page_header_table.h
    libpas/src/libpas/pas_page_kind.h
    libpas/src/libpas/pas_page_malloc.h
    libpas/src/libpas/pas_page_sharing_mode.h
    libpas/src/libpas/pas_page_sharing_participant.h
    libpas/src/libpas/pas_page_sharing_participant_kind.h
    libpas/src/libpas/pas_page_sharing_pool.h
    libpas/src/libpas/pas_page_sharing_pool_scavenge_result.h
    libpas/src/libpas/pas_page_sharing_pool_take_result.h
    libpas/src/libpas/pas_payload_reservation_page_list.h
    libpas/src/libpas/pas_physical_memory_synchronization_style.h
    libpas/src/libpas/pas_physical_memory_transaction.h
    libpas/src/libpas/pas_platform.h
    libpas/src/libpas/pas_primitive_heap_ref.h
    libpas/src/libpas/pas_probabilistic_guard_malloc_allocator.h
    libpas/src/libpas/pas_promote_intrinsic_heap.h
    libpas/src/libpas/pas_ptr_hash_map.h
    libpas/src/libpas/pas_ptr_hash_set.h
    libpas/src/libpas/pas_ptr_min_heap.h
    libpas/src/libpas/pas_ptr_worklist.h
    libpas/src/libpas/pas_race_test_hooks.h
    libpas/src/libpas/pas_random.h
    libpas/src/libpas/pas_range16.h
    libpas/src/libpas/pas_range_begin_min_heap.h
    libpas/src/libpas/pas_range.h
    libpas/src/libpas/pas_range_locked_mode.h
    libpas/src/libpas/pas_range_min_heap.h
    libpas/src/libpas/pas_reallocate_free_mode.h
    libpas/src/libpas/pas_reallocate_heap_teleport_rule.h
    libpas/src/libpas/pas_red_black_tree.h
    libpas/src/libpas/pas_redundant_local_allocator_node.h
    libpas/src/libpas/pas_report_crash.h
    libpas/src/libpas/pas_report_crash_pgm_report.h
    libpas/src/libpas/pas_reserved_memory_provider.h
    libpas/src/libpas/pas_root.h
    libpas/src/libpas/pas_scavenger.h
    libpas/src/libpas/pas_segmented_vector.h
    libpas/src/libpas/pas_segregated_deallocation_logging_mode.h
    libpas/src/libpas/pas_segregated_deallocation_mode.h
    libpas/src/libpas/pas_segregated_directory_bit_reference.h
    libpas/src/libpas/pas_segregated_directory_first_eligible_kind.h
    libpas/src/libpas/pas_segregated_directory.h
    libpas/src/libpas/pas_segregated_directory_inlines.h
    libpas/src/libpas/pas_segregated_directory_kind.h
    libpas/src/libpas/pas_segregated_exclusive_view.h
    libpas/src/libpas/pas_segregated_exclusive_view_inlines.h
    libpas/src/libpas/pas_segregated_heap.h
    libpas/src/libpas/pas_segregated_heap_inlines.h
    libpas/src/libpas/pas_segregated_heap_lookup_kind.h
    libpas/src/libpas/pas_segregated_page_and_config.h
    libpas/src/libpas/pas_segregated_page_config.h
    libpas/src/libpas/pas_segregated_page_config_inlines.h
    libpas/src/libpas/pas_segregated_page_config_kind.def
    libpas/src/libpas/pas_segregated_page_config_kind.h
    libpas/src/libpas/pas_segregated_page_config_kind_and_role.h
    libpas/src/libpas/pas_segregated_page_config_utils.h
    libpas/src/libpas/pas_segregated_page_config_utils_inlines.h
    libpas/src/libpas/pas_segregated_page_config_variant.h
    libpas/src/libpas/pas_segregated_page_emptiness_kind.h
    libpas/src/libpas/pas_segregated_page.h
    libpas/src/libpas/pas_segregated_page_inlines.h
    libpas/src/libpas/pas_segregated_page_role.h
    libpas/src/libpas/pas_segregated_partial_view.h
    libpas/src/libpas/pas_segregated_partial_view_inlines.h
    libpas/src/libpas/pas_segregated_shared_handle.h
    libpas/src/libpas/pas_segregated_shared_handle_inlines.h
    libpas/src/libpas/pas_segregated_shared_page_directory.h
    libpas/src/libpas/pas_segregated_shared_view.h
    libpas/src/libpas/pas_segregated_shared_view_inlines.h
    libpas/src/libpas/pas_segregated_size_directory_creation_mode.h
    libpas/src/libpas/pas_segregated_size_directory.h
    libpas/src/libpas/pas_segregated_size_directory_inlines.h
    libpas/src/libpas/pas_segregated_view_allocator_inlines.h
    libpas/src/libpas/pas_segregated_view.h
    libpas/src/libpas/pas_segregated_view_kind.h
    libpas/src/libpas/pas_shared_handle_or_page_boundary.h
    libpas/src/libpas/pas_shared_handle_or_page_boundary_inlines.h
    libpas/src/libpas/pas_shared_page_directory_by_size.h
    libpas/src/libpas/pas_simple_free_heap_declarations.def
    libpas/src/libpas/pas_simple_free_heap_definitions.def
    libpas/src/libpas/pas_simple_free_heap_helpers.h
    libpas/src/libpas/pas_simple_large_free_heap.h
    libpas/src/libpas/pas_simple_type.h
    libpas/src/libpas/pas_size_lookup_mode.h
    libpas/src/libpas/pas_slow_path_mode.h
    libpas/src/libpas/pas_slow_path_mode_prefix.h
    libpas/src/libpas/pas_small_large_map_entry.h
    libpas/src/libpas/pas_small_medium_bootstrap_free_heap.h
    libpas/src/libpas/pas_small_medium_bootstrap_heap_page_provider.h
    libpas/src/libpas/pas_snprintf.h
    libpas/src/libpas/pas_status_reporter.h
    libpas/src/libpas/pas_stream.h
    libpas/src/libpas/pas_string_stream.h
    libpas/src/libpas/pas_thread_suspend_lock.h
    libpas/src/libpas/pas_thread_local_cache.h
    libpas/src/libpas/pas_thread_local_cache_layout.h
    libpas/src/libpas/pas_thread_local_cache_layout_entry.h
    libpas/src/libpas/pas_thread_local_cache_layout_node.h
    libpas/src/libpas/pas_thread_local_cache_layout_node_kind.h
    libpas/src/libpas/pas_thread_local_cache_node.h
    libpas/src/libpas/pas_tiny_large_map_entry.h
    libpas/src/libpas/pas_tree_direction.h
    libpas/src/libpas/pas_tri_state.h
    libpas/src/libpas/pas_try_allocate_array.h
    libpas/src/libpas/pas_try_allocate_common.h
    libpas/src/libpas/pas_try_allocate.h
    libpas/src/libpas/pas_try_allocate_intrinsic.h
    libpas/src/libpas/pas_try_allocate_primitive.h
    libpas/src/libpas/pas_try_reallocate.h
    libpas/src/libpas/pas_try_shrink.h
    libpas/src/libpas/pas_utility_heap_config.h
    libpas/src/libpas/pas_utility_heap.h
    libpas/src/libpas/pas_utility_heap_support.h
    libpas/src/libpas/pas_utils.h
    libpas/src/libpas/pas_utils_prefix.h
    libpas/src/libpas/pas_versioned_field.h
    libpas/src/libpas/pas_virtual_range.h
    libpas/src/libpas/pas_virtual_range_min_heap.h
    libpas/src/libpas/pas_zero_mode.h
    libpas/src/libpas/thingy_heap_config.h
    libpas/src/libpas/thingy_heap.h
    libpas/src/libpas/thingy_heap_prefix.h
)

if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
    list(APPEND bmalloc_SOURCES
        bmalloc/Zone.cpp
    )
endif ()

set(bmalloc_LIBRARIES
    ${CMAKE_DL_LIBS}
)

if (ATOMICS_REQUIRE_LIBATOMIC)
    list(APPEND bmalloc_LIBRARIES atomic)
endif ()

set(bmalloc_COMPILE_OPTIONS
    -Wno-cast-align
    -Wno-missing-field-initializers
)

set(bmalloc_INTERFACE_LIBRARIES bmalloc)
set(bmalloc_INTERFACE_INCLUDE_DIRECTORIES ${bmalloc_FRAMEWORK_HEADERS_DIR})
set(bmalloc_INTERFACE_DEPENDENCIES bmalloc_CopyHeaders)

add_definitions(-D_GNU_SOURCE)
add_definitions(-DPAS_BMALLOC=1)

if (MSVC)
    add_compile_options(/wd4206)
endif ()

WEBKIT_FRAMEWORK_DECLARE(bmalloc)
WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS()

WEBKIT_COPY_FILES(bmalloc_CopyHeaders
    DESTINATION ${bmalloc_FRAMEWORK_HEADERS_DIR}/bmalloc
    FILES ${bmalloc_PUBLIC_HEADERS}
    FLATTENED
)

WEBKIT_FRAMEWORK(bmalloc)

# Only build mbmalloc on platforms that MallocBench supports
if (DEVELOPER_MODE AND (APPLE OR HAVE_MALLOC_TRIM))
    add_library(mbmalloc SHARED bmalloc/mbmalloc.cpp)
    target_include_directories(mbmalloc PRIVATE ${bmalloc_PRIVATE_INCLUDE_DIRECTORIES})
    target_link_libraries(mbmalloc Threads::Threads bmalloc)
    set_target_properties(mbmalloc PROPERTIES COMPILE_DEFINITIONS "BUILDING_mbmalloc")
    WEBKIT_ADD_TARGET_CXX_FLAGS(mbmalloc -Wno-missing-field-initializers)
endif ()
