util/tests: add gc_alloc_size alignment tests
authorRhys Perry <pendingchaos02@gmail.com>
Wed, 7 Jun 2023 11:13:22 +0000 (12:13 +0100)
committerMarge Bot <emma+marge@anholt.net>
Thu, 8 Jun 2023 18:15:13 +0000 (18:15 +0000)
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23501>

src/util/meson.build
src/util/ralloc.c
src/util/tests/gc_alloc_tests.cpp [new file with mode: 0644]

index 190eb5e..9d3e84f 100644 (file)
@@ -345,6 +345,7 @@ if with_tests
     'tests/dag_test.cpp',
     'tests/fast_idiv_by_const_test.cpp',
     'tests/fast_urem_by_const_test.cpp',
+    'tests/gc_alloc_tests.cpp',
     'tests/half_float_test.cpp',
     'tests/int_min_max.cpp',
     'tests/mesa-sha1_test.cpp',
index c3a4bef..d785ef4 100644 (file)
@@ -38,9 +38,9 @@
 #define CANARY 0x5A1106
 
 #if defined(__LP64__) || defined(_WIN64)
-#define HEADER_ALIGN alignas(16)
+#define HEADER_ALIGN 16
 #else
-#define HEADER_ALIGN alignas(8)
+#define HEADER_ALIGN 8
 #endif
 
 /* Align the header's size so that ralloc() allocations will return with the
@@ -50,7 +50,7 @@
  */
 struct ralloc_header
 {
-   HEADER_ALIGN
+   alignas(HEADER_ALIGN)
 
 #ifndef NDEBUG
    /* A canary value used to determine whether a pointer is ralloc'd. */
@@ -578,7 +578,7 @@ typedef struct
  * allocated using a freelist backed by a simple linear allocator.
  */
 typedef struct gc_slab {
-   HEADER_ALIGN
+   alignas(HEADER_ALIGN)
 
    gc_ctx *ctx;
 
@@ -801,6 +801,9 @@ gc_alloc_size(gc_ctx *ctx, size_t size, size_t align)
     */
    assert((align - alignof(gc_block_header)) <= 127);
 
+   /* We can only align as high as the slab is. */
+   assert(align <= HEADER_ALIGN);
+
    size_t header_size = align64(sizeof(gc_block_header), align);
    size = align64(size, align);
    size += header_size;
@@ -954,7 +957,7 @@ gc_sweep_end(gc_ctx *ctx)
 
 struct linear_header {
 
-   HEADER_ALIGN
+   alignas(HEADER_ALIGN)
 
 #ifndef NDEBUG
    unsigned magic;   /* for debugging */
diff --git a/src/util/tests/gc_alloc_tests.cpp b/src/util/tests/gc_alloc_tests.cpp
new file mode 100644 (file)
index 0000000..53ba6d0
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2023 Valve Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#include <gtest/gtest.h>
+#include "util/ralloc.h"
+
+#if defined(__LP64__) || defined(_WIN64)
+#define HEADER_ALIGN 16
+#else
+#define HEADER_ALIGN 8
+#endif
+
+TEST(gc_alloc, align)
+{
+   for (size_t size = 4; size <= 256; size += 4) {
+      for (size_t align = 4; align <= HEADER_ALIGN; align *= 2) {
+         gc_ctx *ctx = gc_context(NULL);
+
+         for (unsigned i = 0; i < 16; i++) {
+            uintptr_t ptr = (uintptr_t)gc_alloc_size(ctx, size, align);
+            EXPECT_EQ(ptr % align, 0);
+         }
+
+         ralloc_free(ctx);
+      }
+   }
+}