diff options
author | johnvg | 2013-12-04 11:29:51 +0000 |
---|---|---|
committer | johnvg | 2013-12-04 11:29:51 +0000 |
commit | f4cfedb62d877b349eb239387dccd538b7c97d76 (patch) | |
tree | ded4d383f2cbf49459ca6afacdf4e9de7f30dd5d /backendC/CleanCompilerSources/optimisations.c | |
parent | fix 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.c | 66 |
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); } } |