1# Copyright 2020 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 15load( 16 "//pw_build:pigweed.bzl", 17 "pw_facade", 18) 19 20package(default_visibility = ["//visibility:public"]) 21 22licenses(["notice"]) 23 24constraint_setting( 25 name = "backend_constraint_setting", 26) 27 28# TODO: pwbug.dev/328679085 - Remove this alias once no-one uses it. 29alias( 30 name = "facade", 31 actual = "pw_malloc.facade", 32) 33 34COMMON_LINKOPTS = [ 35 # Link options that replace dynamic memory operations in standard 36 # library with the pigweed malloc. 37 "-Wl,--wrap=malloc", 38 "-Wl,--wrap=free", 39 "-Wl,--wrap=realloc", 40 "-Wl,--wrap=calloc", 41 "-Wl,--wrap=_malloc_r", 42 "-Wl,--wrap=_realloc_r", 43 "-Wl,--wrap=_free_r", 44 "-Wl,--wrap=_calloc_r", 45] 46 47pw_facade( 48 name = "pw_malloc", 49 srcs = ["malloc.cc"], 50 hdrs = [ 51 "public/pw_malloc/config.h", 52 "public/pw_malloc/malloc.h", 53 ], 54 backend = ":backend", 55 includes = ["public"], 56 linkopts = COMMON_LINKOPTS, 57 deps = [ 58 ":config_override", 59 "//pw_allocator:allocator", 60 "//pw_allocator:synchronized_allocator", 61 "//pw_allocator:tracking_allocator", 62 "//pw_assert", 63 "//pw_bytes", 64 "//pw_preprocessor", 65 ], 66) 67 68label_flag( 69 name = "config_override", 70 build_setting_default = "//pw_build:default_module_config", 71) 72 73label_flag( 74 name = "backend", 75 build_setting_default = ":backend_multiplexer", 76) 77 78constraint_value( 79 name = "best_fit_block_allocator_backend", 80 constraint_setting = "//pw_malloc:backend_constraint_setting", 81) 82 83constraint_value( 84 name = "bucket_block_allocator_backend", 85 constraint_setting = "//pw_malloc:backend_constraint_setting", 86) 87 88constraint_value( 89 name = "dual_first_fit_block_allocator_backend", 90 constraint_setting = "//pw_malloc:backend_constraint_setting", 91) 92 93constraint_value( 94 name = "first_fit_block_allocator_backend", 95 constraint_setting = "//pw_malloc:backend_constraint_setting", 96) 97 98constraint_value( 99 name = "freelist_backend", 100 constraint_setting = "//pw_malloc:backend_constraint_setting", 101) 102 103constraint_value( 104 name = "last_fit_block_allocator_backend", 105 constraint_setting = "//pw_malloc:backend_constraint_setting", 106) 107 108constraint_value( 109 name = "worst_fit_block_allocator_backend", 110 constraint_setting = "//pw_malloc:backend_constraint_setting", 111) 112 113alias( 114 name = "backend_multiplexer", 115 actual = select({ 116 "//pw_malloc:best_fit_block_allocator_backend": "//pw_malloc:best_fit_block_allocator", 117 "//pw_malloc:bucket_block_allocator_backend": "//pw_malloc:bucket_block_allocator", 118 "//pw_malloc:dual_first_fit_block_allocator_backend": "//pw_malloc:dual_first_fit_block_allocator", 119 "//pw_malloc:first_fit_block_allocator_backend": "//pw_malloc:first_fit_block_allocator", 120 "//pw_malloc:last_fit_block_allocator_backend": "//pw_malloc:last_fit_block_allocator", 121 "//pw_malloc:worst_fit_block_allocator_backend": "//pw_malloc:worst_fit_block_allocator", 122 "//pw_malloc_freelist:backend": "//pw_malloc:bucket_block_allocator", 123 "//pw_malloc_freertos:backend": "//pw_malloc_freertos", 124 "//conditions:default": "//pw_build:unspecified_backend", 125 }), 126 visibility = ["@pigweed//targets:__pkg__"], 127) 128 129cc_library( 130 name = "best_fit_block_allocator", 131 srcs = ["best_fit_block_allocator.cc"], 132 deps = [ 133 ":pw_malloc.facade", 134 "//pw_allocator:best_fit_block_allocator", 135 ], 136) 137 138cc_library( 139 name = "bucket_block_allocator", 140 srcs = ["bucket_block_allocator.cc"], 141 deps = [ 142 "//pw_allocator:bucket_block_allocator", 143 "//pw_malloc:facade", 144 ], 145) 146 147cc_library( 148 name = "dual_first_fit_block_allocator", 149 srcs = ["dual_first_fit_block_allocator.cc"], 150 deps = [ 151 "//pw_allocator:dual_first_fit_block_allocator", 152 "//pw_malloc:facade", 153 ], 154) 155 156cc_library( 157 name = "first_fit_block_allocator", 158 srcs = ["first_fit_block_allocator.cc"], 159 deps = [ 160 "//pw_allocator:first_fit_block_allocator", 161 "//pw_malloc:facade", 162 ], 163) 164 165cc_library( 166 name = "last_fit_block_allocator", 167 srcs = ["last_fit_block_allocator.cc"], 168 deps = [ 169 "//pw_allocator:last_fit_block_allocator", 170 "//pw_malloc:facade", 171 ], 172) 173 174cc_library( 175 name = "worst_fit_block_allocator", 176 srcs = ["worst_fit_block_allocator.cc"], 177 deps = [ 178 "//pw_allocator:worst_fit_block_allocator", 179 "//pw_malloc:facade", 180 ], 181) 182 183# TODO(b/343531095): Add unit tests to Bazel build whenever the following 184# conditions are met: 185# * The backend is not set. 186# * The host is not "mac", due to missing linker support. 187# * No sanitizer is configured, due to conflicts with interceptors. 188# * pico_malloc is not in use. 189# * gtest is not in use, since it dynamically allocates before calling SetUp(). 190filegroup( 191 name = "malloc_test", 192 srcs = [ 193 "malloc_test.cc", 194 "pw_malloc_private/test_config_overrides.h", 195 ], 196) 197