• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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