aboutsummaryrefslogtreecommitdiff
path: root/backendC/CleanCompilerSources/optimisations.c
diff options
context:
space:
mode:
authorjohnvg2013-12-04 11:29:51 +0000
committerjohnvg2013-12-04 11:29:51 +0000
commitf4cfedb62d877b349eb239387dccd538b7c97d76 (patch)
treeded4d383f2cbf49459ca6afacdf4e9de7f30dd5d /backendC/CleanCompilerSources/optimisations.c
parentfix printing of uniqueness attributes in type with A. (diff)
generate .impmod before importing labels and descriptors,
using this information the code generator can determine from which module a label is imported, this is used when generating position independent code git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@2332 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'backendC/CleanCompilerSources/optimisations.c')
-rw-r--r--backendC/CleanCompilerSources/optimisations.c66
1 files changed, 51 insertions, 15 deletions
diff --git a/backendC/CleanCompilerSources/optimisations.c b/backendC/CleanCompilerSources/optimisations.c
index 0eb1cad..955873b 100644
--- a/backendC/CleanCompilerSources/optimisations.c
+++ b/backendC/CleanCompilerSources/optimisations.c
@@ -3438,8 +3438,24 @@ static void ExamineSymbolApplication (struct node *node)
if (symbol->symb_kind==cons_symb && symbol->symb_head_strictness==4){
if (node->node_arity<2)
symbol->symb_unboxed_cons_sdef_p->sdef_mark |= SDEF_USED_CURRIED_MASK;
- else if (IsLazyState (node->node_state))
- symbol->symb_unboxed_cons_sdef_p->sdef_mark |= SDEF_USED_LAZILY_MASK;
+ else {
+ StateP unboxed_cons_state_p;
+ int mark;
+
+ if (IsLazyState (node->node_state)){
+ symbol->symb_unboxed_cons_sdef_p->sdef_mark |= SDEF_USED_LAZILY_MASK;
+ mark = SDEF_USED_LAZILY_MASK;
+ } else {
+ mark = SDEF_USED_STRICTLY_MASK;
+ }
+ unboxed_cons_state_p = symbol->symb_unboxed_cons_state_p;
+ if (unboxed_cons_state_p->state_type==SimpleState){
+ if (BETWEEN (IntObj,FileObj,unboxed_cons_state_p->state_object))
+ unboxed_cons_mark[unboxed_cons_state_p->state_object-IntObj][symbol->symb_tail_strictness] |= mark;
+ } else if (unboxed_cons_state_p->state_type==ArrayState){
+ unboxed_cons_array_mark |= mark;
+ }
+ }
} else if (symbol->symb_kind==seq_symb){
if (node->node_arity!=2)
SeqDef->sdef_mark |= SDEF_USED_CURRIED_MASK;
@@ -3532,7 +3548,7 @@ static void ExamineSymbolApplication (struct node *node)
sdef->sdef_mark |= SDEF_USED_STRICTLY_MASK;
}
- }
+ }
} else {
if ((sdef->sdef_kind==RECORDTYPE ? sdef->sdef_cons_arity : sdef->sdef_arity) != node->node_arity)
sdef->sdef_mark |= SDEF_USED_CURRIED_MASK;
@@ -3768,20 +3784,40 @@ static void ReorderNodeDefinitionsAndDetermineUsedEntries (NodeDefs *def_p,Node
error_in_function ("ReorderNodeDefinitionsAndDetermineUsedEntries");
for_l (arg,root->node_arguments,arg_next){
- if (arg->arg_node->node_kind==OverloadedCaseNode){
- NodeP overloaded_case_node_p,case_node_p;
-
- overloaded_case_node_p=arg->arg_node;
- MarkDependentNodeDefs (overloaded_case_node_p->node_arguments->arg_node);
- MarkDependentNodeDefs (overloaded_case_node_p->node_arguments->arg_next->arg_node);
+ switch (arg->arg_node->node_kind){
+ case CaseNode:
+ {
+ SymbolP symbol;
- case_node_p=overloaded_case_node_p->node_node;
- ReorderNodeDefinitionsAndDetermineUsedEntries (&case_node_p->node_node_defs,case_node_p->node_arguments->arg_node);
- } else {
- if (arg->arg_node->node_kind!=CaseNode && arg->arg_node->node_kind!=DefaultNode && arg->arg_node->node_kind!=OverloadedCaseNode)
+ symbol=arg->arg_node->node_symbol;
+ if (symbol->symb_kind==definition){
+ SymbDef sdef;
+
+ sdef=symbol->symb_def;
+ if (sdef->sdef_kind==CONSTRUCTOR){
+ sdef->sdef_isused=True;
+ sdef->sdef_mark |= SDEF_USED_STRICTLY_MASK;
+ }
+ }
+ /* no break */
+ }
+ case DefaultNode:
+ ReorderNodeDefinitionsAndDetermineUsedEntries (&arg->arg_node->node_node_defs,arg->arg_node->node_arguments->arg_node);
+ break;
+ case OverloadedCaseNode:
+ {
+ NodeP overloaded_case_node_p,case_node_p;
+
+ overloaded_case_node_p=arg->arg_node;
+ MarkDependentNodeDefs (overloaded_case_node_p->node_arguments->arg_node);
+ MarkDependentNodeDefs (overloaded_case_node_p->node_arguments->arg_next->arg_node);
+
+ case_node_p=overloaded_case_node_p->node_node;
+ ReorderNodeDefinitionsAndDetermineUsedEntries (&case_node_p->node_node_defs,case_node_p->node_arguments->arg_node);
+ break;
+ }
+ default:
error_in_function ("ReorderNodeDefinitionsAndDetermineUsedEntries");
-
- ReorderNodeDefinitionsAndDetermineUsedEntries (&arg->arg_node->node_node_defs,arg->arg_node->node_arguments->arg_node);
}
}