registry.c (2233B)
1 #include <kit/config.h> 2 3 #include "abi/abi_internal.h" 4 5 /* Derived ABI registry. ABIs are not user-configurable; an entry exists only 6 * when both the machine arch and the object/OS-family format are enabled. */ 7 typedef struct ABIImpl { 8 KitArchKind arch; 9 KitObjFmt obj; 10 const ABIVtable* vt; 11 } ABIImpl; 12 13 #define KIT_ABI_AA64_ENABLED \ 14 (KIT_ARCH_AA64_ENABLED || KIT_ARCH_C_TARGET_ENABLED) 15 #define KIT_ABI_X64_ENABLED (KIT_ARCH_X64_ENABLED || KIT_ARCH_C_TARGET_ENABLED) 16 #define KIT_ABI_RV64_ENABLED \ 17 (KIT_ARCH_RV64_ENABLED || KIT_ARCH_C_TARGET_ENABLED) 18 #define KIT_ABI_RV32_ENABLED \ 19 (KIT_ARCH_RV32_ENABLED || KIT_ARCH_C_TARGET_ENABLED) 20 21 static const ABIImpl abi_impls[] = { 22 #if KIT_ABI_AA64_ENABLED && KIT_OBJ_ELF_ENABLED 23 {KIT_ARCH_ARM_64, KIT_OBJ_ELF, &aapcs64_vtable}, 24 #endif 25 #if KIT_ABI_AA64_ENABLED && KIT_OBJ_MACHO_ENABLED 26 {KIT_ARCH_ARM_64, KIT_OBJ_MACHO, &apple_arm64_vtable}, 27 #endif 28 #if KIT_ABI_AA64_ENABLED && KIT_OBJ_COFF_ENABLED 29 {KIT_ARCH_ARM_64, KIT_OBJ_COFF, &aapcs64_windows_vtable}, 30 #endif 31 #if KIT_ABI_X64_ENABLED && KIT_OBJ_ELF_ENABLED 32 {KIT_ARCH_X86_64, KIT_OBJ_ELF, &sysv_x64_vtable}, 33 #endif 34 #if KIT_ABI_X64_ENABLED && KIT_OBJ_MACHO_ENABLED 35 {KIT_ARCH_X86_64, KIT_OBJ_MACHO, &apple_x64_vtable}, 36 #endif 37 #if KIT_ABI_X64_ENABLED && KIT_OBJ_COFF_ENABLED 38 {KIT_ARCH_X86_64, KIT_OBJ_COFF, &win64_x64_vtable}, 39 #endif 40 #if KIT_ABI_RV64_ENABLED && KIT_OBJ_ELF_ENABLED 41 {KIT_ARCH_RV64, KIT_OBJ_ELF, &rv64_vtable}, 42 #endif 43 #if KIT_ABI_RV32_ENABLED && KIT_OBJ_ELF_ENABLED 44 {KIT_ARCH_RV32, KIT_OBJ_ELF, &rv32_vtable}, 45 #endif 46 #if KIT_ARCH_WASM_ENABLED && KIT_OBJ_WASM_ENABLED 47 {KIT_ARCH_WASM, KIT_OBJ_WASM, &wasm32_vtable}, 48 #endif 49 #if !KIT_ABI_AA64_ENABLED && !KIT_ABI_X64_ENABLED && !KIT_ABI_RV64_ENABLED && \ 50 !KIT_ABI_RV32_ENABLED && !KIT_ARCH_WASM_ENABLED 51 {KIT_ARCH_WASM, KIT_OBJ_WASM, NULL}, 52 #endif 53 }; 54 55 const ABIVtable* abi_vtable_lookup(KitArchKind arch, KitObjFmt obj) { 56 u32 i; 57 for (i = 0; i < (u32)(sizeof abi_impls / sizeof abi_impls[0]); ++i) { 58 if (abi_impls[i].arch == arch && abi_impls[i].obj == obj) 59 return abi_impls[i].vt; 60 } 61 return NULL; 62 } 63 64 #undef KIT_ABI_AA64_ENABLED 65 #undef KIT_ABI_X64_ENABLED 66 #undef KIT_ABI_RV64_ENABLED 67 #undef KIT_ABI_RV32_ENABLED