1*61c4878aSAndroid Build Coastguard Worker# Copyright 2020 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker# 3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker# the License at 6*61c4878aSAndroid Build Coastguard Worker# 7*61c4878aSAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker# 9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker# the License. 14*61c4878aSAndroid Build Coastguard Worker 15*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed.gni") 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/facade.gni") 18*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/module_config.gni") 19*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_docgen/docs.gni") 20*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_malloc/backend.gni") 21*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_unit_test/test.gni") 22*61c4878aSAndroid Build Coastguard Worker 23*61c4878aSAndroid Build Coastguard Workerdeclare_args() { 24*61c4878aSAndroid Build Coastguard Worker # The build target that overrides the default configuration options for this 25*61c4878aSAndroid Build Coastguard Worker # module. This should point to a source set that provides defines through a 26*61c4878aSAndroid Build Coastguard Worker # public config (which may -include a file or add defines directly). 27*61c4878aSAndroid Build Coastguard Worker pw_malloc_CONFIG = pw_build_DEFAULT_MODULE_CONFIG 28*61c4878aSAndroid Build Coastguard Worker} 29*61c4878aSAndroid Build Coastguard Worker 30*61c4878aSAndroid Build Coastguard Workerpw_source_set("config") { 31*61c4878aSAndroid Build Coastguard Worker public_configs = [ ":public_include_path" ] 32*61c4878aSAndroid Build Coastguard Worker public = [ "public/pw_malloc/config.h" ] 33*61c4878aSAndroid Build Coastguard Worker public_deps = [ 34*61c4878aSAndroid Build Coastguard Worker "$dir_pw_allocator:synchronized_allocator", 35*61c4878aSAndroid Build Coastguard Worker "$dir_pw_allocator:tracking_allocator", 36*61c4878aSAndroid Build Coastguard Worker pw_malloc_CONFIG, 37*61c4878aSAndroid Build Coastguard Worker ] 38*61c4878aSAndroid Build Coastguard Worker} 39*61c4878aSAndroid Build Coastguard Worker 40*61c4878aSAndroid Build Coastguard Workerconfig("public_include_path") { 41*61c4878aSAndroid Build Coastguard Worker include_dirs = [ "public" ] 42*61c4878aSAndroid Build Coastguard Worker} 43*61c4878aSAndroid Build Coastguard Worker 44*61c4878aSAndroid Build Coastguard Workerconfig("private_include_path") { 45*61c4878aSAndroid Build Coastguard Worker include_dirs = [ "." ] 46*61c4878aSAndroid Build Coastguard Worker} 47*61c4878aSAndroid Build Coastguard Worker 48*61c4878aSAndroid Build Coastguard Workerconfig("wrap_functions") { 49*61c4878aSAndroid Build Coastguard Worker # Link options that provides replace dynamic memory operations in standard 50*61c4878aSAndroid Build Coastguard Worker # library with the pigweed malloc. 51*61c4878aSAndroid Build Coastguard Worker ldflags = [ 52*61c4878aSAndroid Build Coastguard Worker # memory allocation -- these must be re-entrant and do locking 53*61c4878aSAndroid Build Coastguard Worker "-Wl,--wrap=malloc", 54*61c4878aSAndroid Build Coastguard Worker "-Wl,--wrap=free", 55*61c4878aSAndroid Build Coastguard Worker "-Wl,--wrap=realloc", 56*61c4878aSAndroid Build Coastguard Worker "-Wl,--wrap=calloc", 57*61c4878aSAndroid Build Coastguard Worker 58*61c4878aSAndroid Build Coastguard Worker # Wrap these in case internal newlib call them (e.g. strdup will) 59*61c4878aSAndroid Build Coastguard Worker # directly call _malloc_r) 60*61c4878aSAndroid Build Coastguard Worker "-Wl,--wrap=_malloc_r", 61*61c4878aSAndroid Build Coastguard Worker "-Wl,--wrap=_realloc_r", 62*61c4878aSAndroid Build Coastguard Worker "-Wl,--wrap=_free_r", 63*61c4878aSAndroid Build Coastguard Worker "-Wl,--wrap=_calloc_r", 64*61c4878aSAndroid Build Coastguard Worker ] 65*61c4878aSAndroid Build Coastguard Worker} 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker# Alias for `:wrap_functions`. 68*61c4878aSAndroid Build Coastguard Workerconfig("pw_malloc_wrapper_config") { 69*61c4878aSAndroid Build Coastguard Worker configs = [ ":wrap_functions" ] 70*61c4878aSAndroid Build Coastguard Worker} 71*61c4878aSAndroid Build Coastguard Worker 72*61c4878aSAndroid Build Coastguard Worker_COMMON_SRCS = [ "malloc.cc" ] 73*61c4878aSAndroid Build Coastguard Worker 74*61c4878aSAndroid Build Coastguard Worker_COMMON_HDRS = [ "public/pw_malloc/malloc.h" ] 75*61c4878aSAndroid Build Coastguard Worker 76*61c4878aSAndroid Build Coastguard Workergroup("common") { 77*61c4878aSAndroid Build Coastguard Worker visibility = [ ":*" ] 78*61c4878aSAndroid Build Coastguard Worker public_configs = [ 79*61c4878aSAndroid Build Coastguard Worker ":public_include_path", 80*61c4878aSAndroid Build Coastguard Worker ":wrap_functions", 81*61c4878aSAndroid Build Coastguard Worker ] 82*61c4878aSAndroid Build Coastguard Worker public_deps = [ 83*61c4878aSAndroid Build Coastguard Worker ":config", 84*61c4878aSAndroid Build Coastguard Worker "$dir_pw_allocator:allocator", 85*61c4878aSAndroid Build Coastguard Worker dir_pw_assert, 86*61c4878aSAndroid Build Coastguard Worker dir_pw_bytes, 87*61c4878aSAndroid Build Coastguard Worker dir_pw_preprocessor, 88*61c4878aSAndroid Build Coastguard Worker ] 89*61c4878aSAndroid Build Coastguard Worker} 90*61c4878aSAndroid Build Coastguard Worker 91*61c4878aSAndroid Build Coastguard Workerpw_facade("pw_malloc") { 92*61c4878aSAndroid Build Coastguard Worker backend = pw_malloc_BACKEND 93*61c4878aSAndroid Build Coastguard Worker public = _COMMON_HDRS 94*61c4878aSAndroid Build Coastguard Worker sources = _COMMON_SRCS 95*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":common" ] 96*61c4878aSAndroid Build Coastguard Worker} 97*61c4878aSAndroid Build Coastguard Worker 98*61c4878aSAndroid Build Coastguard Worker# Allocator-based backends. 99*61c4878aSAndroid Build Coastguard Worker 100*61c4878aSAndroid Build Coastguard Workerpw_source_set("best_fit") { 101*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":pw_malloc.facade" ] 102*61c4878aSAndroid Build Coastguard Worker deps = [ "$dir_pw_allocator:best_fit" ] 103*61c4878aSAndroid Build Coastguard Worker sources = [ "best_fit.cc" ] 104*61c4878aSAndroid Build Coastguard Worker} 105*61c4878aSAndroid Build Coastguard Worker 106*61c4878aSAndroid Build Coastguard Worker# TODO(b/376730645): Remove deprecated backends. 107*61c4878aSAndroid Build Coastguard Workerpw_source_set("best_fit_block_allocator") { 108*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":best_fit" ] 109*61c4878aSAndroid Build Coastguard Worker} 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard Workerpw_source_set("bucket_allocator") { 112*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":pw_malloc.facade" ] 113*61c4878aSAndroid Build Coastguard Worker deps = [ "$dir_pw_allocator:bucket_allocator" ] 114*61c4878aSAndroid Build Coastguard Worker sources = [ "bucket_allocator.cc" ] 115*61c4878aSAndroid Build Coastguard Worker} 116*61c4878aSAndroid Build Coastguard Worker 117*61c4878aSAndroid Build Coastguard Worker# TODO(b/376730645): Remove deprecated backends. 118*61c4878aSAndroid Build Coastguard Workerpw_source_set("bucket_block_allocator") { 119*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":bucket_allocator" ] 120*61c4878aSAndroid Build Coastguard Worker} 121*61c4878aSAndroid Build Coastguard Worker 122*61c4878aSAndroid Build Coastguard Worker# TODO(b/376730645): Remove deprecated backends. 123*61c4878aSAndroid Build Coastguard Workerpw_source_set("dual_first_fit_block_allocator") { 124*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":first_fit" ] 125*61c4878aSAndroid Build Coastguard Worker} 126*61c4878aSAndroid Build Coastguard Worker 127*61c4878aSAndroid Build Coastguard Workerpw_source_set("first_fit") { 128*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":pw_malloc.facade" ] 129*61c4878aSAndroid Build Coastguard Worker deps = [ "$dir_pw_allocator:first_fit" ] 130*61c4878aSAndroid Build Coastguard Worker sources = [ "first_fit.cc" ] 131*61c4878aSAndroid Build Coastguard Worker} 132*61c4878aSAndroid Build Coastguard Worker 133*61c4878aSAndroid Build Coastguard Worker# TODO(b/376730645): Remove deprecated backends. 134*61c4878aSAndroid Build Coastguard Workerpw_source_set("first_fit_block_allocator") { 135*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":first_fit" ] 136*61c4878aSAndroid Build Coastguard Worker} 137*61c4878aSAndroid Build Coastguard Worker 138*61c4878aSAndroid Build Coastguard Worker# TODO(b/376730645): Remove deprecated backends. 139*61c4878aSAndroid Build Coastguard Workerpw_source_set("last_fit_block_allocator") { 140*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":first_fit" ] 141*61c4878aSAndroid Build Coastguard Worker} 142*61c4878aSAndroid Build Coastguard Worker 143*61c4878aSAndroid Build Coastguard Workerpw_source_set("worst_fit") { 144*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":pw_malloc.facade" ] 145*61c4878aSAndroid Build Coastguard Worker deps = [ "$dir_pw_allocator:worst_fit" ] 146*61c4878aSAndroid Build Coastguard Worker sources = [ "worst_fit.cc" ] 147*61c4878aSAndroid Build Coastguard Worker} 148*61c4878aSAndroid Build Coastguard Worker 149*61c4878aSAndroid Build Coastguard Worker# TODO(b/376730645): Remove deprecated backends. 150*61c4878aSAndroid Build Coastguard Workerpw_source_set("worst_fit_block_allocator") { 151*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":worst_fit" ] 152*61c4878aSAndroid Build Coastguard Worker} 153*61c4878aSAndroid Build Coastguard Worker 154*61c4878aSAndroid Build Coastguard Worker# Backend unit tests. 155*61c4878aSAndroid Build Coastguard Worker 156*61c4878aSAndroid Build Coastguard Workerpw_source_set("testing") { 157*61c4878aSAndroid Build Coastguard Worker configs = [ ":private_include_path" ] 158*61c4878aSAndroid Build Coastguard Worker defines = [ 159*61c4878aSAndroid Build Coastguard Worker "PW_MALLOC_METRICS_INCLUDE=\"pw_malloc/internal/testing.h\"", 160*61c4878aSAndroid Build Coastguard Worker "PW_MALLOC_METRICS_TYPE=::pw::malloc::internal::TestMetrics", 161*61c4878aSAndroid Build Coastguard Worker "PW_MALLOC_BLOCK_OFFSET_TYPE=uint16_t", 162*61c4878aSAndroid Build Coastguard Worker "PW_MALLOC_MIN_BUCKET_SIZE=64", 163*61c4878aSAndroid Build Coastguard Worker "PW_MALLOC_NUM_BUCKETS=4", 164*61c4878aSAndroid Build Coastguard Worker ] 165*61c4878aSAndroid Build Coastguard Worker public = _COMMON_HDRS + [ "public/pw_malloc/internal/testing.h" ] 166*61c4878aSAndroid Build Coastguard Worker sources = _COMMON_SRCS + [ "malloc_test.cc" ] 167*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":common" ] 168*61c4878aSAndroid Build Coastguard Worker deps = [ 169*61c4878aSAndroid Build Coastguard Worker "$dir_pw_tokenizer:decoder", 170*61c4878aSAndroid Build Coastguard Worker "$dir_pw_unit_test:light", 171*61c4878aSAndroid Build Coastguard Worker ] 172*61c4878aSAndroid Build Coastguard Worker} 173*61c4878aSAndroid Build Coastguard Worker 174*61c4878aSAndroid Build Coastguard Workerpw_test("best_fit_test") { 175*61c4878aSAndroid Build Coastguard Worker deps = [ 176*61c4878aSAndroid Build Coastguard Worker ":testing", 177*61c4878aSAndroid Build Coastguard Worker "$dir_pw_allocator:best_fit", 178*61c4878aSAndroid Build Coastguard Worker ] 179*61c4878aSAndroid Build Coastguard Worker sources = [ "best_fit.cc" ] 180*61c4878aSAndroid Build Coastguard Worker} 181*61c4878aSAndroid Build Coastguard Worker 182*61c4878aSAndroid Build Coastguard Workerpw_test("bucket_allocator_test") { 183*61c4878aSAndroid Build Coastguard Worker deps = [ 184*61c4878aSAndroid Build Coastguard Worker ":testing", 185*61c4878aSAndroid Build Coastguard Worker "$dir_pw_allocator:bucket_allocator", 186*61c4878aSAndroid Build Coastguard Worker ] 187*61c4878aSAndroid Build Coastguard Worker sources = [ "bucket_allocator.cc" ] 188*61c4878aSAndroid Build Coastguard Worker} 189*61c4878aSAndroid Build Coastguard Worker 190*61c4878aSAndroid Build Coastguard Workerpw_test("first_fit_test") { 191*61c4878aSAndroid Build Coastguard Worker deps = [ 192*61c4878aSAndroid Build Coastguard Worker ":testing", 193*61c4878aSAndroid Build Coastguard Worker "$dir_pw_allocator:first_fit", 194*61c4878aSAndroid Build Coastguard Worker ] 195*61c4878aSAndroid Build Coastguard Worker sources = [ "first_fit.cc" ] 196*61c4878aSAndroid Build Coastguard Worker} 197*61c4878aSAndroid Build Coastguard Worker 198*61c4878aSAndroid Build Coastguard Workerpw_test("worst_fit_test") { 199*61c4878aSAndroid Build Coastguard Worker deps = [ 200*61c4878aSAndroid Build Coastguard Worker ":testing", 201*61c4878aSAndroid Build Coastguard Worker "$dir_pw_allocator:worst_fit", 202*61c4878aSAndroid Build Coastguard Worker ] 203*61c4878aSAndroid Build Coastguard Worker sources = [ "worst_fit.cc" ] 204*61c4878aSAndroid Build Coastguard Worker} 205*61c4878aSAndroid Build Coastguard Worker 206*61c4878aSAndroid Build Coastguard Worker# Docs 207*61c4878aSAndroid Build Coastguard Worker 208*61c4878aSAndroid Build Coastguard Workerpw_doc_group("docs") { 209*61c4878aSAndroid Build Coastguard Worker sources = [ 210*61c4878aSAndroid Build Coastguard Worker "backends.rst", 211*61c4878aSAndroid Build Coastguard Worker "docs.rst", 212*61c4878aSAndroid Build Coastguard Worker ] 213*61c4878aSAndroid Build Coastguard Worker} 214*61c4878aSAndroid Build Coastguard Worker 215*61c4878aSAndroid Build Coastguard Workerpw_test_group("tests") { 216*61c4878aSAndroid Build Coastguard Worker # Only run the test if no backend is set to ensure there is no system 217*61c4878aSAndroid Build Coastguard Worker # allocator. 218*61c4878aSAndroid Build Coastguard Worker enable_if = pw_malloc_BACKEND == "" 219*61c4878aSAndroid Build Coastguard Worker 220*61c4878aSAndroid Build Coastguard Worker # Currently only supported for host unit tests on Linux. 221*61c4878aSAndroid Build Coastguard Worker enable_if = enable_if && defined(pw_toolchain_SCOPE.is_host_toolchain) && 222*61c4878aSAndroid Build Coastguard Worker pw_toolchain_SCOPE.is_host_toolchain && host_os == "linux" 223*61c4878aSAndroid Build Coastguard Worker 224*61c4878aSAndroid Build Coastguard Worker # Only run using the light framework, since gtest allocates objects before the 225*61c4878aSAndroid Build Coastguard Worker # test fixture initializes the heap. 226*61c4878aSAndroid Build Coastguard Worker enable_if = enable_if && pw_unit_test_BACKEND == "$dir_pw_unit_test:light" 227*61c4878aSAndroid Build Coastguard Worker 228*61c4878aSAndroid Build Coastguard Worker # Don't run with ASAN and TSAN since they wrap malloc. 229*61c4878aSAndroid Build Coastguard Worker default_configs = [] 230*61c4878aSAndroid Build Coastguard Worker if (defined(pw_toolchain_SCOPE.defaults)) { 231*61c4878aSAndroid Build Coastguard Worker defaults = pw_toolchain_SCOPE.defaults 232*61c4878aSAndroid Build Coastguard Worker if (defined(defaults.default_configs)) { 233*61c4878aSAndroid Build Coastguard Worker default_configs = defaults.default_configs 234*61c4878aSAndroid Build Coastguard Worker } 235*61c4878aSAndroid Build Coastguard Worker } 236*61c4878aSAndroid Build Coastguard Worker conflicting = [ 237*61c4878aSAndroid Build Coastguard Worker "$dir_pw_toolchain/host_clang:sanitize_address", 238*61c4878aSAndroid Build Coastguard Worker "$dir_pw_toolchain/host_clang:sanitize_thread", 239*61c4878aSAndroid Build Coastguard Worker ] 240*61c4878aSAndroid Build Coastguard Worker enable_if = enable_if && 241*61c4878aSAndroid Build Coastguard Worker default_configs + conflicting - conflicting == default_configs 242*61c4878aSAndroid Build Coastguard Worker 243*61c4878aSAndroid Build Coastguard Worker tests = [ 244*61c4878aSAndroid Build Coastguard Worker ":best_fit_test", 245*61c4878aSAndroid Build Coastguard Worker ":bucket_allocator_test", 246*61c4878aSAndroid Build Coastguard Worker ":first_fit_test", 247*61c4878aSAndroid Build Coastguard Worker ":worst_fit_test", 248*61c4878aSAndroid Build Coastguard Worker ] 249*61c4878aSAndroid Build Coastguard Worker} 250