xref: /aosp_15_r20/external/pigweed/pw_malloc/BUILD.gn (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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