#ifndef __SPL_INTRIN_H__ #define __SPL_INTRIN_H__ #include "../stage0/include/utils.h" #include "spl_lang_type.h" typedef enum { SPL_INTRIN_NONE = 0, SPL_INTRIN_BITSIZEOF, SPL_INTRIN_SIZEOF, SPL_INTRIN_ALIGNOF, SPL_INTRIN_ASSERT, SPL_INTRIN_BREAKPOINT, SPL_INTRIN_LEN, SPL_INTRIN_INT_CAST, SPL_INTRIN_TRUNCATE, SPL_INTRIN_BIT_CAST, SPL_INTRIN_FLOAT_CAST, SPL_INTRIN_FLOAT2INT, SPL_INTRIN_INT2FLOAT, SPL_INTRIN_BOOL2INT, SPL_INTRIN_PTR2INT, SPL_INTRIN_INT2PTR, SPL_INTRIN_PTR_CAST, SPL_INTRIN_ENUM2INT, SPL_INTRIN_OFFSETOF, SPL_INTRIN_FIELD_COUNT, } spl_intrin_t; typedef enum { SPL_INTRIN_FORM_CALL = 1, /* @sizeof(...) @assert(...) */ SPL_INTRIN_FORM_FIELD = 2, /* recv.len */ } spl_intrin_form_t; typedef enum { SPL_INTRIN_RESULT_UNIT, SPL_INTRIN_RESULT_BOOL, SPL_INTRIN_RESULT_USIZE, } spl_intrin_result_t; typedef struct { const char *name; spl_intrin_t kind; spl_intrin_form_t form; int min_args; /* FIELD 形态忽略 */ int max_args; /* -1 = variadic */ spl_intrin_result_t result; } spl_intrin_info_t; spl_intrin_t spl_intrin_lookup_call(const char *name); spl_intrin_t spl_intrin_lookup_field(spl_lang_type_kind_t recv_kind, const char *field); spl_intrin_t spl_intrin_lookup_cast(spl_type_t *type, spl_type_id_t ft, spl_type_id_t tt); const spl_intrin_info_t *spl_intrin_info(spl_intrin_t kind); /* ---- 与 IR 侧共享的类型布局约定 ---- */ #define SPL_SLICE_PTR_FIELD_IDX 0 #define SPL_SLICE_LEN_FIELD_IDX 1 #endif /* __SPL_INTRIN_H__ */