Browse Source

vhacd: Fix -fpermissive build issue with MinGW

Fixes #27926.
Rémi Verschelde 6 years ago
parent
commit
74ab31b7f7

+ 53 - 0
thirdparty/vhacd/0002-fpermissive-fix.patch

@@ -0,0 +1,53 @@
+diff --git a/thirdparty/vhacd/inc/btScalar.h b/thirdparty/vhacd/inc/btScalar.h
+index 487205062..52297cd78 100644
+--- a/thirdparty/vhacd/inc/btScalar.h
++++ b/thirdparty/vhacd/inc/btScalar.h
+@@ -535,6 +535,29 @@ struct btTypedObject {
+     }
+ };
+ 
++// -- GODOT start --
++// Cherry-picked from Bullet 2.88 to fix GH-27926
++///align a pointer to the provided alignment, upwards
++template <typename T>
++T *btAlignPointer(T *unalignedPtr, size_t alignment)
++{
++    struct btConvertPointerSizeT
++    {
++        union {
++            T *ptr;
++            size_t integer;
++        };
++    };
++    btConvertPointerSizeT converter;
++
++    const size_t bit_mask = ~(alignment - 1);
++    converter.ptr = unalignedPtr;
++    converter.integer += alignment - 1;
++    converter.integer &= bit_mask;
++    return converter.ptr;
++}
++// -- GODOT end --
++
+ // -- GODOT start --
+ }; // namespace VHACD
+ // -- GODOT end --
+diff --git a/thirdparty/vhacd/src/btAlignedAllocator.cpp b/thirdparty/vhacd/src/btAlignedAllocator.cpp
+index ce0e7f26f..8dee31e7e 100644
+--- a/thirdparty/vhacd/src/btAlignedAllocator.cpp
++++ b/thirdparty/vhacd/src/btAlignedAllocator.cpp
+@@ -72,8 +72,12 @@ static inline void* btAlignedAllocDefault(size_t size, int32_t alignment)
+ 
+     real = (char*)sAllocFunc(size + sizeof(void*) + (alignment - 1));
+     if (real) {
+-        offset = (alignment - (unsigned long)(real + sizeof(void*))) & (alignment - 1);
+-        ret = (void*)((real + sizeof(void*)) + offset);
++        // -- GODOT start --
++        // Synced with Bullet 2.88 to fix GH-27926
++        //offset = (alignment - (unsigned long)(real + sizeof(void*))) & (alignment - 1);
++        //ret = (void*)((real + sizeof(void*)) + offset);
++        ret = btAlignPointer(real + sizeof(void *), alignment);
++        // -- GODOT end --
+         *((void**)(ret)-1) = (void*)(real);
+     }
+     else {

+ 23 - 0
thirdparty/vhacd/inc/btScalar.h

@@ -543,6 +543,29 @@ struct btTypedObject {
     }
 };
 
+// -- GODOT start --
+// Cherry-picked from Bullet 2.88 to fix GH-27926
+///align a pointer to the provided alignment, upwards
+template <typename T>
+T *btAlignPointer(T *unalignedPtr, size_t alignment)
+{
+    struct btConvertPointerSizeT
+    {
+        union {
+            T *ptr;
+            size_t integer;
+        };
+    };
+    btConvertPointerSizeT converter;
+
+    const size_t bit_mask = ~(alignment - 1);
+    converter.ptr = unalignedPtr;
+    converter.integer += alignment - 1;
+    converter.integer &= bit_mask;
+    return converter.ptr;
+}
+// -- GODOT end --
+
 // -- GODOT start --
 }; // namespace VHACD
 // -- GODOT end --

+ 6 - 2
thirdparty/vhacd/src/btAlignedAllocator.cpp

@@ -72,8 +72,12 @@ static inline void* btAlignedAllocDefault(size_t size, int32_t alignment)
 
     real = (char*)sAllocFunc(size + sizeof(void*) + (alignment - 1));
     if (real) {
-        offset = (alignment - (unsigned long)(real + sizeof(void*))) & (alignment - 1);
-        ret = (void*)((real + sizeof(void*)) + offset);
+        // -- GODOT start --
+        // Synced with Bullet 2.88 to fix GH-27926
+        //offset = (alignment - (unsigned long)(real + sizeof(void*))) & (alignment - 1);
+        //ret = (void*)((real + sizeof(void*)) + offset);
+        ret = btAlignPointer(real + sizeof(void *), alignment);
+        // -- GODOT end --
         *((void**)(ret)-1) = (void*)(real);
     }
     else {