Re: alignas (C11)
Thomas Munro <thomas.munro@gmail.com>
From: Thomas Munro <thomas.munro@gmail.com>
To: Peter Eisentraut <peter@eisentraut.org>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2025-11-12T14:17:09Z
Lists: pgsql-hackers
On Thu, Nov 13, 2025 at 12:39 AM Peter Eisentraut <peter@eisentraut.org> wrote: > - You cannot use alignas on a typedef. So some uses of the attribute > pg_attribute_aligned() like for PgAioUringContext or the whole int128 > business cannot be converted directly. The solution for cases like > PgAioUringContext could be to move the alignas into the struct, but I > haven't studied this code closely enough, so I'm leaving it. While studying atomics recently I noticed BUFFERALIGN, which was originally something like PG_IO_ALIGN_SIZE (see pg_config_manual.h), but is now used as an arbitrary fudge-factor by shared memory allocator-ish things that either know the memory will hold pg_atomic_uint64 or don't know what the memory will hold, since i386 has alignof(uint64_t, double) == 4, but alignof(_Atomic(uint64_t)) == 8, so MAXALIGN is not good enough. I think atomics.h should probably define MAXATOMICALIGN, or something like that. I prototyped that, which led me to pay attention to this __int128 (and typedef) situation, where we went the other way and convinced the compiler to underalign and generate different instructions to fit palloc(). (If palloc were ever used for cross-thread allocation motivating atomic storage, presumably i386 atomics would be an issue there too, but let's ignore that for now...). I guess today we could just do palloc_aligned(sizeof(Int128AggState), alignof(Int128AggState), MCXT_ALLOC_ZERO) for that, and let the compiler worry about the __int128 and its containing struct? I prototyped that and it seemed vaguely plausible, though I can see the argument against it is "what about when the type spreads and someone forgets?", but at first glance it seems to be much more localised than the atomics/shmem problem. IDK. In a very quick hack (so probably missing things) I also seemed to be able to get rid of all our ALIGNOF_ configure probes and just write alignof(int) when I want the alignment of int, move the MAXALIGN derivation into about two lines of c.h, and stuff alignof() inside the right structs as you said...
Commits
-
Further fix extended alignment for older g++.
- bd9dfac8b121 19 (unreleased) landed
-
Disable extended alignment uses on older g++
- 6ceef9408c26 19 (unreleased) landed
-
Work around buggy alignas in older g++
- a9bdb63bba8a 19 (unreleased) landed
-
Use C11 alignas in pg_atomic_uint64 definitions
- e7075a3405cc 19 (unreleased) landed
-
C11 alignas instead of unions -- extended alignments
- d4c0f91f7d57 19 (unreleased) landed
-
C11 alignas instead of unions
- 97e04c74bedb 19 (unreleased) landed
-
Add <stdalign.h> to c.h
- 300c8f532478 19 (unreleased) landed