registry.c (2673B)
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 /* A per-arch ABI is compiled in whenever that machine arch is enabled, or 14 * whenever the portable C-source backend is — c_target replays the same ABI 15 * layouts. One parameterized macro keeps every table site in sync; adding an 16 * arch just adds a KIT_ABI_ENABLED(KIT_ARCH_<X>_ENABLED) row below. */ 17 #define KIT_ABI_ENABLED(arch) ((arch) || KIT_ARCH_C_TARGET_ENABLED) 18 19 static const ABIImpl abi_impls[] = { 20 #if KIT_ABI_ENABLED(KIT_ARCH_AA64_ENABLED) && KIT_OBJ_ELF_ENABLED 21 {KIT_ARCH_ARM_64, KIT_OBJ_ELF, &aapcs64_vtable}, 22 #endif 23 #if KIT_ABI_ENABLED(KIT_ARCH_AA64_ENABLED) && KIT_OBJ_MACHO_ENABLED 24 {KIT_ARCH_ARM_64, KIT_OBJ_MACHO, &apple_arm64_vtable}, 25 #endif 26 #if KIT_ABI_ENABLED(KIT_ARCH_AA64_ENABLED) && KIT_OBJ_COFF_ENABLED 27 {KIT_ARCH_ARM_64, KIT_OBJ_COFF, &aapcs64_windows_vtable}, 28 #endif 29 #if KIT_ABI_ENABLED(KIT_ARCH_X64_ENABLED) && KIT_OBJ_ELF_ENABLED 30 {KIT_ARCH_X86_64, KIT_OBJ_ELF, &sysv_x64_vtable}, 31 #endif 32 #if KIT_ABI_ENABLED(KIT_ARCH_X64_ENABLED) && KIT_OBJ_MACHO_ENABLED 33 {KIT_ARCH_X86_64, KIT_OBJ_MACHO, &apple_x64_vtable}, 34 #endif 35 #if KIT_ABI_ENABLED(KIT_ARCH_X64_ENABLED) && KIT_OBJ_COFF_ENABLED 36 {KIT_ARCH_X86_64, KIT_OBJ_COFF, &win64_x64_vtable}, 37 #endif 38 #if KIT_ABI_ENABLED(KIT_ARCH_RV64_ENABLED) && KIT_OBJ_ELF_ENABLED 39 {KIT_ARCH_RV64, KIT_OBJ_ELF, &rv64_vtable}, 40 #endif 41 #if KIT_ABI_ENABLED(KIT_ARCH_RV32_ENABLED) && KIT_OBJ_ELF_ENABLED 42 {KIT_ARCH_RV32, KIT_OBJ_ELF, &rv32_vtable}, 43 #endif 44 #if KIT_ABI_ENABLED(KIT_ARCH_ARM32_ENABLED) && KIT_OBJ_ELF_ENABLED 45 {KIT_ARCH_ARM_32, KIT_OBJ_ELF, &aapcs32_vtable}, 46 #endif 47 #if KIT_ARCH_WASM_ENABLED && KIT_OBJ_WASM_ENABLED 48 {KIT_ARCH_WASM, KIT_OBJ_WASM, &wasm32_vtable}, 49 #endif 50 #if !KIT_ABI_ENABLED(KIT_ARCH_AA64_ENABLED) && \ 51 !KIT_ABI_ENABLED(KIT_ARCH_X64_ENABLED) && \ 52 !KIT_ABI_ENABLED(KIT_ARCH_RV64_ENABLED) && \ 53 !KIT_ABI_ENABLED(KIT_ARCH_RV32_ENABLED) && \ 54 !KIT_ABI_ENABLED(KIT_ARCH_ARM32_ENABLED) && !KIT_ARCH_WASM_ENABLED 55 {KIT_ARCH_WASM, KIT_OBJ_WASM, NULL}, 56 #endif 57 }; 58 59 const ABIVtable* abi_vtable_lookup(KitArchKind arch, KitObjFmt obj) { 60 u32 i; 61 for (i = 0; i < (u32)(sizeof abi_impls / sizeof abi_impls[0]); ++i) { 62 if (abi_impls[i].arch == arch && abi_impls[i].obj == obj) 63 return abi_impls[i].vt; 64 } 65 return NULL; 66 } 67 68 #undef KIT_ABI_ENABLED