summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorMatthias Görgens <matthias.goergens@gmail.com>2024-05-29 10:02:53 (GMT)
committerGitHub <noreply@github.com>2024-05-29 10:02:53 (GMT)
commit18c1a8d3a81bf8d287a06f2985bbf65c9a9b9794 (patch)
tree6d33a4e84521f7a912484cc9e1a51a05ab66528f /Doc
parentc1e9647107c854439a9864b6ec4f6784aeb94ed5 (diff)
downloadcpython-18c1a8d3a81bf8d287a06f2985bbf65c9a9b9794.zip
cpython-18c1a8d3a81bf8d287a06f2985bbf65c9a9b9794.tar.gz
cpython-18c1a8d3a81bf8d287a06f2985bbf65c9a9b9794.tar.bz2
gh-97588: Align ctypes struct layout to GCC/MSVC (GH-97702)
Structure layout, and especially bitfields, sometimes resulted in clearly wrong behaviour like overlapping fields. This fixes Co-authored-by: Gregory P. Smith <gps@python.org> Co-authored-by: Petr Viktorin <encukou@gmail.com>
Diffstat (limited to 'Doc')
-rw-r--r--Doc/library/ctypes.rst45
-rw-r--r--Doc/whatsnew/3.13.rst12
2 files changed, 49 insertions, 8 deletions
diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index 820535e..29b35af 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -661,14 +661,18 @@ for debugging because they can provide useful information::
guaranteed by the library to work in the general case. Unions and
structures with bit-fields should always be passed to functions by pointer.
-Structure/union alignment and byte order
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-By default, Structure and Union fields are aligned in the same way the C
-compiler does it. It is possible to override this behavior by specifying a
-:attr:`~Structure._pack_` class attribute in the subclass definition.
-This must be set to a positive integer and specifies the maximum alignment for the fields.
-This is what ``#pragma pack(n)`` also does in MSVC.
+Structure/union layout, alignment and byte order
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+By default, Structure and Union fields are laid out in the same way the C
+compiler does it. It is possible to override this behavior entirely by specifying a
+:attr:`~Structure._layout_` class attribute in the subclass definition; see
+the attribute documentation for details.
+
+It is possible to specify the maximum alignment for the fields by setting
+the :attr:`~Structure._pack_` class attribute to a positive integer.
+This matches what ``#pragma pack(n)`` does in MSVC.
+
It is also possible to set a minimum alignment for how the subclass itself is packed in the
same way ``#pragma align(n)`` works in MSVC.
This can be achieved by specifying a ::attr:`~Structure._align_` class attribute
@@ -2540,6 +2544,31 @@ fields, or any other data types containing pointer type fields.
the structure when being packed or unpacked to/from memory.
Setting this attribute to 0 is the same as not setting it at all.
+ .. attribute:: _layout_
+
+ An optional string naming the struct/union layout. It can currently
+ be set to:
+
+ - ``"ms"``: the layout used by the Microsoft compiler (MSVC).
+ On GCC and Clang, this layout can be selected with
+ ``__attribute__((ms_struct))``.
+ - ``"gcc-sysv"``: the layout used by GCC with the System V or “SysV-like”
+ data model, as used on Linux and macOS.
+ With this layout, :attr:`~Structure._pack_` must be unset or zero.
+
+ If not set explicitly, ``ctypes`` will use a default that
+ matches the platform conventions. This default may change in future
+ Python releases (for example, when a new platform gains official support,
+ or when a difference between similar platforms is found).
+ Currently the default will be:
+
+ - On Windows: ``"ms"``
+ - When :attr:`~Structure._pack_` is specified: ``"ms"``
+ - Otherwise: ``"gcc-sysv"``
+
+ :attr:`!_layout_` must already be defined when
+ :attr:`~Structure._fields_` is assigned, otherwise it will have no effect.
+
.. attribute:: _anonymous_
An optional sequence that lists the names of unnamed (anonymous) fields.
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 7edfdd4..2b1b5fd 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -656,6 +656,18 @@ copy
any user classes which define the :meth:`!__replace__` method.
(Contributed by Serhiy Storchaka in :gh:`108751`.)
+ctypes
+------
+
+* The layout of :ref:`bit fields <ctypes-bit-fields-in-structures-unions>` in
+ :class:`~ctypes.Structure` and :class:`~ctypes.Union` was improved to better
+ match platform defaults (GCC/Clang or MSC). In particular, fields no longer
+ overlap.
+ (Contributed by Matthias Görgens in :gh:`97702`.)
+* A :attr:`ctypes.Structure._layout_` class attribute can be set
+ to help match a non-default ABI.
+ (Contributed by Petr Viktorin in :gh:`97702`.)
+
dbm
---