aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-kbdc/eliminate-dead-code.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mds-kbdc/eliminate-dead-code.c')
-rw-r--r--src/mds-kbdc/eliminate-dead-code.c155
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
-