diff options
author | johnvg | 2015-08-18 11:07:39 +0000 |
---|---|---|
committer | johnvg | 2015-08-18 11:07:39 +0000 |
commit | 7da962c36d640bcb6c4aebc1c57c5c59d4aebe04 (patch) | |
tree | ea15fccd090c49bcfb884506ba5b8210571e1ab9 | |
parent | export label of node entry for Array methods for arrays of unboxed records if... (diff) |
add descriptors of unboxed sub records to .record directive, in reverse order
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@2605 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r-- | backendC/CleanCompilerSources/instructions.c | 243 |
1 files changed, 206 insertions, 37 deletions
diff --git a/backendC/CleanCompilerSources/instructions.c b/backendC/CleanCompilerSources/instructions.c index 295e6b0..cf7c131 100644 --- a/backendC/CleanCompilerSources/instructions.c +++ b/backendC/CleanCompilerSources/instructions.c @@ -1091,7 +1091,6 @@ static void GenABStackElems (StateS state) FPutC (BElems [(int) state.state_object], OutFile); else FPutC ('a', OutFile); - } else { int arity; States argstates; @@ -1126,6 +1125,45 @@ static void GenABStackElems (StateS state) } } +static void GenABStackElemsForRecordDesc (StateS state) +{ + if (IsSimpleState (state)){ + if (state.state_kind == OnB) + FPutC (BElems [(int) state.state_object], OutFile); + else + FPutC ('a', OutFile); + } else { + int arity; + States argstates; + + switch (state.state_type){ + case TupleState: + argstates = state.state_tuple_arguments; + FPutC ('(', OutFile); + if (state.state_arity>0){ + GenABStackElemsForRecordDesc (argstates[0]); + for (arity=1; arity < state.state_arity; ++arity){ + FPutC (',', OutFile); + GenABStackElemsForRecordDesc (argstates[arity]); + } + } + FPutC (')', OutFile); + case RecordState: + argstates = state.state_record_arguments; + FPutC ('(', OutFile); + for (arity=0; arity < state.state_arity; ++arity) + GenABStackElems (argstates[arity]); + FPutC (')', OutFile); + return; + case ArrayState: + FPutC ('a', OutFile); + return; + default: + error_in_function ("GenABStackElemsForRecordDesc"); + } + } +} + static void GenABStackElemsOfRecord (StateS state) { if (state.state_type==RecordState){ @@ -1134,9 +1172,111 @@ static void GenABStackElemsOfRecord (StateS state) argstates = state.state_record_arguments; for (arity=0; arity < state.state_arity; ++arity) - GenABStackElems (argstates[arity]); + GenABStackElemsForRecordDesc (argstates[arity]); + } else + GenABStackElemsForRecordDesc (state); +} + +static int AddSizeOfStatesAndImportRecords (int arity, States states, int *asize, int *bsize); + +static int AddSizeOfStateAndImportRecords (StateS state, int *asize, int *bsize) +{ + if (IsSimpleState (state)){ + if (state.state_kind == OnB) + *bsize += ObjectSizes [state.state_object]; + else if (state.state_kind != Undefined) + *asize += SizeOfAStackElem; + return 0; + } else { + switch (state.state_type){ + case RecordState: + { + SymbDef record_sdef; + + record_sdef = state.state_record_symbol; + if (record_sdef->sdef_exported || record_sdef->sdef_module!=CurrentModule || ExportLocalLabels){ + if ((record_sdef->sdef_mark & SDEF_RECORD_R_LABEL_IMPORTED_MASK)!=0){ + record_sdef->sdef_mark |= SDEF_USED_STRICTLY_MASK; + } else { + record_sdef->sdef_mark |= SDEF_USED_STRICTLY_MASK; + record_sdef->sdef_mark |= SDEF_USED_STRICTLY_MASK | SDEF_RECORD_R_LABEL_IMPORTED_MASK; + GenImpRecordDesc (record_sdef->sdef_module,record_sdef->sdef_ident->ident_name); + } + } + + (void) AddSizeOfStatesAndImportRecords (state.state_arity, state.state_record_arguments, asize, bsize); + return 1; + } + case TupleState: + return AddSizeOfStatesAndImportRecords (state.state_arity, state.state_tuple_arguments, asize, bsize); + case ArrayState: + *asize += SizeOfAStackElem; + return 0; + } + } + return 0; +} + +static int AddSizeOfStatesAndImportRecords (int arity, States states, int *asize, int *bsize) +{ + int has_unboxed_record; + + has_unboxed_record=0; + for (; arity; arity--) + has_unboxed_record |= AddSizeOfStateAndImportRecords (states [arity-1], asize, bsize); + return has_unboxed_record; +} + +static void GenUnboxedRecordLabelsReversed (StateS state) +{ + if (!IsSimpleState (state)){ + int arity; + States argstates; + + switch (state.state_type){ + case TupleState: + argstates = state.state_tuple_arguments; + for (arity=state.state_arity-1; arity>=0; --arity) + GenUnboxedRecordLabelsReversed (argstates[arity]); + return; + case RecordState: + { + SymbDef record_sdef; + + argstates = state.state_record_arguments; + for (arity=state.state_arity-1; arity>=0 ; --arity) + GenUnboxedRecordLabelsReversed (argstates[arity]); + + record_sdef = state.state_record_symbol; + if (!record_sdef->sdef_exported && record_sdef->sdef_module==CurrentModule && !ExportLocalLabels){ + if (DoDebug) + FPrintF (OutFile, R_PREFIX "%s ",record_sdef->sdef_ident->ident_name); + else + FPrintF (OutFile, R_PREFIX "%u ",record_sdef->sdef_number); + } else + FPrintF (OutFile, "e_%s_" R_PREFIX "%s ",record_sdef->sdef_module,record_sdef->sdef_ident->ident_name); + return; + } + case ArrayState: + return; + default: + error_in_function ("GenUnboxedRecordLabelsReversed"); + return; + } + } +} + +static void GenUnboxedRecordLabelsReversedForRecord (StateS state) +{ + if (state.state_type==RecordState){ + int arity; + States argstates; + + argstates = state.state_record_arguments; + for (arity=state.state_arity-1; arity>=0; --arity) + GenUnboxedRecordLabelsReversed (argstates[arity]); } else - GenABStackElems (state); + GenUnboxedRecordLabelsReversed (state); } void GenDStackLayout (int asize,int bsize,Args fun_args) @@ -2914,12 +3054,21 @@ void GenConstructor0DescriptorAndExport (SymbDef sdef,int constructor_n) void GenRecordDescriptor (SymbDef sdef) { - int asize,bsize; + int asize,bsize,has_unboxed_record; char *name; StateS recstate; + + recstate = sdef->sdef_record_state; + + asize=0; + bsize=0; + if (recstate.state_type==RecordState) + has_unboxed_record = AddSizeOfStatesAndImportRecords (recstate.state_arity,recstate.state_record_arguments,&asize,&bsize); + else + has_unboxed_record = AddSizeOfStateAndImportRecords (recstate,&asize,&bsize); name = sdef->sdef_ident->ident_name; - + if (sdef->sdef_exported || ExportLocalLabels){ put_directive_ (Dexport); FPrintF (OutFile, "e_%s_" R_PREFIX "%s",CurrentModule,name); @@ -2933,21 +3082,32 @@ void GenRecordDescriptor (SymbDef sdef) FPrintF (OutFile, R_PREFIX "%u ",sdef->sdef_number); } - recstate = sdef->sdef_record_state; - GenABStackElemsOfRecord (recstate); - - DetermineSizeOfState (recstate,&asize,&bsize); - FPrintF (OutFile, " %d %d \"%s\"",asize,bsize,name); + if (!has_unboxed_record) + FPrintF (OutFile, " %d %d \"%s\"",asize,bsize,name); + else { + FPrintF (OutFile, " %d %d ",asize,bsize); + GenUnboxedRecordLabelsReversedForRecord (recstate); + FPrintF (OutFile, "\"%s\"",name); + } } #ifdef STRICT_LISTS void GenUnboxedConsRecordDescriptor (SymbDef sdef,int tail_strict) { - int asize,bsize; + int asize,bsize,has_unboxed_record; char *name,*unboxed_record_cons_prefix; - StateS tuple_state,tuple_arguments_state[2]; + StateS tuple_arguments_state[2]; + + tuple_arguments_state[0] = sdef->sdef_record_state; + tuple_arguments_state[1] = LazyState; + + DetermineSizeOfState (tuple_arguments_state[1],&asize,&bsize); + if (tuple_arguments_state[0].state_type==RecordState) + has_unboxed_record = AddSizeOfStatesAndImportRecords (tuple_arguments_state[0].state_arity,tuple_arguments_state[0].state_record_arguments,&asize,&bsize); + else + has_unboxed_record = AddSizeOfStateAndImportRecords (tuple_arguments_state[0],&asize,&bsize); name = sdef->sdef_ident->ident_name; @@ -2963,33 +3123,42 @@ void GenUnboxedConsRecordDescriptor (SymbDef sdef,int tail_strict) FPrintF (OutFile, "%s%s ",unboxed_record_cons_prefix,name); } - tuple_state.state_type=TupleState; - tuple_state.state_arity=2; - tuple_state.state_tuple_arguments=tuple_arguments_state; - - tuple_arguments_state[0] = sdef->sdef_record_state; - tuple_arguments_state[1] = LazyState; - FPutC ('l', OutFile); FPutC ('R', OutFile); GenABStackElemsOfRecord (tuple_arguments_state[0]); GenABStackElems (tuple_arguments_state[1]); - - DetermineSizeOfState (tuple_state,&asize,&bsize); - if (ExportLocalLabels) - FPrintF (OutFile,tail_strict ? " %d %d \"_Cons#!%s\"" : " %d %d \"_Cons#%s\"",asize,bsize,name); - else - FPrintF (OutFile,tail_strict ? " %d %d \"[#%s!]\"" : " %d %d \"[#%s]\"",asize,bsize,name); + if (!has_unboxed_record){ + if (ExportLocalLabels) + FPrintF (OutFile,tail_strict ? " %d %d \"_Cons#!%s\"" : " %d %d \"_Cons#\"",asize,bsize,name); + else + FPrintF (OutFile,tail_strict ? " %d %d \"[#%s!]\"" : " %d %d \"[#%s]\"",asize,bsize,name); + } else { + FPrintF (OutFile," %d %d ",asize,bsize); + GenUnboxedRecordLabelsReversedForRecord (tuple_arguments_state[0]); + if (ExportLocalLabels) + FPrintF (OutFile,tail_strict ? "\"_Cons#!%s\"" : "\"_Cons#\"",asize,bsize,name); + else + FPrintF (OutFile,tail_strict ? "\"[#%s!]\"" : "\"[#%s]\"",asize,bsize,name); + } } #endif -void GenStrictConstructorDescriptor (SymbDef sdef,StateP constructor_arg_state_p) +void GenStrictConstructorDescriptor (SymbDef sdef,StateP constructor_arg_states) { - int asize,bsize,state_arity,arg_n; + int asize,bsize,state_arity,arg_n,has_unboxed_record; + StateP constructor_arg_state_p; char *name; + state_arity=sdef->sdef_arity; + + asize = 0; + bsize = 0; + has_unboxed_record = 0; + for (arg_n=0,constructor_arg_state_p=constructor_arg_states; arg_n<state_arity; ++arg_n,++constructor_arg_state_p) + has_unboxed_record |= AddSizeOfStateAndImportRecords (*constructor_arg_state_p,&asize,&bsize); + name = sdef->sdef_ident->ident_name; if (sdef->sdef_exported || ExportLocalLabels){ @@ -3007,17 +3176,17 @@ void GenStrictConstructorDescriptor (SymbDef sdef,StateP constructor_arg_state_p FPutC ('d', OutFile); - state_arity=sdef->sdef_arity; - asize = 0; - bsize = 0; - - for (arg_n=0; arg_n<state_arity; ++arg_n){ - GenABStackElems (*constructor_arg_state_p); - AddSizeOfState (*constructor_arg_state_p,&asize,&bsize); - ++constructor_arg_state_p; - } + for (arg_n=0,constructor_arg_state_p=constructor_arg_states; arg_n<state_arity; ++arg_n,++constructor_arg_state_p) + GenABStackElemsForRecordDesc (*constructor_arg_state_p); - FPrintF (OutFile, " %d %d \"%s\"", asize, bsize, name); + if (!has_unboxed_record) + FPrintF (OutFile, " %d %d \"%s\"", asize, bsize, name); + else { + FPrintF (OutFile, " %d %d ", asize, bsize); + for (arg_n=state_arity-1; arg_n>=0; --arg_n) + GenUnboxedRecordLabelsReversed (constructor_arg_states[arg_n]); + FPrintF (OutFile, "\"%s\"", name); + } } void GenArrayFunctionDescriptor (SymbDef arr_fun_def, Label desclab, int arity) |