kit

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

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