> On Nov 12, 2025, at 19:39, Peter Eisentraut <[email protected]> wrote:
> 
> Here is another patch set to sprinkle some C11 features around the
> code.  My aim is to make a little bit of use of several C11 features
> as examples and encouragement for future code, and to test compilers.
> 
> Here, I'm proposing to make some use of the alignas specifier.  This takes 
> the place of compiler extensions such as __attribute__((aligned(a))) and 
> __declspec(align(a)), packaged up as pg_attribute_aligned(a), which are used 
> in a variety of places.  Also, we can simplify some places where unions are 
> used to encourage alignment, and remove a few workaround for lack of 
> alignment attribute support.
> 
> Some detail notes:
> 
> - Technically, compilers are only required to support alignas up to 
> (handwaving over some terminology) the largest alignment of a built-in type, 
> so maybe 8 or 16.  Support for larger alignments like 
> alignas(PG_CACHE_LINE_SIZE) is implementation-defined.  I have split up my 
> patches so that fundamental and extended alignments are in separate patches, 
> so this could be eased into, but I'm expecting that all compilers in 
> practical use support alignments up to PG_IO_ALIGN_SIZE. (For MSVC, 4096 
> appears to be the actual limit by default, per [0], but this is independent 
> of using alignas or __declspec.  I haven't found any explicit documentation 
> for clang or gcc.)
> 
> [0]: 
> https://learn.microsoft.com/en-us/cpp/build/reference/align-section-alignment?view=msvc-170
> 
> - 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.  For int128, there is no 
> straightforward solution, so I'm also leaving that as is.
> 
> (The reason for this restriction is that typedefs are supposed to be type 
> aliases that are interchangeable.  But if you have two otherwise compatible 
> typedefs with different alignments, this kind of violates the C type system 
> and the compiler has to do some nonstandard magic to handle this (or fail to, 
> see "checking for __int128 alignment bug").)
> 
> - You cannot use alignas to underalign a type.  So again, int128 cannot be 
> handled by this.
> 
> For at least these reasons, I'm leaving pg_attribute_aligned() and some of 
> its more tricky uses in place and unchanged.
> <0001-Add-stdalign.h-to-c.h.patch><0002-C11-alignas-instead-of-unions.patch><0003-Use-C11-alignas-in-pg_atomic_uint64-definitions.patch><0004-C11-alignas-instead-of-unions-extended-alignments.patch>

I can confirm that with this patch, build passed on MacOS 15.6.1, and “make 
check” passed as well.

0001 is a minimum and straightforward change that enables the use of C11’s 
alignas and alignof keywords throughout the PostgreSQL source.

0002 simplifies several structures/unions by using alignas, I have a couple of 
minor comment:

1 - 0002
```
-typedef union PGAlignedBlock
+typedef struct PGAlignedBlock
 {
-       char            data[BLCKSZ];
-       double          force_align_d;
-       int64           force_align_i64;
+       alignas(MAXIMUM_ALIGNOF) char data[BLCKSZ];
 } PGAlignedBlock;
```

As we changes PGAlignedBlock from union to structure, I think we can explicitly 
mention in the commit message something like “PGAlignedBlock has the same 
alignment and contiguous array data, thus no ABI change”.

2 - 0002
```
-       /* page_buffer must be adequately aligned, so use a union */
-       union
-       {
-               char            buf[QUEUE_PAGESIZE];
-               AsyncQueueEntry align;
-       }                       page_buffer;
+       /* page_buffer must be adequately aligned */
+       alignas(AsyncQueueEntry) char page_buffer[QUEUE_PAGESIZE];
```

To make readers easier to understand the statement, maybe we can explicitly use 
alignof:

alignas(alignof(AsyncQueueEntry)) char page_buffer[QUEUE_PAGESIZE];

0003 replaces pg_attribute_aligned(8) with alignas(8), no comment.

0004 removes "#ifdef pg_attribute_aligned”, I think that just disables support 
of very old compilers that we might no longer care about them, which should be 
okay. For 0004, the same comment as 1.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/






Reply via email to