# -*- 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(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, target, when="--enable-jemalloc", ) def phc_default(build_project, target): if build_project == "js": return False # 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 ("x86_64", "aarch64")) 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"))