• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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