Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/compiler-rt/lib/memprof/memprof_shadow_setup.cpp
35236 views
1
//===-- memprof_shadow_setup.cpp -----------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file is a part of MemProfiler, a memory profiler.
10
//
11
// Set up the shadow memory.
12
//===----------------------------------------------------------------------===//
13
14
#include "sanitizer_common/sanitizer_platform.h"
15
16
#include "memprof_internal.h"
17
#include "memprof_mapping.h"
18
19
namespace __memprof {
20
21
static void ProtectGap(uptr addr, uptr size) {
22
if (!flags()->protect_shadow_gap) {
23
// The shadow gap is unprotected, so there is a chance that someone
24
// is actually using this memory. Which means it needs a shadow...
25
uptr GapShadowBeg = RoundDownTo(MEM_TO_SHADOW(addr), GetPageSizeCached());
26
uptr GapShadowEnd =
27
RoundUpTo(MEM_TO_SHADOW(addr + size), GetPageSizeCached()) - 1;
28
if (Verbosity())
29
Printf("protect_shadow_gap=0:"
30
" not protecting shadow gap, allocating gap's shadow\n"
31
"|| `[%p, %p]` || ShadowGap's shadow ||\n",
32
GapShadowBeg, GapShadowEnd);
33
ReserveShadowMemoryRange(GapShadowBeg, GapShadowEnd,
34
"unprotected gap shadow");
35
return;
36
}
37
__sanitizer::ProtectGap(addr, size, kZeroBaseShadowStart,
38
kZeroBaseMaxShadowStart);
39
}
40
41
void InitializeShadowMemory() {
42
uptr shadow_start = FindDynamicShadowStart();
43
// Update the shadow memory address (potentially) used by instrumentation.
44
__memprof_shadow_memory_dynamic_address = shadow_start;
45
46
if (kLowShadowBeg)
47
shadow_start -= GetMmapGranularity();
48
49
if (Verbosity())
50
PrintAddressSpaceLayout();
51
52
// mmap the low shadow plus at least one page at the left.
53
if (kLowShadowBeg)
54
ReserveShadowMemoryRange(shadow_start, kLowShadowEnd, "low shadow");
55
// mmap the high shadow.
56
ReserveShadowMemoryRange(kHighShadowBeg, kHighShadowEnd, "high shadow");
57
// protect the gap.
58
ProtectGap(kShadowGapBeg, kShadowGapEnd - kShadowGapBeg + 1);
59
CHECK_EQ(kShadowGapEnd, kHighShadowBeg - 1);
60
}
61
62
} // namespace __memprof
63
64