aboutsummaryrefslogtreecommitdiff
path: root/backendC
diff options
context:
space:
mode:
Diffstat (limited to 'backendC')
-rw-r--r--backendC/CleanCompilerSources/instructions.c78
1 files changed, 67 insertions, 11 deletions
diff --git a/backendC/CleanCompilerSources/instructions.c b/backendC/CleanCompilerSources/instructions.c
index 0e94de2..0190d4b 100644
--- a/backendC/CleanCompilerSources/instructions.c
+++ b/backendC/CleanCompilerSources/instructions.c
@@ -551,6 +551,8 @@ enum {
#define IpushI "pushI"
#define IpushC "pushC"
#define IpushR "pushR"
+#define IpushZR "pushZR"
+#define IpushZ "pushZ"
#define IpushD "pushD"
@@ -644,6 +646,7 @@ enum {
#define Ijmp_eval "jmp_eval"
#define Ijmp_eval_upd "jmp_eval_upd"
#define Ijmp_ap "jmp_ap"
+#define Ijmp_not_eqZ "jmp_not_eqZ"
#define Ijmp_ap_upd "jmp_ap_upd"
#define Ijmp_upd "jmp_upd"
@@ -687,6 +690,7 @@ static void put_instruction_code (int instruction_code)
#define Dnu "nu"
#define Dn_string "n_string"
#define Ddesc "desc"
+#define Ddesc0 "desc0"
#define Ddescn "descn"
#define Ddescs "descs"
#define Ddescexp "descexp"
@@ -1262,6 +1266,11 @@ void CallFunction (Label label, SymbDef def, Bool isjsr, Node root)
CallFunction2 (label, def, isjsr, root->node_state, root->node_arguments, root->node_arity);
}
+void CallFunction1 (Label label, SymbDef def, StateS root_state, Args fun_args, int arity)
+{
+ CallFunction2 (label, def, True, root_state, fun_args, arity);
+}
+
static void GenArraySize (Label elemdesc, int asize, int bsize)
{
put_instruction_ (Ipush_arraysize);
@@ -2018,6 +2027,18 @@ void GenBuildString (SymbValue val)
FPrintF (OutFile, "%s", val.val_string);
}
+void GenPushZ (SymbValue val)
+{
+ put_instruction_ (IpushZ);
+ FPrintF (OutFile, "%s", val.val_string);
+}
+
+void GenPushZR (SymbValue val)
+{
+ put_instruction_ (IpushZR);
+ FPrintF (OutFile, "%s", val.val_string);
+}
+
static void GenFieldLabel (Label label,char *record_name)
{
SymbDef def;
@@ -2244,6 +2265,13 @@ void GenJmpApUpd (int n_args)
put_arguments_n_b (n_args);
}
+void GenJmpNotEqZ (SymbValue val,Label tolab)
+{
+ put_instruction_ (Ijmp_not_eqZ);
+ FPrintF (OutFile, "%s ", val.val_string);
+ GenLabel (tolab);
+}
+
void GenJmpUpd (Label tolab)
{
put_instruction_b (jmp_upd);
@@ -2831,6 +2859,26 @@ void GenConstructorDescriptorAndExport (SymbDef sdef)
}
}
+void GenConstructor0DescriptorAndExport (SymbDef sdef,int constructor_n)
+{
+ char *name;
+
+ name = sdef->sdef_ident->ident_name;
+
+ if (sdef->sdef_exported || ExportLocalLabels){
+ put_directive_ (Dexport);
+ FPrintF (OutFile, "e_%s_" D_PREFIX "%s",CurrentModule,name);
+ put_directive_ (Ddesc0);
+ FPrintF (OutFile, "e_%s_" D_PREFIX "%s %d \"%s\"",CurrentModule, name, constructor_n , name);
+ } else if (DoDebug){
+ put_directive_ (Ddesc0);
+ FPrintF (OutFile, D_PREFIX "%s %d \"%s\"",name, constructor_n, name);
+ } else {
+ put_directive_ (Ddesc0);
+ FPrintF (OutFile, LOCAL_D_PREFIX "%u %d \"%s\"",sdef->sdef_number, constructor_n, name);
+ }
+}
+
void GenRecordDescriptor (SymbDef sdef)
{
int asize,bsize;
@@ -3442,15 +3490,18 @@ void GenStart (SymbDef startsymb)
{
if (startsymb->sdef_module == CurrentModule){
int arity;
-
+ char *start_function_name;
+
arity = startsymb->sdef_arity;
startsymb->sdef_mark |= SDEF_USED_LAZILY_MASK;
+
+ start_function_name=startsymb->sdef_ident->ident_name;
put_directive_ (Dexport);
- FPrintF (OutFile, "__%s_Start", CurrentModule);
+ FPrintF (OutFile, "__%s_%s",CurrentModule,start_function_name);
GenOAStackLayout (0);
- FPrintF (OutFile, "\n__%s_Start", CurrentModule);
+ FPrintF (OutFile, "\n__%s_%s", CurrentModule,start_function_name);
if (arity!=0){
put_instruction_b (buildI);
@@ -3460,15 +3511,15 @@ void GenStart (SymbDef startsymb)
put_instruction_b (build);
if (startsymb->sdef_exported)
- FPrintF (OutFile, "e_%s_" D_PREFIX "Start",CurrentModule);
+ FPrintF (OutFile, "e_%s_" D_PREFIX "%s",CurrentModule,start_function_name);
else if (ExportLocalLabels)
if (DoParallel)
- FPrintF (OutFile,"e_%s_" D_PREFIX "Start.%u",CurrentModule,startsymb->sdef_number);
+ FPrintF (OutFile,"e_%s_" D_PREFIX "%s.%u",CurrentModule,start_function_name,startsymb->sdef_number);
else
- FPutS (empty_lab.lab_name, OutFile);
+ FPutS (empty_lab.lab_name, OutFile);
else if (DoDebug){
if (DoParallel)
- FPrintF (OutFile, D_PREFIX "Start.%u",startsymb->sdef_number);
+ FPrintF (OutFile, D_PREFIX "%s.%u",start_function_name,startsymb->sdef_number);
else
FPutS (empty_lab.lab_name, OutFile);
} else {
@@ -3481,13 +3532,18 @@ void GenStart (SymbDef startsymb)
put_arguments__n__b (arity);
if (startsymb->sdef_exported)
- FPrintF (OutFile, "e_%s_" N_PREFIX "Start",CurrentModule);
+ FPrintF (OutFile, "e_%s_" N_PREFIX "%s",CurrentModule,start_function_name);
else if (ExportLocalLabels)
- FPrintF (OutFile, "e_%s_" N_PREFIX "Start.%u",CurrentModule,startsymb->sdef_number);
+ FPrintF (OutFile, "e_%s_" N_PREFIX "%s.%u",CurrentModule,start_function_name,startsymb->sdef_number);
else if (DoDebug)
- FPrintF (OutFile, N_PREFIX "Start.%u",startsymb->sdef_number);
+ FPrintF (OutFile, N_PREFIX "%s.%u",start_function_name,startsymb->sdef_number);
else
FPrintF (OutFile, N_PREFIX "%u",startsymb->sdef_number);
+
+ if (arity==0 && strcmp (start_function_name,"main")==0){
+ GenJsrEval (0);
+ GenJsrAp (1);
+ }
GenDAStackLayout (1);
put_instruction_b (jmp);
@@ -3534,7 +3590,7 @@ void InitFileInfo (ImpMod imod)
put_directive_ (Dstart);
if (start_sdef!=NULL){
- FPrintF (OutFile, "__%s_Start",start_sdef->sdef_module);
+ FPrintF (OutFile, "__%s_%s",start_sdef->sdef_module,start_sdef->sdef_ident->ident_name);
} else
FPutS ("_nostart_", OutFile);
}