Remove faulty fallback for unknown functions
authorCharles Giessen <charles@lunarg.com>
Wed, 15 May 2024 23:53:12 +0000 (18:53 -0500)
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>
Thu, 16 May 2024 00:51:35 +0000 (18:51 -0600)
This code was only used when the required assembly code for unknown function
was missing or intentionally disabled. Because it relied on the implementation
of the compiler to optimize the code in such a way as to not disturb passed in
parameters, the fallback code could not be relied on to work. Removing the
fallback path simplifies the support matrix by making unknown functions
definitely not supported (and will return NULL when queried), whereas with the
fallback the code may work or may crash.

BUILD.gn
loader/CMakeLists.txt
loader/unknown_ext_chain.c [deleted file]
loader/unknown_function_handling.c

index 2f7b0735b924d249ff6cb6a27be886de022c8207..e1d1780b061988c569f7d17e3b4e4de25b072022 100644 (file)
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -135,7 +135,6 @@ if (!is_android) {
       "loader/vk_loader_layer.h",
 
       # TODO(jmadill): Use assembler where available.
-      "loader/unknown_ext_chain.c",
       "loader/vk_loader_platform.h",
       "loader/wsi.c",
       "loader/wsi.h",
index 3cef9b6c32f4fa615705afe968075ff2929ed950..5a4caec288bf76215a837464a5c0805950ca22ed 100644 (file)
@@ -31,18 +31,6 @@ if(WIN32)
         set(CMAKE_C_STANDARD_LIBRARIES " ") # space is intentional
     endif()
 
-    # ~~~
-    # Build dev_ext_trampoline.c and unknown_ext_chain.c with /O2 to allow tail-call optimization.
-    # Setup two CMake targets (loader-norm and loader-opt) for the different compilation flags.
-    # ~~~
-    set(MODIFIED_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
-
-    string(REPLACE "/Od" "/O2" MODIFIED_C_FLAGS_DEBUG ${MODIFIED_C_FLAGS_DEBUG})
-    string(REPLACE "/Ob0" "/Ob2" MODIFIED_C_FLAGS_DEBUG ${MODIFIED_C_FLAGS_DEBUG})
-    string(REGEX REPLACE "/RTC." "" MODIFIED_C_FLAGS_DEBUG ${MODIFIED_C_FLAGS_DEBUG})  #remove run-time error checks
-
-    separate_arguments(MODIFIED_C_FLAGS_DEBUG WINDOWS_COMMAND ${MODIFIED_C_FLAGS_DEBUG})
-
     # ~~~
     # Only generate the loader.rc file with CMake if BUILD_DLL_VERSIONINFO was set.
     # This feature is for the Vulkan Runtime build
@@ -121,15 +109,11 @@ endif()
 
 set(OPT_LOADER_SRCS dev_ext_trampoline.c phys_dev_ext.c)
 
+set(ASM_FAILURE_MSG "Support for unknown physical device and device functions is disabled due to missing the required assembly support code. \
+To support unknown functions, assembly must be added for the platform.\n")
+
 # Check for assembler support
-set(ASM_FAILURE_MSG "The build will fall back on building with C code\n")
-set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG}Note that this may be unsafe, as the C code requires tail-call optimizations to remove")
-set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG} the stack frame for certain calls. If the compiler does not do this, then unknown device")
-set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG} extensions will suffer from a corrupted stack.")
-
-if (APPLE_UNIVERSAL_BINARY)
-    set(USE_ASSEMBLY_FALLBACK ON)
-elseif(WIN32 AND NOT USE_GAS)
+if(WIN32 AND NOT USE_GAS)
     option(USE_MASM "Use MASM" ON)
     if(USE_MASM AND MINGW)
         find_program(JWASM_FOUND NAMES jwasm uasm)
@@ -211,8 +195,9 @@ end
         target_link_libraries(loader-unknown-chain Vulkan::Headers)
         target_include_directories(loader-unknown-chain PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
         add_dependencies(loader-unknown-chain loader_asm_gen_files)
+        set(LOADER_UNKNOWN_CHAIN_LIBRARY $<TARGET_OBJECTS:loader-unknown-chain>)
+        set(UNKNOWN_FUNCTIONS_SUPPORTED ON)
     else()
-        set(USE_ASSEMBLY_FALLBACK ON)
         message(WARNING "Could not find working MASM assembler\n${ASM_FAILURE_MSG}")
     endif()
 elseif(UNIX OR MINGW OR (WIN32 AND USE_GAS)) # i.e.: Linux & Apple & MinGW & Windows using Clang-CL
@@ -312,8 +297,8 @@ elseif(UNIX OR MINGW OR (WIN32 AND USE_GAS)) # i.e.: Linux & Apple & MinGW & Win
         if (APPLE)
             set(MODIFY_UNKNOWN_FUNCTION_DECLS ON)
         endif()
+        set(UNKNOWN_FUNCTIONS_SUPPORTED ON)
     else()
-        set(USE_ASSEMBLY_FALLBACK ON)
         if(USE_GAS)
             message(WARNING "Could not find working ${ASM_OFFSET_SYSTEM_PROCESSOR} GAS assembler\n${ASM_FAILURE_MSG}")
         else()
@@ -322,32 +307,17 @@ elseif(UNIX OR MINGW OR (WIN32 AND USE_GAS)) # i.e.: Linux & Apple & MinGW & Win
     endif()
 endif()
 
-if(USE_ASSEMBLY_FALLBACK)
-    add_custom_target(loader_asm_gen_files)
-    if (MSVC)
-        add_library(loader-unknown-chain OBJECT unknown_ext_chain.c)
-        target_link_libraries(loader-unknown-chain loader_specific_options)
-        set_target_properties(loader-unknown-chain PROPERTIES CMAKE_C_FLAGS_DEBUG "${MODIFIED_C_FLAGS_DEBUG}")
-    else()
-        set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain.c)
-        set_source_files_properties(${OPT_LOADER_SRCS} PROPERTIES COMPILE_FLAGS -O)
-    endif()
+if(UNKNOWN_FUNCTIONS_SUPPORTED)
+    list(APPEND NORMAL_LOADER_SRCS ${OPT_LOADER_SRCS})
 endif()
 
 if(WIN32)
