tools: prefer cast::ffs over reinterpret_cast for alignment warnings

This commit is contained in:
Danny Robson 2024-02-21 14:58:43 +10:00
parent c5d2333cfc
commit db7f691624
2 changed files with 14 additions and 12 deletions

View File

@ -299,7 +299,7 @@ VkResult _vkCreateDebugReportCallbackEXT (
const VkAllocationCallbacks* pAllocator, const VkAllocationCallbacks* pAllocator,
VkDebugReportCallbackEXT* pCallback VkDebugReportCallbackEXT* pCallback
) noexcept { ) noexcept {
static auto fn = reinterpret_cast< static auto fn = cruft::cast::ffs<
decltype(_vkCreateDebugReportCallbackEXT)* decltype(_vkCreateDebugReportCallbackEXT)*
> ( > (
vkGetInstanceProcAddr ( vkGetInstanceProcAddr (

View File

@ -850,6 +850,7 @@ def write_dispatch(dst: TextIO, q: List[Type], reg: Registry):
#include "load/dispatch.hpp" #include "load/dispatch.hpp"
#include <cruft/util/debug/panic.hpp> #include <cruft/util/debug/panic.hpp>
#include <cruft/util/cast.hpp>
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
@ -871,11 +872,11 @@ def write_dispatch(dst: TextIO, q: List[Type], reg: Registry):
if (err != VK_SUCCESS) if (err != VK_SUCCESS)
return err; return err;
#define GET(NAME) res->table.NAME = reinterpret_cast<decltype(NAME)*> (cruft::vk::load::v_table->vk_icdGetInstanceProcAddr (res->handle, #NAME)); #define GET(NAME) res->table.NAME = cruft::cast::ffs<decltype(NAME)*> (cruft::vk::load::v_table->vk_icdGetInstanceProcAddr (res->handle, #NAME));
MAP_INSTANCE_COMMANDS(GET) MAP_INSTANCE_COMMANDS(GET)
#undef GET #undef GET
#define GET(NAME) if (!res->table.NAME) res->table.NAME = reinterpret_cast<decltype(NAME)*> (res->table.vkGetInstanceProcAddr (res->handle, #NAME)); #define GET(NAME) if (!res->table.NAME) res->table.NAME = cruft::cast::ffs<decltype(NAME)*> (res->table.vkGetInstanceProcAddr (res->handle, #NAME));
MAP_INSTANCE_COMMANDS(GET) MAP_INSTANCE_COMMANDS(GET)
#undef GET #undef GET
@ -885,7 +886,7 @@ def write_dispatch(dst: TextIO, q: List[Type], reg: Registry):
'vkGetInstanceProcAddr': """ 'vkGetInstanceProcAddr': """
std::clog << "InstanceProcAddr: " << pName << '\\n'; std::clog << "InstanceProcAddr: " << pName << '\\n';
#define ATTEMPT(NAME) if (!strcmp (#NAME, pName)) return reinterpret_cast<PFN_vkVoidFunction> (&NAME); #define ATTEMPT(NAME) if (!strcmp (#NAME, pName)) return cruft::cast::ffs<PFN_vkVoidFunction> (&NAME);
MAP_INSTANCE_COMMANDS(ATTEMPT) MAP_INSTANCE_COMMANDS(ATTEMPT)
#undef ATTEMPT #undef ATTEMPT
return nullptr; return nullptr;
@ -927,11 +928,11 @@ def write_dispatch(dst: TextIO, q: List[Type], reg: Registry):
//MAP_INSTANCE_COMMANDS(GET) //MAP_INSTANCE_COMMANDS(GET)
//#undef GET //#undef GET
#define GET(NAME) wrapped->table.NAME = wrapped->table.NAME ?: reinterpret_cast<decltype(NAME)*> (cruft::vk::load::v_table->vk_icdGetInstanceProcAddr (entry->handle, #NAME)); #define GET(NAME) wrapped->table.NAME = wrapped->table.NAME ?: cruft::cast::ffs<decltype(NAME)*> (cruft::vk::load::v_table->vk_icdGetInstanceProcAddr (entry->handle, #NAME));
MAP_INSTANCE_COMMANDS(GET) MAP_INSTANCE_COMMANDS(GET)
#undef GET #undef GET
#define GET(NAME) wrapped->table.NAME = wrapped->table.NAME ?: reinterpret_cast<decltype(NAME)*> (entry->table.vkGetInstanceProcAddr (entry->handle, #NAME)); #define GET(NAME) wrapped->table.NAME = wrapped->table.NAME ?: cruft::cast::ffs<decltype(NAME)*> (entry->table.vkGetInstanceProcAddr (entry->handle, #NAME));
MAP_INSTANCE_COMMANDS(GET) MAP_INSTANCE_COMMANDS(GET)
#undef GET #undef GET
@ -996,17 +997,19 @@ def write_trace(dst: TextIO, q: List[Type], reg: Registry):
#include "vk.hpp" #include "vk.hpp"
#include "load/vtable.hpp" #include "load/vtable.hpp"
#include "ostream.hpp" #include "ostream.hpp"
#include <iostream> #include <iostream>
#include <dlfcn.h> #include <dlfcn.h>
#include <cstring> #include <cstring>
#include <cruft/util/cast.hpp>
static void* g_lib; static void* g_lib;
void init [[gnu::constructor]] (void) { void init [[gnu::constructor]] (void) {
g_lib = dlopen (getenv ("REAL_VULKAN"), RTLD_LAZY | RTLD_LOCAL); g_lib = dlopen (getenv ("REAL_VULKAN"), RTLD_LAZY | RTLD_LOCAL);
} }
void deinit [[gnu::destructor]] (void) { void deinit [[gnu::destructor]] (void) {
dlclose (g_lib); dlclose (g_lib);
g_lib = nullptr; g_lib = nullptr;
@ -1014,7 +1017,6 @@ def write_trace(dst: TextIO, q: List[Type], reg: Registry):
#pragma GCC diagnostic ignored "-Wsign-promo" #pragma GCC diagnostic ignored "-Wsign-promo"
""") """)
for obj in (i for i in q if isinstance(i, Command)): for obj in (i for i in q if isinstance(i, Command)):
inner = "" inner = ""
if obj.name in ['vkGetInstanceProcAddr']: if obj.name in ['vkGetInstanceProcAddr']:
@ -1029,7 +1031,7 @@ def write_trace(dst: TextIO, q: List[Type], reg: Registry):
} }
#undef FWD #undef FWD
#define FWD(NAME) if (!strcmp(#NAME,pName)) { return reinterpret_cast<PFN_vkVoidFunction> (NAME); } #define FWD(NAME) if (!strcmp(#NAME,pName)) { return cruft::cast::ffs<PFN_vkVoidFunction> (NAME); }
MAP_INSTANCE_COMMANDS(FWD) MAP_INSTANCE_COMMANDS(FWD)
#undef FWD #undef FWD
std::clog << "Unhooked: " << pName << '\\n'; std::clog << "Unhooked: " << pName << '\\n';