aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohnvg2015-08-18 11:07:39 +0000
committerjohnvg2015-08-18 11:07:39 +0000
commit7da962c36d640bcb6c4aebc1c57c5c59d4aebe04 (patch)
treeea15fccd090c49bcfb884506ba5b8210571e1ab9
parentexport 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.c243
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)