-    add_library(loader-opt STATIC ${OPT_LOADER_SRCS})
-    target_link_libraries(loader-opt PUBLIC loader_specific_options)
-    add_dependencies(loader-opt loader_asm_gen_files)
-    set_target_properties(loader-opt PROPERTIES CMAKE_C_FLAGS_DEBUG "${MODIFIED_C_FLAGS_DEBUG}")
-
     # If BUILD_DLL_VERSIONINFO was set, use the loader.rc in the build dir, otherwise use the checked in file
     set(RC_FILE_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/loader.rc)
     if (NOT "$CACHE{BUILD_DLL_VERSIONINFO}" STREQUAL "")
         set(RC_FILE_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/loader.rc)
     endif()
 
-    set(LOADER_UNKNOWN_CHAIN_LIBRARY $<$<TARGET_EXISTS:loader-unknown-chain>:$<TARGET_OBJECTS:loader-unknown-chain>>)
-
     add_library(vulkan
                 SHARED
                 ${NORMAL_LOADER_SRCS}
@@ -355,7 +325,7 @@ if(WIN32)
                 ${CMAKE_CURRENT_SOURCE_DIR}/${API_TYPE}-1.def
                 ${RC_FILE_LOCATION})
 
-    target_link_libraries(vulkan PRIVATE loader_specific_options loader-opt)
+    target_link_libraries(vulkan PRIVATE loader_specific_options)
 
     # when adding the suffix the import and runtime library names must be consistent
     # mingw: libvulkan-1.dll.a / vulkan-1.dll
@@ -377,8 +347,6 @@ if(WIN32)
        target_link_libraries(vulkan PRIVATE cfgmgr32)
     endif()
 
-    add_dependencies(vulkan loader_asm_gen_files)
-
 else()
     if(APPLE)
         option(APPLE_STATIC_LOADER "Build a loader that can be statically linked. Intended for Chromium usage/testing.")
@@ -395,9 +363,7 @@ else()
         add_library(vulkan SHARED)
     endif()
 
-    target_sources(vulkan PRIVATE ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS})
-
-    add_dependencies(vulkan loader_asm_gen_files)
+    target_sources(vulkan PRIVATE ${NORMAL_LOADER_SRCS})
 
     set_target_properties(vulkan PROPERTIES
         SOVERSION "1"
@@ -432,9 +398,12 @@ else()
         file(GLOB_RECURSE CONFIGURE_DEPENDS FRAMEWORK_HEADERS ${VulkanHeaders_INCLUDE_DIRS})
 
         add_library(vulkan-framework SHARED)
-        target_sources(vulkan-framework PRIVATE ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS} ${FRAMEWORK_HEADERS})
+        target_sources(vulkan-framework PRIVATE ${NORMAL_LOADER_SRCS} ${FRAMEWORK_HEADERS})
+
+        if (UNKNOWN_FUNCTIONS_SUPPORTED)
+            add_dependencies(vulkan-framework loader_asm_gen_files)
+        endif()
 
-        add_dependencies(vulkan-framework loader_asm_gen_files)
         target_link_libraries(vulkan-framework ${CMAKE_DL_LIBS} Threads::Threads -lm "-framework CoreFoundation")
         target_link_libraries(vulkan-framework loader_specific_options)
 
@@ -488,6 +457,11 @@ target_link_libraries(vulkan PRIVATE loader_specific_options)
 target_link_libraries(vulkan PRIVATE Vulkan::Headers)
 add_library(Vulkan::Loader ALIAS vulkan)
 
+if (UNKNOWN_FUNCTIONS_SUPPORTED)
+    target_compile_definitions(vulkan PRIVATE UNKNOWN_FUNCTIONS_SUPPORTED)
+    add_dependencies(vulkan loader_asm_gen_files)
+endif()
+
 if (APPLE_STATIC_LOADER)
     # TLDR: This feature only exists at the request of Google for Chromium. No other project should use this!
     message(NOTICE "Apple STATIC lib: it will be built but not installed, and vulkan.pc and VulkanLoaderConfig.cmake won't be generated!")
