//===-- memprof_linux.cpp ------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of MemProfiler, a memory profiler. // // Linux-specific details. //===----------------------------------------------------------------------===// #include "sanitizer_common/sanitizer_platform.h" #if !SANITIZER_LINUX #error Unsupported OS #endif #include "memprof_interceptors.h" #include "memprof_internal.h" #include "memprof_thread.h" #include "sanitizer_common/sanitizer_flags.h" #include "sanitizer_common/sanitizer_freebsd.h" #include "sanitizer_common/sanitizer_libc.h" #include "sanitizer_common/sanitizer_procmaps.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern ElfW(Dyn) _DYNAMIC[]; typedef enum { MEMPROF_RT_VERSION_UNDEFINED = 0, MEMPROF_RT_VERSION_DYNAMIC, MEMPROF_RT_VERSION_STATIC, } memprof_rt_version_t; // FIXME: perhaps also store abi version here? extern "C" { SANITIZER_INTERFACE_ATTRIBUTE memprof_rt_version_t __memprof_rt_version; } namespace __memprof { void InitializePlatformInterceptors() {} void InitializePlatformExceptionHandlers() {} void *MemprofDoesNotSupportStaticLinkage() { // This will fail to link with -static. return &_DYNAMIC; } uptr FindDynamicShadowStart() { uptr shadow_size_bytes = MemToShadowSize(kHighMemEnd); return MapDynamicShadow(shadow_size_bytes, SHADOW_SCALE, /*min_shadow_base_alignment*/ 0, kHighMemEnd); } void ReadContextStack(void *context, uptr *stack, uptr *ssize) { ucontext_t *ucp = (ucontext_t *)context; *stack = (uptr)ucp->uc_stack.ss_sp; *ssize = ucp->uc_stack.ss_size; } void *MemprofDlSymNext(const char *sym) { return dlsym(RTLD_NEXT, sym); } } // namespace __memprof