)]}'
{
  "commit": "a995809c0cb81b7e2fc6b591b00c326d3babce48",
  "tree": "c1abb3b108a177a1dea7e8bc235e27400508c051",
  "parents": [
    "8ca2addca1c4011b6161671dfa89066e7108425f"
  ],
  "author": {
    "name": "Vitaly Goldshteyn",
    "email": "goldvitaly@google.com",
    "time": "Fri Oct 30 04:14:10 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Sat Oct 31 00:39:46 2026 -0700"
  },
  "message": "Split CustomAllocPolicy from AllocPolicy in SwissTable to reduce object file size.\n\nMotivation: every table instantiation emitted an AllocPolicy constant holding two function pointers (alloc and dealloc). Function pointers force the constant into .data.rel.ro with dynamic relocations and, with crel, a separate relocation section per COMDAT. Almost all tables use std::allocator with the standard backing array alignment, so this cost was paid for nothing.\n\nChange: AllocPolicy now contains only numeric type info (the same 16-byte layout as HashtableTypeInfo, down from 40 bytes) plus a one-bit flag saying whether the allocation is custom. The function pointers and the allocator offset move into a derived CustomAllocPolicy that is only instantiated for tables with a non-standard allocator or alignment. The flag lives in a spare bit of HashtableTypeInfo next to the hashtablez-enabled flag, so the struct size does not grow.\n\nIn raw_hash_set.cc the standard allocation and deallocation paths are inlined directly (a direct call to operator new / operator delete, which also keeps PGHO working), and the rare custom path is outlined into two cold, noinline free functions, CustomAllocate and CustomDeallocate. Their parameter order matches operator new and operator delete so the hot path sets up argument registers once before branching on the flag.\n\nAlong the way: the redundant alloc pointer parameter is dropped from Clear and ClearBackingArray; ClearBackingArrayNoReuse checks infoz once instead of three times; UnregisterAndDeallocBackingArray reads capacity after Unregister to avoid a spill across the cold call; and a few loads were reordered in PrepareInsertSmallNonSoo, ResizeEmptyNonAllocatedTableImpl and ResizeTableWithSeedChangeImpl to avoid jump-threading block duplication and register spills.\n\nPiperOrigin-RevId: 1010407551\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c9dd99d81e75d3e746cf533fe8a8d550041aa7ff",
      "old_mode": 33188,
      "old_path": "absl/container/internal/container_memory.h",
      "new_id": "8e0653a7940c201fce6c4e85606d1556bd5d471a",
      "new_mode": 33188,
      "new_path": "absl/container/internal/container_memory.h"
    },
    {
      "type": "modify",
      "old_id": "0c7d63a740de8f624b32d1be0ab07412499aa753",
      "old_mode": 33188,
      "old_path": "absl/container/internal/hashtablez_sampler.h",
      "new_id": "e54c62e6dc8b4bf658bc8ec6456ea9278236cff3",
      "new_mode": 33188,
      "new_path": "absl/container/internal/hashtablez_sampler.h"
    },
    {
      "type": "modify",
      "old_id": "d7e10597e6d77865d50b81792296f893643bd2ff",
      "old_mode": 33188,
      "old_path": "absl/container/internal/raw_hash_set.cc",
      "new_id": "0fb3f83355744629cf957d833bcb7ff4b73a072f",
      "new_mode": 33188,
      "new_path": "absl/container/internal/raw_hash_set.cc"
    },
    {
      "type": "modify",
      "old_id": "8ca006f18f48ad6acfa503c2017970f003ba40b2",
      "old_mode": 33188,
      "old_path": "absl/container/internal/raw_hash_set.h",
      "new_id": "1d0228055a24d4b41ce2752841551b09c287c4ac",
      "new_mode": 33188,
      "new_path": "absl/container/internal/raw_hash_set.h"
    }
  ]
}
