Change AlignedType to have a void* array member so that swisstable backing arrays end up in the pointer-containing partition for heap partitioning. PiperOrigin-RevId: 834392373 Change-Id: I46c840995f68f96cdce10f7d3f3c7c43885a5ff8
diff --git a/absl/container/BUILD.bazel b/absl/container/BUILD.bazel index 68a9008..ab6533f 100644 --- a/absl/container/BUILD.bazel +++ b/absl/container/BUILD.bazel
@@ -429,6 +429,7 @@ deps = [ ":container_memory", ":test_instance_tracker", + "//absl/base:config", "//absl/base:no_destructor", "//absl/meta:type_traits", "//absl/strings",
diff --git a/absl/container/CMakeLists.txt b/absl/container/CMakeLists.txt index 6adba18..adce9a9 100644 --- a/absl/container/CMakeLists.txt +++ b/absl/container/CMakeLists.txt
@@ -484,6 +484,7 @@ COPTS ${ABSL_TEST_COPTS} DEPS + absl::config absl::container_memory absl::no_destructor absl::strings
diff --git a/absl/container/internal/container_memory.h b/absl/container/internal/container_memory.h index 8c97469..608a865 100644 --- a/absl/container/internal/container_memory.h +++ b/absl/container/internal/container_memory.h
@@ -44,7 +44,12 @@ namespace container_internal { template <size_t Alignment> -struct alignas(Alignment) AlignedType {}; +struct alignas(Alignment) AlignedType { + // When alignment is sufficient for the allocated memory to store pointers, + // include a pointer member so that swisstable backing arrays end up in the + // pointer-containing partition for heap partitioning. + std::conditional_t<(Alignment < alignof(void*)), char, void*> pointer; +}; // Allocates at least n bytes aligned to the specified alignment. // Alignment must be a power of 2. It must be positive.
diff --git a/absl/container/internal/container_memory_test.cc b/absl/container/internal/container_memory_test.cc index 97b09f7..946d1d3 100644 --- a/absl/container/internal/container_memory_test.cc +++ b/absl/container/internal/container_memory_test.cc
@@ -25,6 +25,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/base/no_destructor.h" #include "absl/container/internal/test_instance_tracker.h" #include "absl/meta/type_traits.h" @@ -42,6 +43,16 @@ using ::testing::Gt; using ::testing::Pair; +#if ABSL_HAVE_BUILTIN(__builtin_infer_alloc_token) +TEST(Memory, AlignedTypeAllocToken) { +#if defined(__wasm__) + GTEST_SKIP() << "Fails on wasm due to lack of heap partitioning support."; +#endif + EXPECT_GT(__builtin_infer_alloc_token(sizeof(AlignedType<alignof(void*)>)), + __builtin_infer_alloc_token(sizeof(int))); +} +#endif + TEST(Memory, AlignmentLargerThanBase) { std::allocator<int8_t> alloc; void* mem = Allocate<2>(&alloc, 3);