diff options
Diffstat (limited to 'src/mds-kbdc/eliminate-dead-code.c')
-rw-r--r-- | src/mds-kbdc/eliminate-dead-code.c | 155 |
1 files changed, 81 insertions, 74 deletions
diff --git a/src/mds-kbdc/eliminate-dead-code.c b/src/mds-kbdc/eliminate-dead-code.c index 039b6a8..5a8102f 100644 --- a/src/mds-kbdc/eliminate-dead-code.c +++ b/src/mds-kbdc/eliminate-dead-code.c @@ -27,7 +27,7 @@ /** * Tree type constant shortener */ -#define C(TYPE) MDS_KBDC_TREE_TYPE_##TYPE +#define C(TYPE) MDS_KBDC_TREE_TYPE_##TYPE /** * Add an error with “included from here”-notes to the error list @@ -38,20 +38,20 @@ * @param ...:const char*, ... Error description format string and arguments * @scope error:mds_kbdc_parse_error_t* Variable where the new error will be stored */ -#define NEW_ERROR(NODE, PTR, SEVERITY, ...) \ - NEW_ERROR_WITH_INCLUDES(NODE, PTR, SEVERITY, __VA_ARGS__) +#define NEW_ERROR(NODE, PTR, SEVERITY, ...)\ + NEW_ERROR_WITH_INCLUDES(NODE, PTR, SEVERITY, __VA_ARGS__) /** * Variable whether the latest created error is stored */ -static mds_kbdc_parse_error_t* error; +static mds_kbdc_parse_error_t *error; /** * The parameter of `eliminate_dead_code` */ -static mds_kbdc_parsed_t* restrict result; +static mds_kbdc_parsed_t *restrict result; /** * 2: Eliminating because of a return-statement @@ -68,7 +68,7 @@ static int elimination_level = 0; * @param tree The tree to reduce * @return Zero on success, -1 on error */ -static int eliminate_subtree(mds_kbdc_tree_t* restrict tree); +static int eliminate_subtree(mds_kbdc_tree_t *restrict tree); @@ -78,17 +78,18 @@ static int eliminate_subtree(mds_kbdc_tree_t* restrict tree); * @param tree The tree to reduce * @return Zero on success, -1 on error */ -static int eliminate_include(mds_kbdc_tree_include_t* restrict tree) +static int +eliminate_include(mds_kbdc_tree_include_t *restrict tree) { - void* data; - int r; - fail_if (mds_kbdc_include_stack_push(tree, &data)); - r = eliminate_subtree(tree->inner); - mds_kbdc_include_stack_pop(data); - fail_if (r); - return 0; - fail: - return -1; + void *data; + int r; + fail_if (mds_kbdc_include_stack_push(tree, &data)); + r = eliminate_subtree(tree->inner); + mds_kbdc_include_stack_pop(data); + fail_if (r); + return 0; +fail: + return -1; } @@ -98,17 +99,18 @@ static int eliminate_include(mds_kbdc_tree_include_t* restrict tree) * @param tree The tree to reduce * @return Zero on success, -1 on error */ -static int eliminate_if(mds_kbdc_tree_if_t* restrict tree) +static int +eliminate_if(mds_kbdc_tree_if_t *restrict tree) { - int elimination; - fail_if (eliminate_subtree(tree->inner)); - elimination = elimination_level, elimination_level = 0; - fail_if (eliminate_subtree(tree->otherwise)); - if (elimination > elimination_level) - elimination = elimination_level; - return 0; - fail: - return -1; + int elimination; + fail_if (eliminate_subtree(tree->inner)); + elimination = elimination_level, elimination_level = 0; + fail_if (eliminate_subtree(tree->otherwise)); + if (elimination > elimination_level) + elimination = elimination_level; + return 0; +fail: + return -1; } @@ -118,46 +120,51 @@ static int eliminate_if(mds_kbdc_tree_if_t* restrict tree) * @param tree The tree to reduce * @return Zero on success, -1 on error */ -static int eliminate_subtree(mds_kbdc_tree_t* restrict tree) +static int +eliminate_subtree(mds_kbdc_tree_t *restrict tree) { -#define e(type) fail_if (eliminate_##type(&(tree->type))) -#define E(type) fail_if (eliminate_##type(&(tree->type##_))) - again: - if (tree == NULL) - return 0; +#define e(type) fail_if (eliminate_##type(&tree->type)) +#define E(type) fail_if (eliminate_##type(&tree->type##_)) +again: + if (!tree) + return 0; - switch (tree->type) - { - case C(INCLUDE): e(include); break; - case C(IF): E(if); break; - case C(INFORMATION): - case C(FUNCTION): - case C(MACRO): - case C(ASSUMPTION): - case C(FOR): - fail_if (eliminate_subtree(tree->information.inner)); - if ((tree->type == C(FUNCTION)) || (tree->type == C(MACRO))) elimination_level = 0; - else if ((tree->type == C(FOR)) && (elimination_level == 1)) elimination_level = 0; - break; - case C(RETURN): - case C(BREAK): - case C(CONTINUE): - elimination_level = tree->type == C(RETURN) ? 2 : 1; - break; - default: - break; - } - - if (tree->next && elimination_level) - { - NEW_ERROR(tree->next, includes_ptr, WARNING, "statement is unreachable"); - mds_kbdc_tree_free(tree->next), tree->next = NULL; - } - - tree = tree->next; - goto again; - fail: - return -1; + switch (tree->type) { + case C(INCLUDE): + e(include); + break; + case C(IF): + E(if); + break; + case C(INFORMATION): + case C(FUNCTION): + case C(MACRO): + case C(ASSUMPTION): + case C(FOR): + fail_if (eliminate_subtree(tree->information.inner)); + if (tree->type == C(FUNCTION) || tree->type == C(MACRO)) + elimination_level = 0; + else if (tree->type == C(FOR) && elimination_level == 1) + elimination_level = 0; + break; + case C(RETURN): + case C(BREAK): + case C(CONTINUE): + elimination_level = tree->type == C(RETURN) ? 2 : 1; + break; + default: + break; + } + + if (tree->next && elimination_level) { + NEW_ERROR(tree->next, includes_ptr, WARNING, "statement is unreachable"); + mds_kbdc_tree_free(tree->next), tree->next = NULL; + } + + tree = tree->next; + goto again; +fail: + return -1; #undef E #undef e } @@ -169,20 +176,20 @@ static int eliminate_subtree(mds_kbdc_tree_t* restrict tree) * @param result_ `result` from `validate_tree`, will be updated * @return -1 if an error occursed that cannot be stored in `result`, zero otherwise */ -int eliminate_dead_code(mds_kbdc_parsed_t* restrict result_) +int +eliminate_dead_code(mds_kbdc_parsed_t *restrict result_) { - int r; - mds_kbdc_include_stack_begin(result = result_); - r = eliminate_subtree(result_->tree); - mds_kbdc_include_stack_end(); - fail_if (r); - return 0; - fail: - return -1; + int r; + mds_kbdc_include_stack_begin(result = result_); + r = eliminate_subtree(result_->tree); + mds_kbdc_include_stack_end(); + fail_if (r); + return 0; +fail: + return -1; } #undef NEW_ERROR #undef C - |