This commit is contained in:
John Kerl 2016-10-10 22:13:26 -04:00
parent 4e631b7778
commit 672edf7660
3 changed files with 37 additions and 65 deletions

View file

@ -18,11 +18,11 @@ mlr_dsl_ast_node_t* mlr_dsl_ast_node_alloc(char* text, mlr_dsl_ast_node_type_t t
pnode->type = type;
pnode->pchildren = NULL;
pnode->frame_relative_index = MD_UNUSED_INDEX;
pnode->upstack_frame_count = MD_UNUSED_INDEX;
pnode->absolute_index = MD_UNUSED_INDEX;
pnode->frame_var_count = MD_UNUSED_INDEX;
pnode->recursive_max_var_count = MD_UNUSED_INDEX;
pnode->frame_relative_index = MD_UNUSED_INDEX;
pnode->upstack_frame_count = MD_UNUSED_INDEX;
pnode->absolute_index = MD_UNUSED_INDEX;
pnode->frame_var_count = MD_UNUSED_INDEX;
pnode->max_var_depth = MD_UNUSED_INDEX;
return pnode;
}
@ -185,8 +185,8 @@ static void mlr_dsl_ast_node_print_aux(mlr_dsl_ast_node_t* pnode, int level, FIL
fprintf(o, " absidx=%d", pnode->absolute_index);
if (pnode->frame_var_count != MD_UNUSED_INDEX)
fprintf(o, " frct=%d", pnode->frame_var_count);
if (pnode->recursive_max_var_count != MD_UNUSED_INDEX)
fprintf(o, " maxct=%d", pnode->recursive_max_var_count);
if (pnode->max_var_depth != MD_UNUSED_INDEX)
fprintf(o, " maxct=%d", pnode->max_var_depth);
fprintf(o, "\n");

View file

@ -89,7 +89,7 @@ typedef struct _mlr_dsl_ast_node_t {
int absolute_index;
// For bind-stack allocation only in statement-block nodes: unused for any other node types.
int frame_var_count;
int recursive_max_var_count;
int max_var_depth;
} mlr_dsl_ast_node_t;

View file

@ -13,8 +13,6 @@
// ----------------------------------------------------------------
// xxx to do:
// xxx put 'pass_1' and 'pass_2' in the function names
// * maybe move ast from containers to mapping?
// * make a separate file for tree-reorg part into top-level blocks
@ -24,24 +22,6 @@
// * separate verbosity for allocator? and invoke it in UT cases specific to this?
// -> (note allocation marks in the AST will be printed regardless)
// * nodestash:
// @ localvar: fridx & upcount; then frgridx
// @ statement block: frct; then maxdepth (default #def NONESUCH @ ctor; respect @ ast-node printer)
// pass 1:
// @localvar put fridx & upcount
// @exit from statement block put frct
// pass 2:
// @localvar map fridx & upcount to relidx (>=0 for in-frame, <0 for upframe)
// @base put maxdepth
// 1 frame_relative_index
// 1 upstack_frame_count <--- xxx rm ?
// 1 frame_var_count
// 2 recursive_max_var_count
// 2 absolute_index
// ================================================================
typedef struct _stkalc_frame_t {
long long var_count;
@ -64,27 +44,23 @@ static void stkalc_frame_group_free(stkalc_frame_group_t* pframe_grou
static void stkalc_frame_group_push(stkalc_frame_group_t* pframe_group, stkalc_frame_t* pframe);
static stkalc_frame_t* stkalc_frame_group_pop(stkalc_frame_group_t* pframe_group);
static void stkalc_frame_group_mark_for_define(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
char* desc, int verbose);
static void stkalc_frame_group_mark_node_for_define(stkalc_frame_group_t* pframe_group,
mlr_dsl_ast_node_t* pnode, char* desc, int verbose);
static void stkalc_frame_group_mark_for_write(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
char* desc, int verbose);
static void stkalc_frame_group_mark_node_for_write(stkalc_frame_group_t* pframe_group,
mlr_dsl_ast_node_t* pnode, char* desc, int verbose);
static void stkalc_frame_group_mark_for_read(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
char* desc, int verbose);
static void stkalc_frame_group_mark_node_for_read(stkalc_frame_group_t* pframe_group,
mlr_dsl_ast_node_t* pnode, char* desc, int verbose);
// ----------------------------------------------------------------
// PASS 1
static void pass_1_for_func_subr_block(mlr_dsl_ast_node_t* pnode);
static void pass_1_for_begin_end_block(mlr_dsl_ast_node_t* pnode);
static void pass_1_for_main_block(mlr_dsl_ast_node_t* pnode);
static void pass_1_for_statement_block(mlr_dsl_ast_node_t* pnode,
stkalc_frame_group_t* pframe_group);
static void pass_1_for_node(mlr_dsl_ast_node_t* pnode,
stkalc_frame_group_t* pframe_group);
static void pass_1_for_statement_block(mlr_dsl_ast_node_t* pnode, stkalc_frame_group_t* pframe_group);
static void pass_1_for_node(mlr_dsl_ast_node_t* pnode, stkalc_frame_group_t* pframe_group);
// PASS 2
static void pass_2_for_block(mlr_dsl_ast_node_t* pnode);
static void pass_2_for_top_level_block(mlr_dsl_ast_node_t* pnode);
static void pass_2_for_node(mlr_dsl_ast_node_t* pnode,
int frame_depth, int var_count_below_frame, int var_count_at_frame, int* pmax_var_depth);
@ -119,10 +95,8 @@ static void pass_2_for_node(mlr_dsl_ast_node_t* pnode,
// ================================================================
// ----------------------------------------------------------------
// xxx rename
void blocked_ast_allocate_locals(blocked_ast_t* paast) {
// PASS 1
for (sllve_t* pe = paast->pfunc_defs->phead; pe != NULL; pe = pe->pnext) {
pass_1_for_func_subr_block(pe->pvvalue);
}
@ -139,21 +113,20 @@ void blocked_ast_allocate_locals(blocked_ast_t* paast) {
pass_1_for_begin_end_block(pe->pvvalue);
}
// PASS 2
for (sllve_t* pe = paast->pfunc_defs->phead; pe != NULL; pe = pe->pnext) {
pass_2_for_block(pe->pvvalue);
pass_2_for_top_level_block(pe->pvvalue);
}
for (sllve_t* pe = paast->psubr_defs->phead; pe != NULL; pe = pe->pnext) {
pass_2_for_block(pe->pvvalue);
pass_2_for_top_level_block(pe->pvvalue);
}
for (sllve_t* pe = paast->pbegin_blocks->phead; pe != NULL; pe = pe->pnext) {
pass_2_for_block(pe->pvvalue);
pass_2_for_top_level_block(pe->pvvalue);
}
{
pass_2_for_block(paast->pmain_block);
pass_2_for_top_level_block(paast->pmain_block);
}
for (sllve_t* pe = paast->pend_blocks->phead; pe != NULL; pe = pe->pnext) {
pass_2_for_block(pe->pvvalue);
pass_2_for_top_level_block(pe->pvvalue);
}
}
@ -177,7 +150,7 @@ static void pass_1_for_func_subr_block(mlr_dsl_ast_node_t* pnode) {
mlr_dsl_ast_node_t* plist_node = pnode->pchildren->phead->pnext->pvvalue;
for (sllve_t* pe = pdef_name_node->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pparameter_node = pe->pvvalue;
stkalc_frame_group_mark_for_define(pframe_group, pparameter_node, "PARAMETER", TRUE/*xxx temp*/);
stkalc_frame_group_mark_node_for_define(pframe_group, pparameter_node, "PARAMETER", TRUE/*xxx temp*/);
}
pass_1_for_statement_block(plist_node, pframe_group);
pnode->frame_var_count = pframe->var_count;
@ -255,18 +228,18 @@ static void pass_1_for_node(mlr_dsl_ast_node_t* pnode,
// xxx decide on preorder vs. postorder
mlr_dsl_ast_node_t* pnamenode = pnode->pchildren->phead->pvvalue;
stkalc_frame_group_mark_for_define(pframe_group, pnamenode, "DEFINE", TRUE/*xxx temp*/);
stkalc_frame_group_mark_node_for_define(pframe_group, pnamenode, "DEFINE", TRUE/*xxx temp*/);
mlr_dsl_ast_node_t* pvaluenode = pnode->pchildren->phead->pnext->pvvalue;
pass_1_for_node(pvaluenode, pframe_group);
} else if (pnode->type == MD_AST_NODE_TYPE_LOCAL_ASSIGNMENT) { // xxx rename
mlr_dsl_ast_node_t* pnamenode = pnode->pchildren->phead->pvvalue;
stkalc_frame_group_mark_for_write(pframe_group, pnamenode, "WRITE", TRUE/*xxx temp*/);
stkalc_frame_group_mark_node_for_write(pframe_group, pnamenode, "WRITE", TRUE/*xxx temp*/);
mlr_dsl_ast_node_t* pvaluenode = pnode->pchildren->phead->pnext->pvvalue;
pass_1_for_node(pvaluenode, pframe_group);
} else if (pnode->type == MD_AST_NODE_TYPE_BOUND_VARIABLE) {
stkalc_frame_group_mark_for_read(pframe_group, pnode, "READ", TRUE/*xxx temp*/);
stkalc_frame_group_mark_node_for_read(pframe_group, pnode, "READ", TRUE/*xxx temp*/);
} else if (pnode->type == MD_AST_NODE_TYPE_FOR_SREC) { // xxx comment
@ -281,8 +254,8 @@ static void pass_1_for_node(mlr_dsl_ast_node_t* pnode,
mlr_dsl_ast_node_t* pknode = pvarsnode->pchildren->phead->pvvalue;
mlr_dsl_ast_node_t* pvnode = pvarsnode->pchildren->phead->pnext->pvvalue;
stkalc_frame_group_mark_for_define(pframe_group, pknode, "FOR-BIND", TRUE/*xxx temp*/);
stkalc_frame_group_mark_for_define(pframe_group, pvnode, "FOR-BIND", TRUE/*xxx temp*/);
stkalc_frame_group_mark_node_for_define(pframe_group, pknode, "FOR-BIND", TRUE/*xxx temp*/);
stkalc_frame_group_mark_node_for_define(pframe_group, pvnode, "FOR-BIND", TRUE/*xxx temp*/);
pass_1_for_statement_block(pblocknode, pframe_group);
pnode->frame_var_count = pnext_frame->var_count;
@ -317,9 +290,9 @@ static void pass_1_for_node(mlr_dsl_ast_node_t* pnode,
for (sllve_t* pe = pkeysnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pkeynode = pe->pvvalue;
stkalc_frame_group_mark_for_define(pframe_group, pkeynode, "FOR-BIND", TRUE/*xxx temp*/);
stkalc_frame_group_mark_node_for_define(pframe_group, pkeynode, "FOR-BIND", TRUE/*xxx temp*/);
}
stkalc_frame_group_mark_for_define(pframe_group, pvalnode, "FOR-BIND", TRUE/*xxx temp*/);
stkalc_frame_group_mark_node_for_define(pframe_group, pvalnode, "FOR-BIND", TRUE/*xxx temp*/);
pass_1_for_statement_block(pblocknode, pframe_group);
// xxx make accessor ...
pnode->frame_var_count = pnext_frame->var_count;
@ -415,7 +388,7 @@ static stkalc_frame_t* stkalc_frame_group_pop(stkalc_frame_group_t* pframe_group
return sllv_pop(pframe_group->plist);
}
static void stkalc_frame_group_mark_for_define(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
static void stkalc_frame_group_mark_node_for_define(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
char* desc, int verbose)
{
char* op = "REUSE";
@ -437,7 +410,7 @@ static void stkalc_frame_group_mark_for_define(stkalc_frame_group_t* pframe_grou
}
}
static void stkalc_frame_group_mark_for_write(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
static void stkalc_frame_group_mark_node_for_write(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
char* desc, int verbose)
{
char* op = "REUSE";
@ -471,7 +444,7 @@ static void stkalc_frame_group_mark_for_write(stkalc_frame_group_t* pframe_group
}
// xxx make this very clear in the header somehow ... this is an assumption to be tracked across modules.
static void stkalc_frame_group_mark_for_read(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
static void stkalc_frame_group_mark_node_for_read(stkalc_frame_group_t* pframe_group, mlr_dsl_ast_node_t* pnode,
char* desc, int verbose)
{
char* op = "PRESENT";
@ -506,16 +479,15 @@ static void stkalc_frame_group_mark_for_read(stkalc_frame_group_t* pframe_group,
}
// ================================================================
// PASS 2
static void pass_2_for_block(mlr_dsl_ast_node_t* pnode) {
static void pass_2_for_top_level_block(mlr_dsl_ast_node_t* pnode) {
int frame_depth = 0;
int var_count_below_frame = 0;
int var_count_at_frame = 0;
int max_depth = 0;
int max_var_depth = 0;
printf("\n");
printf("ABSOLUTIZING LOCALS FOR DEFINITION BLOCK [%s]\n", pnode->text);
pass_2_for_node(pnode, frame_depth, var_count_below_frame, var_count_at_frame, &max_depth);
pnode->recursive_max_var_count = max_depth; // xxx rename(s)
pass_2_for_node(pnode, frame_depth, var_count_below_frame, var_count_at_frame, &max_var_depth);
pnode->max_var_depth = max_var_depth;
}
static void pass_2_for_node(mlr_dsl_ast_node_t* pnode,