Files
spl/stage1/spl_attr.h
T

86 lines
2.0 KiB
C

#ifndef __SPL_ATTR_H__
#define __SPL_ATTR_H__
#include "../stage0/include/utils.h"
#include "spl_mpa.h"
typedef enum {
SPL_ATTR_STAGE_SEMA,
SPL_ATTR_STAGE_LAYOUT,
SPL_ATTR_STAGE_IR,
SPL_ATTR_STAGE_OPT,
SPL_ATTR_STAGE_BACKEND,
} spl_attr_stage_t;
typedef enum {
SPL_ATTR_TARGET_DECL,
SPL_ATTR_TARGET_TYPE,
SPL_ATTR_TARGET_EXPR,
SPL_ATTR_TARGET_STMT,
} spl_attr_target_t;
typedef enum {
SPL_ATTR_OPTIONAL,
SPL_ATTR_REQUIRED,
} spl_attr_demand_t;
typedef struct {
const char *ns;
const char *name;
spl_attr_stage_t stage;
spl_attr_target_t target;
spl_attr_demand_t demand;
int min_args;
int max_args;
} spl_attr_info_t;
typedef enum {
SPL_ATTR_ARG_INT,
SPL_ATTR_ARG_STR,
SPL_ATTR_ARG_DEF,
SPL_ATTR_ARG_TYPE,
} spl_attr_arg_kind_t;
typedef struct {
spl_attr_arg_kind_t kind;
union {
isize i;
const char *s;
usize d;
usize t;
} value;
} spl_attr_arg_t;
typedef VEC(spl_attr_arg_t) spl_attr_arg_vec_t;
typedef usize spl_attr_id_t;
typedef struct {
spl_attr_info_t *info;
spl_attr_arg_vec_t args;
uint32_t consumed_mask;
} spl_attr_node_t;
typedef VEC(spl_attr_node_t) spl_attr_node_vec_t;
typedef VEC(spl_attr_id_t) spl_attr_id_vec_t;
typedef VEC(spl_attr_info_t *) spl_attr_registry_t;
typedef struct {
spl_attr_node_vec_t table;
spl_attr_registry_t registry;
} spl_attr_t;
void spl_attr_init(spl_attr_t *ctx);
void spl_attr_drop(spl_attr_t *ctx);
spl_attr_id_t spl_attr_alloc(spl_attr_t *ctx, spl_attr_info_t *info, spl_attr_arg_vec_t args);
spl_attr_node_t *spl_attr_node(const spl_attr_t *ctx, spl_attr_id_t id);
void spl_attr_registry_add(spl_attr_t *ctx, spl_attr_info_t *info);
spl_attr_info_t *spl_attr_lookup(spl_attr_t *ctx, const char *ns, const char *name);
void spl_attr_register_builtins(spl_attr_t *ctx);
void spl_attr_dump(const spl_attr_t *ctx);
void spl_attr_dump_id(const spl_attr_t *ctx, spl_attr_id_t id);
#endif /* __SPL_ATTR_H__ */