summaryrefslogtreecommitdiffstats
path: root/build/moz.configure/memory.configure
blob: 477c9c58a4254af78822e7a228b1f5f15e7500ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.


@depends(target, js_package)
def jemalloc_default(target, js_package):
    if js_package:
        return False
    return target.kernel in ("Darwin", "Linux", "WINNT")


option(
    "--enable-jemalloc",
    env="MOZ_MEMORY",
    default=jemalloc_default,
    help="{Replace|Do not replace} memory allocator with jemalloc",
)


set_config("MOZ_MEMORY", True, when="--enable-jemalloc")
set_define("MOZ_MEMORY", True, when="--enable-jemalloc")
add_old_configure_assignment("MOZ_MEMORY", True, when="--enable-jemalloc")


@depends("--enable-jemalloc", moz_debug, win32_redist_dir)
def check_redist(jemalloc, debug, win32_redist_dir):
    if not jemalloc and not win32_redist_dir and not debug:
        log.warning(
            "When not building jemalloc, you need to build with --with-redist or set WIN32_REDIST_DIR."
        )


@depends(milestone, build_project)
def replace_malloc_default(milestone, build_project):
    if build_project == "memory":
        return True
    if milestone.is_early_beta_or_earlier and build_project != "js":
        return True


option(
    "--enable-replace-malloc",
    default=replace_malloc_default,
    when="--enable-jemalloc",
    help="{Enable|Disable} ability to dynamically replace the malloc implementation",
)


set_config("MOZ_REPLACE_MALLOC", True, when="--enable-replace-malloc")
set_define("MOZ_REPLACE_MALLOC", True, when="--enable-replace-malloc")


@depends(build_project, when="--enable-replace-malloc")
def replace_malloc_static(build_project):
    # Default to statically linking replace-malloc libraries that can be
    # statically linked, except when building with --enable-project=memory.
    if build_project != "memory":
        return True


set_config("MOZ_REPLACE_MALLOC_STATIC", replace_malloc_static)

# PHC (Probabilistic Heap Checker)
# ==============================================================


# In general, it only makes sense for PHC to run on the platforms that have a
# crash reporter.
@depends(
    build_project,
    milestone,
    target,
    when="--enable-jemalloc",
)
def phc_default(build_project, milestone, target):
    if build_project == "js":
        return False

    # PHC has a performance bottleneck on aarch64 (Bug 1874022) it's okay
    # for nightly but not for release yet.  To support unified builds on
    # MacOS the x86_64 and aarch64 builds must match, so we disable PHC for
    # x86_64 on MacOS late beta and release.
    cpu_support = ("x86_64",)
    if milestone.is_early_beta_or_earlier:
        cpu_support = ("x86_64", "aarch64")
    elif target.os == "OSX":
        cpu_support = ()

    # Both Linux32 and Win32 have frequent crashes when stack tracing (for
    # unclear reasons), so PHC is enabled only on 64-bit only in both cases.
    return (target.cpu in cpu_support) and (
        (target.os == "GNU" and target.kernel == "Linux")
        or (target.kernel == "WINNT")
        or (target.os == "OSX")
    )


option(
    "--enable-phc",
    env="MOZ_PHC",
    default=phc_default,
    when="--enable-jemalloc",
    help="{Enable|Disable} PHC (Probabilistic Memory Checker). "
    "Also enables frame pointers when needed",
)

set_config("MOZ_PHC", True, when="--enable-phc")


# PHC parses stacks using frame pointers on these systems.
@depends("--enable-phc", target, have_unwind, when="--enable-jemalloc")
def phc_implies_frame_pointers(phc, target, have_unwind):
    if not phc:
        return False

    # This should be kept in sync with the ifdefs in memory/build/PHC.cpp
    # that control stack walking.
    # This is true for the first two options in PHC.cpp
    if (target.os == "WINNT" and target.cpu == "x86") or target.kernel == "Darwin":
        return True

    # This should match the #defines in mozglue/misc/StackWalk.cpp
    if (target.cpu in ("x86", "ppc")) and (target.kernel in ("Darwin", "Linux")):
        return not have_unwind

    return False


imply_option("--enable-frame-pointers", True, when=phc_implies_frame_pointers)


with only_when(depends(target.os)(lambda os: os != "WINNT")):
    set_define("HAVE_STRNDUP", check_symbol("strndup"))
    set_define("HAVE_POSIX_MEMALIGN", check_symbol("posix_memalign"))
    set_define("HAVE_MEMALIGN", check_symbol("memalign"))
    set_define("HAVE_MALLOC_USABLE_SIZE", check_symbol("malloc_usable_size"))