13d4bba30STeresa Johnson //===-- memprof_linux.cpp ------------------------------------------------===//
23d4bba30STeresa Johnson //
33d4bba30STeresa Johnson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43d4bba30STeresa Johnson // See https://llvm.org/LICENSE.txt for license information.
53d4bba30STeresa Johnson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63d4bba30STeresa Johnson //
73d4bba30STeresa Johnson //===----------------------------------------------------------------------===//
83d4bba30STeresa Johnson //
93d4bba30STeresa Johnson // This file is a part of MemProfiler, a memory profiler.
103d4bba30STeresa Johnson //
113d4bba30STeresa Johnson // Linux-specific details.
123d4bba30STeresa Johnson //===----------------------------------------------------------------------===//
133d4bba30STeresa Johnson 
143d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_platform.h"
153d4bba30STeresa Johnson #if !SANITIZER_LINUX
163d4bba30STeresa Johnson #error Unsupported OS
173d4bba30STeresa Johnson #endif
183d4bba30STeresa Johnson 
193d4bba30STeresa Johnson #include "memprof_interceptors.h"
203d4bba30STeresa Johnson #include "memprof_internal.h"
213d4bba30STeresa Johnson #include "memprof_thread.h"
223d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_flags.h"
233d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_freebsd.h"
243d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_libc.h"
253d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_procmaps.h"
263d4bba30STeresa Johnson 
273d4bba30STeresa Johnson #include <dlfcn.h>
283d4bba30STeresa Johnson #include <fcntl.h>
293d4bba30STeresa Johnson #include <limits.h>
303d4bba30STeresa Johnson #include <link.h>
313d4bba30STeresa Johnson #include <pthread.h>
323d4bba30STeresa Johnson #include <stdio.h>
333d4bba30STeresa Johnson #include <sys/mman.h>
343d4bba30STeresa Johnson #include <sys/resource.h>
353d4bba30STeresa Johnson #include <sys/syscall.h>
363d4bba30STeresa Johnson #include <sys/time.h>
373d4bba30STeresa Johnson #include <sys/types.h>
383d4bba30STeresa Johnson #include <sys/ucontext.h>
393d4bba30STeresa Johnson #include <unistd.h>
403d4bba30STeresa Johnson #include <unwind.h>
413d4bba30STeresa Johnson 
42*fde3ae88SFangrui Song extern ElfW(Dyn) _DYNAMIC[];
43*fde3ae88SFangrui Song 
443d4bba30STeresa Johnson typedef enum {
453d4bba30STeresa Johnson   MEMPROF_RT_VERSION_UNDEFINED = 0,
463d4bba30STeresa Johnson   MEMPROF_RT_VERSION_DYNAMIC,
473d4bba30STeresa Johnson   MEMPROF_RT_VERSION_STATIC,
483d4bba30STeresa Johnson } memprof_rt_version_t;
493d4bba30STeresa Johnson 
503d4bba30STeresa Johnson // FIXME: perhaps also store abi version here?
513d4bba30STeresa Johnson extern "C" {
523d4bba30STeresa Johnson SANITIZER_INTERFACE_ATTRIBUTE
533d4bba30STeresa Johnson memprof_rt_version_t __memprof_rt_version;
543d4bba30STeresa Johnson }
553d4bba30STeresa Johnson 
563d4bba30STeresa Johnson namespace __memprof {
573d4bba30STeresa Johnson 
InitializePlatformInterceptors()583d4bba30STeresa Johnson void InitializePlatformInterceptors() {}
InitializePlatformExceptionHandlers()593d4bba30STeresa Johnson void InitializePlatformExceptionHandlers() {}
603d4bba30STeresa Johnson 
MemprofDoesNotSupportStaticLinkage()613d4bba30STeresa Johnson void *MemprofDoesNotSupportStaticLinkage() {
623d4bba30STeresa Johnson   // This will fail to link with -static.
63*fde3ae88SFangrui Song   return &_DYNAMIC;
643d4bba30STeresa Johnson }
653d4bba30STeresa Johnson 
FindDynamicShadowStart()663d4bba30STeresa Johnson uptr FindDynamicShadowStart() {
673d4bba30STeresa Johnson   uptr shadow_size_bytes = MemToShadowSize(kHighMemEnd);
683d4bba30STeresa Johnson   return MapDynamicShadow(shadow_size_bytes, SHADOW_SCALE,
693d4bba30STeresa Johnson                           /*min_shadow_base_alignment*/ 0, kHighMemEnd);
703d4bba30STeresa Johnson }
713d4bba30STeresa Johnson 
MemprofDlSymNext(const char * sym)723d4bba30STeresa Johnson void *MemprofDlSymNext(const char *sym) { return dlsym(RTLD_NEXT, sym); }
733d4bba30STeresa Johnson 
743d4bba30STeresa Johnson } // namespace __memprof
75