diff --git a/loader/unknown_ext_chain.c b/loader/unknown_ext_chain.c
deleted file mode 100644 (file)
index 4bcf1d5..0000000
+++ /dev/null
@@ -1,820 +0,0 @@
-/*
- * Copyright (c) 2017-2021 The Khronos Group Inc.
- * Copyright (c) 2017-2021 Valve Corporation
- * Copyright (c) 2017-2021 LunarG, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Author Jon Ashburn <jon@lunarg.com>
- * Author: Lenny Komow <lenny@lunarg.com>
- * Author: Charles Giessen <charles@lunarg.com>
- */
-
-// This code is used to pass on physical device extensions through the call chain. It must do this without creating a stack frame,
-// because the actual parameters of the call are not known. Since the first parameter is known to be a VkPhysicalDevice, it can
-// unwrap the physical device, overwriting the wrapped device, and then jump to the next function in the call chain. This code
-// attempts to accomplish this by relying on tail-call optimizations, but there is no guarantee that this will work. As a result,
-// this code is only compiled on systems where an assembly alternative has not been written.
-
-#include "loader.h"
-#include "log.h"
-
-#if defined(__GNUC__) && !defined(__clang__)
-#pragma GCC optimize(3)  // force gcc to use tail-calls
-#endif
-
-// Trampoline function macro for unknown physical device extension command.
-#define PhysDevExtTramp(num)                                                              \
-    VKAPI_ATTR void VKAPI_CALL vkPhysDevExtTramp##num(VkPhysicalDevice physical_device) { \
-        const struct loader_instance_dispatch_table *disp;                                \
-        disp = loader_get_instance_dispatch(physical_device);                             \
-        disp->phys_dev_ext[num](loader_unwrap_physical_device(physical_device));          \
-    }
-
-// Terminator function macro for unknown physical device extension command.
-#define PhysDevExtTermin(num)                                                                                      \
-    VKAPI_ATTR void VKAPI_CALL vkPhysDevExtTermin##num(VkPhysicalDevice physical_device) {                         \
-        struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physical_device; \
-        struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;                                           \
-        struct loader_instance *inst = (struct loader_instance *)icd_term->this_instance;                          \
-        if (NULL == icd_term->phys_dev_ext[num]) {                                                                 \
-            loader_log(inst, VULKAN_LOADER_ERROR_BIT, 0, "Function %s not supported for this physical device",     \
-                       inst->phys_dev_ext_disp_functions[num]);                                                    \
-        }                                                                                                          \
-        icd_term->phys_dev_ext[num](phys_dev_term->phys_dev);                                                      \
-    }
-
-// Trampoline function macro for unknown physical device extension command.
-#define DevExtTramp(num)                                         \
-    VKAPI_ATTR void VKAPI_CALL vkdev_ext##num(VkDevice device) { \
-        const struct loader_dev_dispatch_table *disp;            \
-        disp = loader_get_dev_dispatch(device);                  \
-        disp->ext_dispatch[num](device);                         \
-    }
-
-// clang-format off
-// Instantiations of the trampoline
-PhysDevExtTramp(0)
-PhysDevExtTramp(1)
-PhysDevExtTramp(2)
-PhysDevExtTramp(3)
-PhysDevExtTramp(4)
-PhysDevExtTramp(5)
-PhysDevExtTramp(6)
-PhysDevExtTramp(7)
-PhysDevExtTramp(8)
-PhysDevExtTramp(9)
-PhysDevExtTramp(10)
-PhysDevExtTramp(11)
-PhysDevExtTramp(12)
-PhysDevExtTramp(13)
-PhysDevExtTramp(14)
-PhysDevExtTramp(15)
-PhysDevExtTramp(16)
-PhysDevExtTramp(17)
-PhysDevExtTramp(18)
-PhysDevExtTramp(19)
-PhysDevExtTramp(20)
-PhysDevExtTramp(21)
-PhysDevExtTramp(22)
-PhysDevExtTramp(23)
-PhysDevExtTramp(24)
-PhysDevExtTramp(25)
-PhysDevExtTramp(26)
-PhysDevExtTramp(27)
-PhysDevExtTramp(28)
-PhysDevExtTramp(29)
-PhysDevExtTramp(30)
-PhysDevExtTramp(31)
-PhysDevExtTramp(32)
-PhysDevExtTramp(33)
-PhysDevExtTramp(34)
-PhysDevExtTramp(35)
-PhysDevExtTramp(36)
-PhysDevExtTramp(37)
-PhysDevExtTramp(38)
-PhysDevExtTramp(39)
-PhysDevExtTramp(40)
-PhysDevExtTramp(41)
-PhysDevExtTramp(42)
-PhysDevExtTramp(43)
-PhysDevExtTramp(44)
-PhysDevExtTramp(45)
-PhysDevExtTramp(46)
-PhysDevExtTramp(47)
-PhysDevExtTramp(48)
-PhysDevExtTramp(49)
-PhysDevExtTramp(50)
-PhysDevExtTramp(51)
-PhysDevExtTramp(52)
-PhysDevExtTramp(53)
-PhysDevExtTramp(54)
-PhysDevExtTramp(55)
-PhysDevExtTramp(56)
-PhysDevExtTramp(57)
-PhysDevExtTramp(58)
-PhysDevExtTramp(59)
-PhysDevExtTramp(60)
-PhysDevExtTramp(61)
-PhysDevExtTramp(62)
-PhysDevExtTramp(63)
-PhysDevExtTramp(64)
-PhysDevExtTramp(65)
-PhysDevExtTramp(66)
-PhysDevExtTramp(67)
-PhysDevExtTramp(68)
-PhysDevExtTramp(69)
-PhysDevExtTramp(70)
-PhysDevExtTramp(71)
-PhysDevExtTramp(72)
-PhysDevExtTramp(73)
-PhysDevExtTramp(74)
-PhysDevExtTramp(75)
-PhysDevExtTramp(76)
-PhysDevExtTramp(77)
-PhysDevExtTramp(78)
-PhysDevExtTramp(79)
-PhysDevExtTramp(80)
-PhysDevExtTramp(81)
-PhysDevExtTramp(82)
-PhysDevExtTramp(83)
-PhysDevExtTramp(84)
-PhysDevExtTramp(85)
-PhysDevExtTramp(86)
-PhysDevExtTramp(87)
-PhysDevExtTramp(88)
-PhysDevExtTramp(89)
-PhysDevExtTramp(90)
-PhysDevExtTramp(91)
-PhysDevExtTramp(92)
-PhysDevExtTramp(93)
-PhysDevExtTramp(94)
-PhysDevExtTramp(95)
-PhysDevExtTramp(96)
-PhysDevExtTramp(97)
-PhysDevExtTramp(98)
-PhysDevExtTramp(99)
-PhysDevExtTramp(100)
-PhysDevExtTramp(101)
-PhysDevExtTramp(102)
-PhysDevExtTramp(103)
-PhysDevExtTramp(104)
-PhysDevExtTramp(105)
-PhysDevExtTramp(106)
-PhysDevExtTramp(107)
-PhysDevExtTramp(108)
-PhysDevExtTramp(109)
-PhysDevExtTramp(110)
-PhysDevExtTramp(111)
-PhysDevExtTramp(112)
-PhysDevExtTramp(113)
-PhysDevExtTramp(114)
-PhysDevExtTramp(115)
-PhysDevExtTramp(116)
-PhysDevExtTramp(117)
-PhysDevExtTramp(118)
-PhysDevExtTramp(119)
-PhysDevExtTramp(120)
-PhysDevExtTramp(121)
-PhysDevExtTramp(122)
-PhysDevExtTramp(123)
-PhysDevExtTramp(124)
-PhysDevExtTramp(125)
-PhysDevExtTramp(126)
-PhysDevExtTramp(127)
-PhysDevExtTramp(128)
-PhysDevExtTramp(129)
-PhysDevExtTramp(130)
-PhysDevExtTramp(131)
-PhysDevExtTramp(132)
-PhysDevExtTramp(133)
-PhysDevExtTramp(134)
-PhysDevExtTramp(135)
-PhysDevExtTramp(136)
-PhysDevExtTramp(137)
-PhysDevExtTramp(138)
-PhysDevExtTramp(139)
-PhysDevExtTramp(140)
-PhysDevExtTramp(141)
-PhysDevExtTramp(142)
-PhysDevExtTramp(143)
-PhysDevExtTramp(144)
-PhysDevExtTramp(145)
-PhysDevExtTramp(146)
-PhysDevExtTramp(147)
-PhysDevExtTramp(148)
-PhysDevExtTramp(149)
-PhysDevExtTramp(150)
-PhysDevExtTramp(151)
-PhysDevExtTramp(152)
-PhysDevExtTramp(153)
-PhysDevExtTramp(154)
-PhysDevExtTramp(155)
-PhysDevExtTramp(156)
-PhysDevExtTramp(157)
-PhysDevExtTramp(158)
-PhysDevExtTramp(159)
-PhysDevExtTramp(160)
-PhysDevExtTramp(161)
-PhysDevExtTramp(162)
-PhysDevExtTramp(163)
-PhysDevExtTramp(164)
-PhysDevExtTramp(165)
-PhysDevExtTramp(166)
-PhysDevExtTramp(167)
-PhysDevExtTramp(168)
-PhysDevExtTramp(169)
-PhysDevExtTramp(170)
-PhysDevExtTramp(171)
-PhysDevExtTramp(172)
-PhysDevExtTramp(173)
-PhysDevExtTramp(174)
-PhysDevExtTramp(175)
-PhysDevExtTramp(176)
-PhysDevExtTramp(177)
-PhysDevExtTramp(178)
-PhysDevExtTramp(179)
-PhysDevExtTramp(180)
-PhysDevExtTramp(181)
-PhysDevExtTramp(182)
-PhysDevExtTramp(183)
-PhysDevExtTramp(184)
-PhysDevExtTramp(185)
-PhysDevExtTramp(186)
-PhysDevExtTramp(187)
-PhysDevExtTramp(188)
-PhysDevExtTramp(189)
-PhysDevExtTramp(190)
-PhysDevExtTramp(191)
-PhysDevExtTramp(192)
-PhysDevExtTramp(193)
-PhysDevExtTramp(194)
-PhysDevExtTramp(195)
-PhysDevExtTramp(196)
-PhysDevExtTramp(197)
-PhysDevExtTramp(198)
-PhysDevExtTramp(199)
-PhysDevExtTramp(200)
-PhysDevExtTramp(201)
-PhysDevExtTramp(202)
-PhysDevExtTramp(203)
-PhysDevExtTramp(204)
-PhysDevExtTramp(205)
-PhysDevExtTramp(206)
-PhysDevExtTramp(207)
-PhysDevExtTramp(208)
-PhysDevExtTramp(209)
-PhysDevExtTramp(210)
-PhysDevExtTramp(211)
-PhysDevExtTramp(212)
-PhysDevExtTramp(213)
-PhysDevExtTramp(214)
-PhysDevExtTramp(215)
-PhysDevExtTramp(216)
-PhysDevExtTramp(217)
-PhysDevExtTramp(218)
-PhysDevExtTramp(219)
-PhysDevExtTramp(220)
-PhysDevExtTramp(221)
-PhysDevExtTramp(222)
-PhysDevExtTramp(223)
-PhysDevExtTramp(224)
-PhysDevExtTramp(225)
-PhysDevExtTramp(226)
-PhysDevExtTramp(227)
-PhysDevExtTramp(228)
-PhysDevExtTramp(229)
-PhysDevExtTramp(230)
-PhysDevExtTramp(231)
-PhysDevExtTramp(232)
-PhysDevExtTramp(233)
-PhysDevExtTramp(234)
-PhysDevExtTramp(235)
-PhysDevExtTramp(236)
-PhysDevExtTramp(237)
-PhysDevExtTramp(238)
-PhysDevExtTramp(239)
-PhysDevExtTramp(240)
-PhysDevExtTramp(241)
-PhysDevExtTramp(242)
-PhysDevExtTramp(243)
-PhysDevExtTramp(244)
-PhysDevExtTramp(245)
-PhysDevExtTramp(246)
-PhysDevExtTramp(247)
-PhysDevExtTramp(248)
-PhysDevExtTramp(249)
-
-// Instantiations of the terminator
-PhysDevExtTermin(0)
-PhysDevExtTermin(1)
-PhysDevExtTermin(2)
-PhysDevExtTermin(3)
-PhysDevExtTermin(4)
-PhysDevExtTermin(5)
-PhysDevExtTermin(6)
-PhysDevExtTermin(7)
-PhysDevExtTermin(8)
-PhysDevExtTermin(9)
-PhysDevExtTermin(10)
-PhysDevExtTermin(11)
-PhysDevExtTermin(12)
-PhysDevExtTermin(13)
-PhysDevExtTermin(14)
-PhysDevExtTermin(15)
-PhysDevExtTermin(16)
-PhysDevExtTermin(17)
-PhysDevExtTermin(18)
-PhysDevExtTermin(19)
-PhysDevExtTermin(20)
-PhysDevExtTermin(21)
-PhysDevExtTermin(22)
-PhysDevExtTermin(23)
-PhysDevExtTermin(24)
-PhysDevExtTermin(25)
-PhysDevExtTermin(26)
-PhysDevExtTermin(27)
-PhysDevExtTermin(28)
-PhysDevExtTermin(29)
-PhysDevExtTermin(30)
-PhysDevExtTermin(31)
-PhysDevExtTermin(32)
-PhysDevExtTermin(33)
-PhysDevExtTermin(34)
-PhysDevExtTermin(35)
-PhysDevExtTermin(36)
-PhysDevExtTermin(37)
-PhysDevExtTermin(38)
-PhysDevExtTermin(39)
-PhysDevExtTermin(40)
-PhysDevExtTermin(41)
-PhysDevExtTermin(42)
-PhysDevExtTermin(43)
-PhysDevExtTermin(44)
-PhysDevExtTermin(45)
-PhysDevExtTermin(46)
-PhysDevExtTermin(47)
-PhysDevExtTermin(48)
-PhysDevExtTermin(49)
-PhysDevExtTermin(50)
-PhysDevExtTermin(51)
-PhysDevExtTermin(52)
-PhysDevExtTermin(53)
-PhysDevExtTermin(54)
-PhysDevExtTermin(55)
-PhysDevExtTermin(56)
-PhysDevExtTermin(57)
-PhysDevExtTermin(58)
-PhysDevExtTermin(59)
-PhysDevExtTermin(60)
-PhysDevExtTermin(61)
-PhysDevExtTermin(62)
-PhysDevExtTermin(63)
-PhysDevExtTermin(64)
-PhysDevExtTermin(65)
-PhysDevExtTermin(66)
-PhysDevExtTermin(67)
-PhysDevExtTermin(68)
-PhysDevExtTermin(69)
-PhysDevExtTermin(70)
-PhysDevExtTermin(71)
-PhysDevExtTermin(72)
-PhysDevExtTermin(73)
-PhysDevExtTermin(74)
-PhysDevExtTermin(75)
-PhysDevExtTermin(76)
-PhysDevExtTermin(77)
-PhysDevExtTermin(78)
-PhysDevExtTermin(79)
-PhysDevExtTermin(80)
-PhysDevExtTermin(81)
-PhysDevExtTermin(82)
-PhysDevExtTermin(83)
-PhysDevExtTermin(84)
-PhysDevExtTermin(85)
-PhysDevExtTermin(86)
-PhysDevExtTermin(87)
-PhysDevExtTermin(88)
-PhysDevExtTermin(89)
-PhysDevExtTermin(90)
-PhysDevExtTermin(91)
-PhysDevExtTermin(92)
-PhysDevExtTermin(93)
-PhysDevExtTermin(94)
-PhysDevExtTermin(95)
-PhysDevExtTermin(96)
-PhysDevExtTermin(97)
-PhysDevExtTermin(98)
-PhysDevExtTermin(99)
-PhysDevExtTermin(100)
-PhysDevExtTermin(101)
-PhysDevExtTermin(102)
-PhysDevExtTermin(103)
-PhysDevExtTermin(104)
-PhysDevExtTermin(105)
-PhysDevExtTermin(106)
-PhysDevExtTermin(107)
-PhysDevExtTermin(108)
-PhysDevExtTermin(109)
-PhysDevExtTermin(110)
-PhysDevExtTermin(111)
-PhysDevExtTermin(112)
-PhysDevExtTermin(113)
-PhysDevExtTermin(114)
-PhysDevExtTermin(115)
-PhysDevExtTermin(116)
-PhysDevExtTermin(117)
-PhysDevExtTermin(118)
-PhysDevExtTermin(119)
-PhysDevExtTermin(120)
-PhysDevExtTermin(121)
-PhysDevExtTermin(122)
-PhysDevExtTermin(123)
-PhysDevExtTermin(124)
-PhysDevExtTermin(125)
-PhysDevExtTermin(126)
-PhysDevExtTermin(127)
-PhysDevExtTermin(128)
-PhysDevExtTermin(129)
-PhysDevExtTermin(130)
-PhysDevExtTermin(131)
-PhysDevExtTermin(132)
-PhysDevExtTermin(133)
-PhysDevExtTermin(134)
-PhysDevExtTermin(135)
-PhysDevExtTermin(136)
-PhysDevExtTermin(137)
-PhysDevExtTermin(138)
-PhysDevExtTermin(139)
-PhysDevExtTermin(140)
-PhysDevExtTermin(141)
-PhysDevExtTermin(142)
-PhysDevExtTermin(143)
-PhysDevExtTermin(144)
-PhysDevExtTermin(145)
-PhysDevExtTermin(146)
-PhysDevExtTermin(147)
-PhysDevExtTermin(148)
-PhysDevExtTermin(149)
-PhysDevExtTermin(150)
-PhysDevExtTermin(151)
-PhysDevExtTermin(152)
-PhysDevExtTermin(153)
-PhysDevExtTermin(154)
-PhysDevExtTermin(155)
-PhysDevExtTermin(156)
-PhysDevExtTermin(157)
-PhysDevExtTermin(158)
-PhysDevExtTermin(159)
-PhysDevExtTermin(160)
-PhysDevExtTermin(161)
-PhysDevExtTermin(162)
-PhysDevExtTermin(163)
-PhysDevExtTermin(164)
-PhysDevExtTermin(165)
-PhysDevExtTermin(166)
-PhysDevExtTermin(167)
-PhysDevExtTermin(168)
-PhysDevExtTermin(169)
-PhysDevExtTermin(170)
-PhysDevExtTermin(171)
-PhysDevExtTermin(172)
-PhysDevExtTermin(173)
-PhysDevExtTermin(174)
-PhysDevExtTermin(175)
-PhysDevExtTermin(176)
-PhysDevExtTermin(177)
-PhysDevExtTermin(178)
-PhysDevExtTermin(179)
-PhysDevExtTermin(180)
-PhysDevExtTermin(181)
-PhysDevExtTermin(182)
-PhysDevExtTermin(183)
-PhysDevExtTermin(184)
-PhysDevExtTermin(185)
-PhysDevExtTermin(186)
-PhysDevExtTermin(187)
-PhysDevExtTermin(188)
-PhysDevExtTermin(189)
-PhysDevExtTermin(190)
-PhysDevExtTermin(191)
-PhysDevExtTermin(192)
-PhysDevExtTermin(193)
-PhysDevExtTermin(194)
-PhysDevExtTermin(195)
-PhysDevExtTermin(196)
-PhysDevExtTermin(197)
-PhysDevExtTermin(198)
-PhysDevExtTermin(199)
-PhysDevExtTermin(200)
-PhysDevExtTermin(201)
-PhysDevExtTermin(202)
-PhysDevExtTermin(203)
-PhysDevExtTermin(204)
-PhysDevExtTermin(205)
-PhysDevExtTermin(206)
-PhysDevExtTermin(207)
-PhysDevExtTermin(208)
-PhysDevExtTermin(209)
-PhysDevExtTermin(210)
-PhysDevExtTermin(211)
-PhysDevExtTermin(212)
-PhysDevExtTermin(213)
-PhysDevExtTermin(214)
-PhysDevExtTermin(215)
-PhysDevExtTermin(216)
-PhysDevExtTermin(217)
-PhysDevExtTermin(218)
-PhysDevExtTermin(219)
-PhysDevExtTermin(220)
-PhysDevExtTermin(221)
-PhysDevExtTermin(222)
-PhysDevExtTermin(223)
-PhysDevExtTermin(224)
-PhysDevExtTermin(225)
-PhysDevExtTermin(226)
-PhysDevExtTermin(227)
-PhysDevExtTermin(228)
-PhysDevExtTermin(229)
-PhysDevExtTermin(230)
-PhysDevExtTermin(231)
-PhysDevExtTermin(232)
-PhysDevExtTermin(233)
-PhysDevExtTermin(234)
-PhysDevExtTermin(235)
-PhysDevExtTermin(236)
-PhysDevExtTermin(237)
-PhysDevExtTermin(238)
-PhysDevExtTermin(239)
-PhysDevExtTermin(240)
-PhysDevExtTermin(241)
-PhysDevExtTermin(242)
-PhysDevExtTermin(243)
-PhysDevExtTermin(244)
-PhysDevExtTermin(245)
-PhysDevExtTermin(246)
-PhysDevExtTermin(247)
-PhysDevExtTermin(248)
-PhysDevExtTermin(249)
-
-// Instantiations of the device trampoline
-DevExtTramp(0)
-DevExtTramp(1)
-DevExtTramp(2)
-DevExtTramp(3)
-DevExtTramp(4)
-DevExtTramp(5)
-DevExtTramp(6)
-DevExtTramp(7)
-DevExtTramp(8)
-DevExtTramp(9)
-DevExtTramp(10)
-DevExtTramp(11)
-DevExtTramp(12)
-DevExtTramp(13)
-DevExtTramp(14)
-DevExtTramp(15)
-DevExtTramp(16)
-DevExtTramp(17)
-DevExtTramp(18)
-DevExtTramp(19)
-DevExtTramp(20)
-DevExtTramp(21)
-DevExtTramp(22)
-DevExtTramp(23)
-DevExtTramp(24)
-DevExtTramp(25)
-DevExtTramp(26)
-DevExtTramp(27)
-DevExtTramp(28)
-DevExtTramp(29)
-DevExtTramp(30)
-DevExtTramp(31)
-DevExtTramp(32)
-DevExtTramp(33)
-DevExtTramp(34)
-DevExtTramp(35)
-DevExtTramp(36)
-DevExtTramp(37)
-DevExtTramp(38)
-DevExtTramp(39)
-DevExtTramp(40)
-DevExtTramp(41)
-DevExtTramp(42)
-DevExtTramp(43)
-DevExtTramp(44)
-DevExtTramp(45)
-DevExtTramp(46)
-DevExtTramp(47)
-DevExtTramp(48)
-DevExtTramp(49)
-DevExtTramp(50)
-DevExtTramp(51)
-DevExtTramp(52)
-DevExtTramp(53)
-DevExtTramp(54)
-DevExtTramp(55)
-DevExtTramp(56)
-DevExtTramp(57)
-DevExtTramp(58)
-DevExtTramp(59)
-DevExtTramp(60)
-DevExtTramp(61)
-DevExtTramp(62)
-DevExtTramp(63)
-DevExtTramp(64)
-DevExtTramp(65)
-DevExtTramp(66)
-DevExtTramp(67)
-DevExtTramp(68)
-DevExtTramp(69)
-DevExtTramp(70)
-DevExtTramp(71)
-DevExtTramp(72)
-DevExtTramp(73)
-DevExtTramp(74)
-DevExtTramp(75)
-DevExtTramp(76)
-DevExtTramp(77)
-DevExtTramp(78)
-DevExtTramp(79)
-DevExtTramp(80)
-DevExtTramp(81)
-DevExtTramp(82)
-DevExtTramp(83)
-DevExtTramp(84)
-DevExtTramp(85)
-DevExtTramp(86)
-DevExtTramp(87)
-DevExtTramp(88)
-DevExtTramp(89)
-DevExtTramp(90)
-DevExtTramp(91)
-DevExtTramp(92)
-DevExtTramp(93)
-DevExtTramp(94)
-DevExtTramp(95)
-DevExtTramp(96)
-DevExtTramp(97)
-DevExtTramp(98)
-DevExtTramp(99)
-DevExtTramp(100)
-DevExtTramp(101)
-DevExtTramp(102)
-DevExtTramp(103)
-DevExtTramp(104)
-DevExtTramp(105)
-DevExtTramp(106)
-DevExtTramp(107)
-DevExtTramp(108)
-DevExtTramp(109)
-DevExtTramp(110)
-DevExtTramp(111)
-DevExtTramp(112)
-DevExtTramp(113)
-DevExtTramp(114)
-DevExtTramp(115)
-DevExtTramp(116)
-DevExtTramp(117)
-DevExtTramp(118)
-DevExtTramp(119)
-DevExtTramp(120)
-DevExtTramp(121)
-DevExtTramp(122)
-DevExtTramp(123)
-DevExtTramp(124)
-DevExtTramp(125)
-DevExtTramp(126)
-DevExtTramp(127)
-DevExtTramp(128)
-DevExtTramp(129)
-DevExtTramp(130)
-DevExtTramp(131)
-DevExtTramp(132)
-DevExtTramp(133)
-DevExtTramp(134)
-DevExtTramp(135)
-DevExtTramp(136)
-DevExtTramp(137)
-DevExtTramp(138)
-DevExtTramp(139)
-DevExtTramp(140)
-DevExtTramp(141)
-DevExtTramp(142)
-DevExtTramp(143)
-DevExtTramp(144)
-DevExtTramp(145)
-DevExtTramp(146)
-DevExtTramp(147)
-DevExtTramp(148)
-DevExtTramp(149)
-DevExtTramp(150)
-DevExtTramp(151)
-DevExtTramp(152)
-DevExtTramp(153)
-DevExtTramp(154)
-DevExtTramp(155)
-DevExtTramp(156)
-DevExtTramp(157)
-DevExtTramp(158)
-DevExtTramp(159)
-DevExtTramp(160)
-DevExtTramp(161)
-DevExtTramp(162)
-DevExtTramp(163)
-DevExtTramp(164)
-DevExtTramp(165)
-DevExtTramp(166)
-DevExtTramp(167)
-DevExtTramp(168)
-DevExtTramp(169)
-DevExtTramp(170)
-DevExtTramp(171)
-DevExtTramp(172)
-DevExtTramp(173)
-DevExtTramp(174)
-DevExtTramp(175)
-DevExtTramp(176)
-DevExtTramp(177)
-DevExtTramp(178)
-DevExtTramp(179)
-DevExtTramp(180)
-DevExtTramp(181)
-DevExtTramp(182)
-DevExtTramp(183)
-DevExtTramp(184)
-DevExtTramp(185)
-DevExtTramp(186)
-DevExtTramp(187)
-DevExtTramp(188)
-DevExtTramp(189)
-DevExtTramp(190)
-DevExtTramp(191)
-DevExtTramp(192)
-DevExtTramp(193)
-DevExtTramp(194)
-DevExtTramp(195)
-DevExtTramp(196)
-DevExtTramp(197)
-DevExtTramp(198)
-DevExtTramp(199)
-DevExtTramp(200)
-DevExtTramp(201)
-DevExtTramp(202)
-DevExtTramp(203)
-DevExtTramp(204)
-DevExtTramp(205)
-DevExtTramp(206)
-DevExtTramp(207)
-DevExtTramp(208)
-DevExtTramp(209)
-DevExtTramp(210)
-DevExtTramp(211)
-DevExtTramp(212)
-DevExtTramp(213)
-DevExtTramp(214)
-DevExtTramp(215)
-DevExtTramp(216)
-DevExtTramp(217)
-DevExtTramp(218)
-DevExtTramp(219)
-DevExtTramp(220)
-DevExtTramp(221)
-DevExtTramp(222)
-DevExtTramp(223)
-DevExtTramp(224)
-DevExtTramp(225)
-DevExtTramp(226)
-DevExtTramp(227)
-DevExtTramp(228)
-DevExtTramp(229)
-DevExtTramp(230)
-DevExtTramp(231)
-DevExtTramp(232)
-DevExtTramp(233)
-DevExtTramp(234)
-DevExtTramp(235)
-DevExtTramp(236)
-DevExtTramp(237)
-DevExtTramp(238)
-DevExtTramp(239)
-DevExtTramp(240)
-DevExtTramp(241)
-DevExtTramp(242)
-DevExtTramp(243)
-DevExtTramp(244)
-DevExtTramp(245)
-DevExtTramp(246)
-DevExtTramp(247)
-DevExtTramp(248)
-DevExtTramp(249)
index d6ebe7f87a8b2176cfafacd5ec06bdd27598b322..2ff4be1d6408c17a8bc21364296eeebafd7f8b83 100644 (file)
 
 #include "unknown_function_handling.h"
 
