allocator_shim_override_cpp_symbols.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Copyright 2016 The Chromium 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. #ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_
  5. #error This header is meant to be included only once by allocator_shim.cc
  6. #endif
  7. #define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_
  8. // Preempt the default new/delete C++ symbols so they call the shim entry
  9. // points. This file is strongly inspired by tcmalloc's
  10. // libc_override_redefine.h.
  11. #include <new>
  12. #include "base/allocator/allocator_shim_internals.h"
  13. #include "base/compiler_specific.h"
  14. #include "build/build_config.h"
  15. #if !BUILDFLAG(IS_APPLE)
  16. #define SHIM_CPP_SYMBOLS_EXPORT SHIM_ALWAYS_EXPORT
  17. #else
  18. // On Apple OSes, prefer not exporting these symbols (as this reverts to the
  19. // default behavior, they are still exported in e.g. component builds). This is
  20. // partly due to intentional limits on exported symbols in the main library, but
  21. // it is also needless, since no library used on macOS imports these.
  22. //
  23. // TODO(lizeb): It may not be necessary anywhere to export these.
  24. #define SHIM_CPP_SYMBOLS_EXPORT NOINLINE
  25. #endif
  26. SHIM_CPP_SYMBOLS_EXPORT void* operator new(size_t size) {
  27. return ShimCppNew(size);
  28. }
  29. SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p) __THROW {
  30. ShimCppDelete(p);
  31. }
  32. SHIM_CPP_SYMBOLS_EXPORT void* operator new[](size_t size) {
  33. return ShimCppNew(size);
  34. }
  35. SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p) __THROW {
  36. ShimCppDelete(p);
  37. }
  38. SHIM_CPP_SYMBOLS_EXPORT void* operator new(size_t size,
  39. const std::nothrow_t&) __THROW {
  40. return ShimCppNewNoThrow(size);
  41. }
  42. SHIM_CPP_SYMBOLS_EXPORT void* operator new[](size_t size,
  43. const std::nothrow_t&) __THROW {
  44. return ShimCppNewNoThrow(size);
  45. }
  46. SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p,
  47. const std::nothrow_t&) __THROW {
  48. ShimCppDelete(p);
  49. }
  50. SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p,
  51. const std::nothrow_t&) __THROW {
  52. ShimCppDelete(p);
  53. }
  54. SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p, size_t) __THROW {
  55. ShimCppDelete(p);
  56. }
  57. SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p, size_t) __THROW {
  58. ShimCppDelete(p);
  59. }
  60. SHIM_CPP_SYMBOLS_EXPORT void* operator new(std::size_t size,
  61. std::align_val_t alignment) {
  62. return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
  63. }
  64. SHIM_CPP_SYMBOLS_EXPORT void* operator new(std::size_t size,
  65. std::align_val_t alignment,
  66. const std::nothrow_t&) __THROW {
  67. return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
  68. }
  69. SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p,
  70. std::align_val_t) __THROW {
  71. ShimCppDelete(p);
  72. }
  73. SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p,
  74. std::size_t size,
  75. std::align_val_t) __THROW {
  76. ShimCppDelete(p);
  77. }
  78. SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p,
  79. std::align_val_t,
  80. const std::nothrow_t&) __THROW {
  81. ShimCppDelete(p);
  82. }
  83. SHIM_CPP_SYMBOLS_EXPORT void* operator new[](std::size_t size,
  84. std::align_val_t alignment) {
  85. return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
  86. }
  87. SHIM_CPP_SYMBOLS_EXPORT void* operator new[](std::size_t size,
  88. std::align_val_t alignment,
  89. const std::nothrow_t&) __THROW {
  90. return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
  91. }
  92. SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p,
  93. std::align_val_t) __THROW {
  94. ShimCppDelete(p);
  95. }
  96. SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p,
  97. std::size_t size,
  98. std::align_val_t) __THROW {
  99. ShimCppDelete(p);
  100. }
  101. SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p,
  102. std::align_val_t,
  103. const std::nothrow_t&) __THROW {
  104. ShimCppDelete(p);
  105. }