diff options
Diffstat (limited to 'backendC/CleanCompilerSources/checker_2.c')
-rw-r--r-- | backendC/CleanCompilerSources/checker_2.c | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/backendC/CleanCompilerSources/checker_2.c b/backendC/CleanCompilerSources/checker_2.c new file mode 100644 index 0000000..3502cc2 --- /dev/null +++ b/backendC/CleanCompilerSources/checker_2.c @@ -0,0 +1,243 @@ +/* + Authors: Sjaak Smetsers & John van Groningen + Version: 1.2 +*/ + +#pragma segment checker + +#define COMPLEX_ABSTYPES +#define MOVE_LIFTED_CONSTANTS +#define OPTIMIZE_APPLIES +#define MOVE_MORE_LIFTED_CONSTANTS +#define MOVE_CURRIED_APPLICATIONS +#define MOVE_FUNCTIONS_IN_LAMBDAS + +#include "types.t" +#include "system.h" +#include "syntaxtr.t" +#include "comsupport.h" +#include "sizes.h" +#include "scanner.h" +#include "buildtree.h" +#include "comparser.h" +#include "statesgen.h" +#include "codegen_types.h" +#include "codegen1.h" +#include "codegen2.h" +#include "instructions.h" +#include "typechecker.h" +#include "transform.h" +#include "checksupport.h" +#include "checktypedefs.h" +#include "overloading.h" +#include "settings.h" +#include "checker.h" +#include "macros.h" +#ifdef MOVE_FUNCTIONS_IN_LAMBDAS +# include "optimise_lambda.h" +#endif +#ifdef applec +# include <types.h> +#endif + +#undef DEBUG_REF_COUNT + +#ifdef DEBUG_REF_COUNT +# define IF_DEBUG_REF_COUNT(a) a +# include "dbprint.h" +#else +# define IF_DEBUG_REF_COUNT(a) +#endif + +#define for_l(v,l,n) for(v=(l);v!=NULL;v=v->n) + +struct def_list { + Symbol mod_name; + Bool mod_undereval; + DefMod mod_body; + struct def_list * mod_next; +}; + +typedef struct def_list *DefModList,DefModElem; + +static DefModList OpenDefinitionModules; + +void GenDependencyList (void) +{ + DefModList def_mod; + + for_l (def_mod,OpenDefinitionModules,mod_next) + GenDepend (def_mod->mod_body->dm_name->symb_ident->ident_name +#if WRITE_DCL_MODIFICATION_TIME + ,def_mod->mod_body->dm_modification_time +#endif + ); +} + +void ReadInlineCode (void) +{ + DefModList d_mod; + + for_l (d_mod,OpenDefinitionModules,mod_next){ + DefMod def_mod; + + def_mod=d_mod->mod_body; + if (def_mod->dm_system_module){ + Symbol symbol; + + for_l (symbol,def_mod->dm_symbols,symb_next) + if (symbol->symb_kind==definition){ + SymbDef sdef; + + sdef=symbol->symb_def; + if (sdef->sdef_kind==SYSRULE && sdef->sdef_mark & SDEF_USED_STRICTLY_MASK) + break; + } + + if (symbol!=NULL) + /* Get the inline instructions of all the rules that are defined in this module */ + ScanInlineFile (d_mod->mod_name->symb_ident->ident_name); + } + } +} + + +Ident AnnotatedId, ListId, TupleId, ConsId, NilId, ApplyId, SelectId, +#ifdef CLEAN2 + DynamicId, +#endif + DeltaBId, IfId, FailId, AndId, OrId, + StdArrayId, ArrayFunctionIds [NoArrayFun]; + +Symbol StartSymbol; + +SymbDef ArrayFunctionDefs [NoArrayFun],StdArrayAbortDef; + +SymbDef scc_dependency_list; +SymbDef *scc_dependency_list_p; + +SymbDef MakeNewSymbolDefinition (char * module, Ident name, int arity, SDefKind kind) +{ + SymbDef def; + + def = CompAllocType (SymbDefS); + + def->sdef_module = module; + def->sdef_ident = name; + def->sdef_arity = arity; + def->sdef_kind = kind; + def->sdef_line = 0; + + def->sdef_mark=0; + def->sdef_over_arity=0; + + def->sdef_exported=False; + def->sdef_main_dcl=False; + def->sdef_infix=False; + + def->sdef_arfun = NoArrayFun; + + return def; +} + +static NodeDefs FreeDefs; + +NodeDefs NewNodeDef (NodeId nid,Node node) +{ + NodeDefs new; + + if (FreeDefs){ + new = FreeDefs; + FreeDefs = FreeDefs->def_next; + } else + new = CompAllocType (NodeDefS); + + new->def_id = nid; + new->def_node = node; + new->def_mark = 0; + + return new; +} + +static Ident SystemFunctionsId,StdArrayAbortId; + +void InitChecker (void) +{ + FreeDefs=NIL; + free_ldefs=NULL; +#ifndef CLEAN2 + free_depend_macros=NULL; +#endif + AnnotatedId = PutStringInHashTable ("_annotated", SymbolIdTable); + ListId = PutStringInHashTable ("[...]", SymbolIdTable); + TupleId = PutStringInHashTable ("(...)", SymbolIdTable); + ConsId = PutStringInHashTable ("[...|...]", SymbolIdTable); + NilId = PutStringInHashTable ("[]", SymbolIdTable); + ApplyId = PutStringInHashTable ("AP", SymbolIdTable); + SelectId = PutStringInHashTable ("_Select", SymbolIdTable); + +#ifdef CLEAN2 + DynamicId = PutStringInHashTable ("Dynamic", SymbolIdTable); +#endif + + /* hack RWS */ + IfId = PutStringInHashTable ("if ", SymbolIdTable); + IfId->ident_name = "if"; + + FailId = PutStringInHashTable ("_Fail", SymbolIdTable); + + StartSymbol = NewSymbol (newsymbol); + StartSymbol -> symb_ident = PutStringInHashTable ("Start", SymbolIdTable); + + AndId = PutStringInHashTable ("&&", SymbolIdTable); + OrId = PutStringInHashTable ("||", SymbolIdTable); + + SystemFunctionsId = PutStringInHashTable ("StdEnum", ModuleIdTable); + DeltaBId = PutStringInHashTable ("StdBool", ModuleIdTable); + StdArrayId = PutStringInHashTable ("_SystemArray", ModuleIdTable); + + /* Predefined Array functions */ + + StdArrayAbortId = PutStringInHashTable ("_abortArray", SymbolIdTable); + ArrayFunctionIds[CreateArrayFun] = PutStringInHashTable ("createArray", SymbolIdTable); + ArrayFunctionIds[UnqArraySelectFun] = PutStringInHashTable ("uselect", SymbolIdTable); + ArrayFunctionIds[ArrayReplaceFun] = PutStringInHashTable ("replace", SymbolIdTable); + ArrayFunctionIds[UnqArraySizeFun] = PutStringInHashTable ("usize", SymbolIdTable); + ArrayFunctionIds[ArrayUpdateFun] = PutStringInHashTable ("update", SymbolIdTable); + ArrayFunctionIds[ArraySelectFun] = PutStringInHashTable ("select", SymbolIdTable); + ArrayFunctionIds[ArraySizeFun] = PutStringInHashTable ("size", SymbolIdTable); + ArrayFunctionIds[_CreateArrayFun] = PutStringInHashTable ("_createArrayc", SymbolIdTable); + ArrayFunctionIds[_UnqArraySelectFun]= PutStringInHashTable ("_uselectf", SymbolIdTable); + ArrayFunctionIds[_UnqArraySelectNextFun]= PutStringInHashTable ("_uselectn", SymbolIdTable); + ArrayFunctionIds[_UnqArraySelectLastFun]= PutStringInHashTable ("_uselectl", SymbolIdTable); + ArrayFunctionIds[_ArrayUpdateFun]= PutStringInHashTable ("_updatei", SymbolIdTable); + + FunTypeClass.tac_uniprop = ALLBITSCLEAR; + FunTypeClass.tac_possign = BIT(1); + FunTypeClass.tac_negsign = BIT(0); + + GeneralTypeClass.tac_uniprop = ALLBITSSET; + GeneralTypeClass.tac_possign = ALLBITSSET; + GeneralTypeClass.tac_negsign = ALLBITSCLEAR; + + OpenDefinitionModules = NIL; +} + +#ifdef CLEAN2 + void ClearOpenDefinitionModules (void) + { + OpenDefinitionModules = NULL; + } + + void AddOpenDefinitionModule (SymbolP moduleNameSymbol, DefMod definitionModule) + { + DefModList openModule; + + openModule = CompAllocType (DefModElem); + openModule->mod_name = moduleNameSymbol; + openModule->mod_body = definitionModule; + openModule->mod_next = OpenDefinitionModules; + + OpenDefinitionModules = openModule; + } +#endif |