#ifndef SCOPE_H #define SCOPE_H #include "ccc.h" #include "type.h" #include "hashmap.h" struct storage_location { enum { STO_REG, STO_LABEL, STO_STACK, STO_IMM, /* I would like to solve functions using the type system * and kill STO_FN and STO_UNRESOLVED in favor of STO_LABEL. */ STO_FN, STO_UNRESOLVED, } type; union { struct reg* reg; const char* label; sintegral_t bp_offset; integral_t value; struct fn_decl_node* decl; }; }; struct type_alias { const char* name; struct type type; }; struct var_def { const struct type* type; char* name; struct storage_location loc; }; struct scope { struct hash_map types; struct hash_map vars; struct scope* next_out; integral_t bp_offset; }; void scope_push(struct scope** p_scope); void scope_pop(struct scope** p_scope); void scope_destroy(struct scope* scope); bool scope_get_type( const struct scope* scope, const struct type_alias** p_entry, const char* name); const struct type_alias* scope_define_type( struct scope* scope, struct type_alias type); bool scope_get_var( const struct scope* scope, struct var_def** p_entry, const char* name); struct var_def* scope_define_var(struct scope* scope, struct var_def var); #endif