1 // Copyright 2021 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/base/sanitizer/lsan-virtual-address-space.h"
6
7 #include "include/v8-platform.h"
8 #include "src/base/logging.h"
9
10 #if defined(LEAK_SANITIZER)
11 #include <sanitizer/lsan_interface.h>
12 #endif
13
14 namespace v8 {
15 namespace base {
16
LsanVirtualAddressSpace(std::unique_ptr<v8::VirtualAddressSpace> vas)17 LsanVirtualAddressSpace::LsanVirtualAddressSpace(
18 std::unique_ptr<v8::VirtualAddressSpace> vas)
19 : VirtualAddressSpace(vas->page_size(), vas->allocation_granularity(),
20 vas->base(), vas->size(),
21 vas->max_page_permissions()),
22 vas_(std::move(vas)) {
23 DCHECK_NOT_NULL(vas_);
24 }
25
AllocatePages(Address hint,size_t size,size_t alignment,PagePermissions permissions)26 Address LsanVirtualAddressSpace::AllocatePages(Address hint, size_t size,
27 size_t alignment,
28 PagePermissions permissions) {
29 Address result = vas_->AllocatePages(hint, size, alignment, permissions);
30 #if defined(LEAK_SANITIZER)
31 if (result) {
32 __lsan_register_root_region(reinterpret_cast<void*>(result), size);
33 }
34 #endif // defined(LEAK_SANITIZER)
35 return result;
36 }
37
FreePages(Address address,size_t size)38 void LsanVirtualAddressSpace::FreePages(Address address, size_t size) {
39 vas_->FreePages(address, size);
40 #if defined(LEAK_SANITIZER)
41 __lsan_unregister_root_region(reinterpret_cast<void*>(address), size);
42 #endif // defined(LEAK_SANITIZER)
43 }
44
AllocateSharedPages(Address hint,size_t size,PagePermissions permissions,PlatformSharedMemoryHandle handle,uint64_t offset)45 Address LsanVirtualAddressSpace::AllocateSharedPages(
46 Address hint, size_t size, PagePermissions permissions,
47 PlatformSharedMemoryHandle handle, uint64_t offset) {
48 Address result =
49 vas_->AllocateSharedPages(hint, size, permissions, handle, offset);
50 #if defined(LEAK_SANITIZER)
51 if (result) {
52 __lsan_register_root_region(reinterpret_cast<void*>(result), size);
53 }
54 #endif // defined(LEAK_SANITIZER)
55 return result;
56 }
57
FreeSharedPages(Address address,size_t size)58 void LsanVirtualAddressSpace::FreeSharedPages(Address address, size_t size) {
59 vas_->FreeSharedPages(address, size);
60 #if defined(LEAK_SANITIZER)
61 __lsan_unregister_root_region(reinterpret_cast<void*>(address), size);
62 #endif // defined(LEAK_SANITIZER)
63 }
64
AllocateSubspace(Address hint,size_t size,size_t alignment,PagePermissions max_page_permissions)65 std::unique_ptr<VirtualAddressSpace> LsanVirtualAddressSpace::AllocateSubspace(
66 Address hint, size_t size, size_t alignment,
67 PagePermissions max_page_permissions) {
68 auto subspace =
69 vas_->AllocateSubspace(hint, size, alignment, max_page_permissions);
70 #if defined(LEAK_SANITIZER)
71 if (subspace) {
72 subspace = std::make_unique<LsanVirtualAddressSpace>(std::move(subspace));
73 }
74 #endif // defined(LEAK_SANITIZER)
75 return subspace;
76 }
77
78 } // namespace base
79 } // namespace v8
80