+// If the assembly code necessary for unknown functions isn't supported, then replace all of the functions with stubs.
+// This way, if an application queries for an unknown function, they receive NULL and can act accordingly.
+// Previously, there was a fallback path written in C. However, it depended on the compiler optimizing the functions
+// in such a way as to not disturb the callstack. This reliance on implementation defined behavior is unsustainable and was only
+// known to work with GCC.
+#if !defined(UNKNOWN_FUNCTIONS_SUPPORTED)
+
+void loader_init_dispatch_dev_ext(struct loader_instance *inst, struct loader_device *dev) {
+    (void)inst;
+    (void)dev;
+}
+void *loader_dev_ext_gpa_tramp(struct loader_instance *inst, const char *funcName) {
+    (void)inst;
+    (void)funcName;
+    return NULL;
+}
+void *loader_dev_ext_gpa_term(struct loader_instance *inst, const char *funcName) {
+    (void)inst;
+    (void)funcName;
+    return NULL;
+}
+
+void *loader_phys_dev_ext_gpa_tramp(struct loader_instance *inst, const char *funcName) {
+    (void)inst;
+    (void)funcName;
+    return NULL;
+}
+void *loader_phys_dev_ext_gpa_term(struct loader_instance *inst, const char *funcName) {
+    (void)inst;
+    (void)funcName;
+    return NULL;
+}
+
+void loader_free_dev_ext_table(struct loader_instance *inst) { (void)inst; }
+void loader_free_phys_dev_ext_table(struct loader_instance *inst) { (void)inst; }
+
+#else
+
 #include "allocation.h"
 #include "log.h"
 
@@ -337,3 +375,5 @@ void *loader_phys_dev_ext_gpa_tramp(struct loader_instance *inst, const char *fu
 void *loader_phys_dev_ext_gpa_term(struct loader_instance *inst, const char *funcName) {
     return loader_phys_dev_ext_gpa_impl(inst, funcName, false);
 }
+
+#endif