kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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