86 lines
2.0 KiB
C
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__ */
|