Skip to content

Commit

Permalink
Indicate that _PyGC_Head is only 8-byte aligned. (closes bpo-33374)
Browse files Browse the repository at this point in the history
By spec, the "long double" in _PyGC_Head requires the union to always be 16-byte
aligned. However, obmalloc only yields 8-byte alignment. Compilers including GCC
8 are starting to use alignment information to do store-merging. So, the "long
double" needs to be changed to a simple "double" as was long ago done in Python
3 by e348c8d. For 2.7, we need to add some
dummy padding to make sure _PyGC_Head stays the same size.
  • Loading branch information
fweimer authored and benjaminp committed Apr 29, 2018
1 parent bad9a58 commit 0b91f8a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 1 deletion.
17 changes: 16 additions & 1 deletion Include/objimpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,14 +248,29 @@ PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t);
/* for source compatibility with 2.2 */
#define _PyObject_GC_Del PyObject_GC_Del

/*
* Former over-aligned definition of PyGC_Head, used to compute the size of the
* padding for the new version below.
*/
union _gc_head;
union _gc_head_old {
struct {
union _gc_head_old *gc_next;
union _gc_head_old *gc_prev;
Py_ssize_t gc_refs;
} gc;
long double dummy;
};

/* GC information is stored BEFORE the object structure. */
typedef union _gc_head {
struct {
union _gc_head *gc_next;
union _gc_head *gc_prev;
Py_ssize_t gc_refs;
} gc;
long double dummy; /* force worst-case alignment */
double dummy; /* Force at least 8-byte alignment. */
char dummy_padding[sizeof(union _gc_head_old)];
} PyGC_Head;

extern PyGC_Head *_PyGC_generation0;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Tweak the definition of PyGC_Head, so compilers do not believe it is always
16-byte aligned on x86. This prevents crashes with more aggressive
optimizations present in GCC 8.

0 comments on commit 0b91f8a

Please sign in to comment.