summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Pfeil <[email protected]>2017-03-01 18:11:10 +0100
committerEric Anholt <[email protected]>2017-03-02 13:01:45 -0800
commitcd2b55e536dc806f9358f71db438dd9c246cdb14 (patch)
tree81a2c9826c2a0fe5173b722e3b1e7aa66c6f98b0
parenta7b8d50bcb56b5d093aee24a722f2a5288b79b14 (diff)
ralloc: Make sure ralloc() allocations match malloc()'s alignment.
The header of ralloc needs to be aligned, because the compiler assumes that malloc returns will be aligned to 8/16 bytes depending on the platform, leading to degraded performance or alignment faults with ralloc. Fixes SIGBUS on Raspberry Pi at high optimization levels. This patch is not perfect for MSVC, as maybe in the future the alignment for the most demanding data type might change to more than 8. v2: Commit message reword/typo fix, and add a bigger explanation in the code (by anholt) Signed-off-by: Jonas Pfeil <[email protected]> Reviewed-by: Matt Turner <[email protected]> Reviewed-by: Marek Olšák <[email protected]> Cc: [email protected]
-rw-r--r--src/util/ralloc.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/util/ralloc.c b/src/util/ralloc.c
index d5cc16766b1..03283de7180 100644
--- a/src/util/ralloc.c
+++ b/src/util/ralloc.c
@@ -51,7 +51,18 @@ _CRTIMP int _vscprintf(const char *format, va_list argptr);
#define CANARY 0x5A1106
-struct ralloc_header
+/* Align the header's size so that ralloc() allocations will return with the
+ * same alignment as a libc malloc would have (8 on 32-bit GLIBC, 16 on
+ * 64-bit), avoiding performance penalities on x86 and alignment faults on
+ * ARM.
+ */
+struct
+#ifdef _MSC_VER
+ __declspec(align(8))
+#else
+ __attribute__((aligned))
+#endif
+ ralloc_header
{
#ifdef DEBUG
/* A canary value used to determine whether a pointer is ralloc'd. */