Mesa (master): radv: Use linker pragma to simulate weak functions
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jan 26 09:25:38 UTC 2021
Module: Mesa
Branch: master
Commit: b7db6ceb9a7137db455711f4b8bbac7f32a0e78b
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b7db6ceb9a7137db455711f4b8bbac7f32a0e78b
Author: James Park <jpark37 at lagfreegames.com>
Date: Thu Nov 26 19:18:35 2020 -0800
radv: Use linker pragma to simulate weak functions
MSVC has an undocumented feature that can act as GCC weak functions.
Also fix warnings about returning a value from void functions.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7793>
---
src/amd/vulkan/radv_entrypoints_gen.py | 37 +++++++++++++++++++++++++++++++---
1 file changed, 34 insertions(+), 3 deletions(-)
diff --git a/src/amd/vulkan/radv_entrypoints_gen.py b/src/amd/vulkan/radv_entrypoints_gen.py
index 842f56d78af..6a3b3959a30 100644
--- a/src/amd/vulkan/radv_entrypoints_gen.py
+++ b/src/amd/vulkan/radv_entrypoints_gen.py
@@ -279,7 +279,14 @@ ${strmap(device_strmap, 'device')}
% if e.guard is not None:
#ifdef ${e.guard}
% endif
+#ifdef _MSC_VER
+ #pragma comment(linker, "/alternatename:${e.prefixed_name('radv')}_Weak=${e.prefixed_name('radv')}_Null")
+ #pragma comment(linker, "/alternatename:${e.prefixed_name('radv')}=${e.prefixed_name('radv')}_Weak")
+ ${e.return_type} (*${e.prefixed_name('radv')}_Null)(${e.decl_params()}) = 0;
+ ${e.return_type} ${e.prefixed_name('radv')}_Weak(${e.decl_params()});
+#else
${e.return_type} ${e.prefixed_name('radv')}(${e.decl_params()}) __attribute__ ((weak));
+#endif
% if e.guard is not None:
#endif // ${e.guard}
% endif
@@ -304,7 +311,14 @@ const struct radv_instance_dispatch_table radv_instance_dispatch_table = {
% if e.guard is not None:
#ifdef ${e.guard}
% endif
+#ifdef _MSC_VER
+ #pragma comment(linker, "/alternatename:${e.prefixed_name('radv')}_Weak=${e.prefixed_name('radv')}_Null")
+ #pragma comment(linker, "/alternatename:${e.prefixed_name('radv')}=${e.prefixed_name('radv')}_Weak")
+ ${e.return_type} (*${e.prefixed_name('radv')}_Null)(${e.decl_params()}) = 0;
+ ${e.return_type} ${e.prefixed_name('radv')}_Weak(${e.decl_params()});
+#else
${e.return_type} ${e.prefixed_name('radv')}(${e.decl_params()}) __attribute__ ((weak));
+#endif
% if e.guard is not None:
#endif // ${e.guard}
% endif
@@ -332,24 +346,37 @@ const struct radv_physical_device_dispatch_table radv_physical_device_dispatch_t
#ifdef ${e.guard}
% endif
% if layer == 'radv':
+#ifdef _MSC_VER
+ #pragma comment(linker, "/alternatename:${e.prefixed_name('radv')}=${e.prefixed_name('radv')}_Weak")
+ ${e.return_type}
+ ${e.prefixed_name('radv')}_Weak(${e.decl_params()})
+#else
${e.return_type} __attribute__ ((weak))
${e.prefixed_name('radv')}(${e.decl_params()})
+#endif
{
% if e.params[0].type == 'VkDevice':
RADV_FROM_HANDLE(radv_device, radv_device, ${e.params[0].name});
- return radv_device->dispatch.${e.name}(${e.call_params()});
+ ${'' if e.return_type == 'void' else 'return '}radv_device->dispatch.${e.name}(${e.call_params()});
% elif e.params[0].type == 'VkCommandBuffer':
RADV_FROM_HANDLE(radv_cmd_buffer, radv_cmd_buffer, ${e.params[0].name});
- return radv_cmd_buffer->device->dispatch.${e.name}(${e.call_params()});
+ ${'' if e.return_type == 'void' else 'return '}radv_cmd_buffer->device->dispatch.${e.name}(${e.call_params()});
% elif e.params[0].type == 'VkQueue':
RADV_FROM_HANDLE(radv_queue, radv_queue, ${e.params[0].name});
- return radv_queue->device->dispatch.${e.name}(${e.call_params()});
+ ${'' if e.return_type == 'void' else 'return '}radv_queue->device->dispatch.${e.name}(${e.call_params()});
% else:
assert(!"Unhandled device child trampoline case: ${e.params[0].type}");
% endif
}
% else:
+#ifdef _MSC_VER
+ #pragma comment(linker, "/alternatename:${e.prefixed_name(layer)}_Weak=${e.prefixed_name(layer)}_Null")
+ #pragma comment(linker, "/alternatename:${e.prefixed_name(layer)}=${e.prefixed_name(layer)}_Weak")
+ ${e.return_type} (*${e.prefixed_name(layer)}_Null)(${e.decl_params()}) = 0;
+ ${e.return_type} ${e.prefixed_name(layer)}_Weak(${e.decl_params()});
+#else
${e.return_type} ${e.prefixed_name(layer)}(${e.decl_params()}) __attribute__ ((weak));
+#endif
% endif
% if e.guard is not None:
#endif // ${e.guard}
@@ -508,7 +535,11 @@ radv_get_device_entry_name(int index)
return device_entry_name(index);
}
+#ifdef _MSC_VER
+__declspec(noinline) static void *
+#else
static void * __attribute__ ((noinline))
+#endif
radv_resolve_device_entrypoint(uint32_t index)
{
return radv_device_dispatch_table.entrypoints[index];
More information about the mesa-commit
mailing list