add M6 ownership core interfaces
This commit is contained in:
@@ -13,7 +13,80 @@ enum FeOwnMoveState {
|
|||||||
FE_OWN_MAYBE_MOVED = 2
|
FE_OWN_MAYBE_MOVED = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum FeOwnAccessKind {
|
||||||
|
FE_OWN_READ,
|
||||||
|
FE_OWN_WRITE,
|
||||||
|
FE_OWN_MOVE,
|
||||||
|
FE_OWN_BORROW_SHARED,
|
||||||
|
FE_OWN_BORROW_MUT,
|
||||||
|
FE_OWN_PROJECTION
|
||||||
|
} FeOwnAccessKind;
|
||||||
|
|
||||||
|
typedef enum FeOwnProvenanceKind {
|
||||||
|
FE_OWN_PROV_INVALID,
|
||||||
|
FE_OWN_PROV_STATIC,
|
||||||
|
FE_OWN_PROV_PARAM
|
||||||
|
} FeOwnProvenanceKind;
|
||||||
|
|
||||||
|
typedef struct FeOwnPlace {
|
||||||
|
FeNode *root;
|
||||||
|
const char *root_cname;
|
||||||
|
int projected;
|
||||||
|
} FeOwnPlace;
|
||||||
|
|
||||||
|
typedef struct FeOwnState {
|
||||||
|
int move;
|
||||||
|
int initialized;
|
||||||
|
unsigned shared;
|
||||||
|
int exclusive;
|
||||||
|
int borrow_conflict;
|
||||||
|
FeLoc move_loc;
|
||||||
|
FeLoc borrow_loc;
|
||||||
|
} FeOwnState;
|
||||||
|
|
||||||
|
typedef struct FeOwnProvenance {
|
||||||
|
FeOwnProvenanceKind kind;
|
||||||
|
unsigned param_index;
|
||||||
|
} FeOwnProvenance;
|
||||||
|
|
||||||
|
typedef struct FeOwnLastUse {
|
||||||
|
const char *cname;
|
||||||
|
FeNode *decl;
|
||||||
|
FeNode *last_node;
|
||||||
|
unsigned long last_ordinal;
|
||||||
|
int defer_extended;
|
||||||
|
} FeOwnLastUse;
|
||||||
|
|
||||||
|
typedef struct FeOwnLiveness {
|
||||||
|
FeArena *arena;
|
||||||
|
FeOwnLastUse *items;
|
||||||
|
unsigned count;
|
||||||
|
unsigned capacity;
|
||||||
|
unsigned long ordinal;
|
||||||
|
} FeOwnLiveness;
|
||||||
|
|
||||||
int fe_own_is_copy_type(FeType *type);
|
int fe_own_is_copy_type(FeType *type);
|
||||||
|
int fe_own_is_reference_like(FeType *type);
|
||||||
|
int fe_own_place_from_expr(FeNode *expr, FeOwnPlace *place);
|
||||||
|
|
||||||
|
void fe_own_state_init(FeOwnState *state, int initialized);
|
||||||
|
int fe_own_access(FeDiags *diags, FeOwnState *state,
|
||||||
|
FeOwnAccessKind access, FeLoc loc);
|
||||||
|
void fe_own_release_shared(FeOwnState *state);
|
||||||
|
void fe_own_release_exclusive(FeOwnState *state);
|
||||||
|
FeOwnState fe_own_merge_state(FeOwnState left, FeOwnState right);
|
||||||
|
int fe_own_state_equal(const FeOwnState *left, const FeOwnState *right);
|
||||||
|
|
||||||
|
FeOwnProvenance fe_own_provenance_static(void);
|
||||||
|
FeOwnProvenance fe_own_provenance_param(unsigned param_index);
|
||||||
|
FeOwnProvenance fe_own_merge_provenance(FeOwnProvenance left,
|
||||||
|
FeOwnProvenance right);
|
||||||
|
|
||||||
|
void fe_own_liveness_init(FeOwnLiveness *live, FeArena *arena);
|
||||||
|
int fe_own_collect_last_uses(FeOwnLiveness *live, FeNode *fn);
|
||||||
|
const FeOwnLastUse *fe_own_last_use(const FeOwnLiveness *live,
|
||||||
|
const char *cname);
|
||||||
|
|
||||||
void fe_own_mark_consumed(FeDiags *diags, int *state, FeNode *decl,
|
void fe_own_mark_consumed(FeDiags *diags, int *state, FeNode *decl,
|
||||||
FeNode *expr, FeType *type, int in_defer);
|
FeNode *expr, FeType *type, int in_defer);
|
||||||
void fe_own_check_use(FeDiags *diags, int state, FeLoc loc);
|
void fe_own_check_use(FeDiags *diags, int state, FeLoc loc);
|
||||||
|
|||||||
Reference in New Issue
Block a user