aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorronny2001-10-05 07:34:56 +0000
committerronny2001-10-05 07:34:56 +0000
commitc27f421f367a4bc2135e89eba1267af10d339024 (patch)
treeba1696088a5db21107fb8dfd432569b4667f1cf4 /backend
parentfail explicit cases (diff)
bind special idents (such as abort, undef from StdMisc) to the correct identifiers
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@828 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'backend')
-rw-r--r--backend/Clean System Files/backend_library2
-rw-r--r--backend/backend.dcl16
-rw-r--r--backend/backend.icl24
-rw-r--r--backend/backendconvert.icl46
4 files changed, 84 insertions, 4 deletions
diff --git a/backend/Clean System Files/backend_library b/backend/Clean System Files/backend_library
index 342803b..780b1b4 100644
--- a/backend/Clean System Files/backend_library
+++ b/backend/Clean System Files/backend_library
@@ -4,6 +4,8 @@ BEInit
BEFree
BEArg
BEDeclareModules
+BEBindSpecialModule
+BEBindSpecialFunction
BESpecialArrayFunctionSymbol
BEDictionarySelectFunSymbol
BEDictionaryUpdateFunSymbol
diff --git a/backend/backend.dcl b/backend/backend.dcl
index b144aa5..932338d 100644
--- a/backend/backend.dcl
+++ b/backend/backend.dcl
@@ -37,6 +37,7 @@ from StdString import String;
:: BEArrayFunKind :== Int;
:: BESelectorKind :== Int;
:: BEUpdateKind :== Int;
+:: BESpecialIdentIndex :== Int;
BEGetVersion :: (!Int,!Int,!Int);
// void BEGetVersion (int* current,int* oldestDefinition,int* oldestImplementation);
BEInit :: !Int !UWorld -> (!BackEnd,!UWorld);
@@ -47,6 +48,10 @@ BEArg :: !String !BackEnd -> BackEnd;
// void BEArg (CleanString arg);
BEDeclareModules :: !Int !BackEnd -> BackEnd;
// void BEDeclareModules (int nModules);
+BEBindSpecialModule :: !BESpecialIdentIndex !Int !BackEnd -> BackEnd;
+// void BEBindSpecialModule (BESpecialIdentIndex index,int moduleIndex);
+BEBindSpecialFunction :: !BESpecialIdentIndex !Int !Int !BackEnd -> BackEnd;
+// void BEBindSpecialFunction (BESpecialIdentIndex index,int functionIndex,int moduleIndex);
BESpecialArrayFunctionSymbol :: !BEArrayFunKind !Int !Int !BackEnd -> (!BESymbolP,!BackEnd);
// BESymbolP BESpecialArrayFunctionSymbol (BEArrayFunKind arrayFunKind,int functionIndex,int moduleIndex);
BEDictionarySelectFunSymbol :: !BackEnd -> (!BESymbolP,!BackEnd);
@@ -279,9 +284,9 @@ BEDeclareDynamicTypeSymbol :: !Int !Int !BackEnd -> BackEnd;
// void BEDeclareDynamicTypeSymbol (int typeIndex,int moduleIndex);
BEDynamicTempTypeSymbol :: !BackEnd -> (!BESymbolP,!BackEnd);
// BESymbolP BEDynamicTempTypeSymbol ();
-kBEVersionCurrent:==0x02000214;
+kBEVersionCurrent:==0x02000215;
kBEVersionOldestDefinition:==0x02000213;
-kBEVersionOldestImplementation:==0x02000214;
+kBEVersionOldestImplementation:==0x02000215;
kBEDebug:==1;
kPredefinedModuleIndex:==1;
BENoAnnot:==0;
@@ -354,6 +359,13 @@ BESelector_N:==5;
BEUpdateDummy:==0;
BEUpdate:==1;
BEUpdate_U:==2;
+BESpecialIdentStdMisc:==0;
+BESpecialIdentAbort:==1;
+BESpecialIdentUndef:==2;
+BESpecialIdentStdBool:==3;
+BESpecialIdentAnd:==4;
+BESpecialIdentOr:==5;
+BESpecialIdentCount:==6;
BELhsNodeId:==0;
BERhsNodeId:==1;
BEIsNotACaf:==0;
diff --git a/backend/backend.icl b/backend/backend.icl
index ac2c4b2..05ac802 100644
--- a/backend/backend.icl
+++ b/backend/backend.icl
@@ -37,6 +37,7 @@ from StdString import String;
:: BEArrayFunKind :== Int;
:: BESelectorKind :== Int;
:: BEUpdateKind :== Int;
+:: BESpecialIdentIndex :== Int;
BEGetVersion :: (!Int,!Int,!Int);
BEGetVersion = code {
@@ -68,6 +69,18 @@ BEDeclareModules a0 a1 = code {
};
// void BEDeclareModules (int nModules);
+BEBindSpecialModule :: !BESpecialIdentIndex !Int !BackEnd -> BackEnd;
+BEBindSpecialModule a0 a1 a2 = code {
+ ccall BEBindSpecialModule "II:V:I"
+};
+// void BEBindSpecialModule (BESpecialIdentIndex index,int moduleIndex);
+
+BEBindSpecialFunction :: !BESpecialIdentIndex !Int !Int !BackEnd -> BackEnd;
+BEBindSpecialFunction a0 a1 a2 a3 = code {
+ ccall BEBindSpecialFunction "III:V:I"
+};
+// void BEBindSpecialFunction (BESpecialIdentIndex index,int functionIndex,int moduleIndex);
+
BESpecialArrayFunctionSymbol :: !BEArrayFunKind !Int !Int !BackEnd -> (!BESymbolP,!BackEnd);
BESpecialArrayFunctionSymbol a0 a1 a2 a3 = code {
ccall BESpecialArrayFunctionSymbol "III:I:I"
@@ -763,9 +776,9 @@ BEDynamicTempTypeSymbol a0 = code {
ccall BEDynamicTempTypeSymbol ":I:I"
};
// BESymbolP BEDynamicTempTypeSymbol ();
-kBEVersionCurrent:==0x02000214;
+kBEVersionCurrent:==0x02000215;
kBEVersionOldestDefinition:==0x02000213;
-kBEVersionOldestImplementation:==0x02000214;
+kBEVersionOldestImplementation:==0x02000215;
kBEDebug:==1;
kPredefinedModuleIndex:==1;
BENoAnnot:==0;
@@ -838,6 +851,13 @@ BESelector_N:==5;
BEUpdateDummy:==0;
BEUpdate:==1;
BEUpdate_U:==2;
+BESpecialIdentStdMisc:==0;
+BESpecialIdentAbort:==1;
+BESpecialIdentUndef:==2;
+BESpecialIdentStdBool:==3;
+BESpecialIdentAnd:==4;
+BESpecialIdentOr:==5;
+BESpecialIdentCount:==6;
BELhsNodeId:==0;
BERhsNodeId:==1;
BEIsNotACaf:==0;
diff --git a/backend/backendconvert.icl b/backend/backendconvert.icl
index bea9282..1a5dbdf 100644
--- a/backend/backendconvert.icl
+++ b/backend/backendconvert.icl
@@ -363,6 +363,10 @@ beNoUniVarEquations
:== beFunction0 BENoUniVarEquations
beUniVarEquationsList
:== beFunction2 BEUniVarEquationsList
+beBindSpecialModule specialIdentIndex moduleIndex
+ :== beApFunction0 (BEBindSpecialModule specialIdentIndex moduleIndex)
+beBindSpecialFunction specialIdentIndex functionIndex moduleIndex
+ :== beApFunction0 (BEBindSpecialFunction specialIdentIndex functionIndex moduleIndex)
// temporary hack
beDynamicTempTypeSymbol
@@ -483,6 +487,7 @@ backEndConvertModulesH predefs {fe_icl =
with
dcl_common
= currentDcl.dcl_common
+ # backEnd = bindSpecialIdents predefs icl_used_module_numbers backEnd
#! backEnd = removeExpandedTypesFromDclModules fe_dcls icl_used_module_numbers backEnd
= (backEnd -*-> "backend done")
where
@@ -1076,6 +1081,47 @@ predefineSymbols {dcl_common} predefs
// ... sanity check
= appBackEnd (BEPredefineConstructorSymbol arity predefs.[index].pds_def cPredefinedModuleIndex symbolKind)
+
+bindSpecialIdents :: PredefinedSymbols NumberSet -> BackEnder
+bindSpecialIdents predefs usedModules
+ = foldState (bindSpecialModule predefs usedModules) specialModules
+ where
+ bindSpecialModule :: PredefinedSymbols NumberSet (Int, BESpecialIdentIndex, [(Int, BESpecialIdentIndex)]) -> BackEnder
+ bindSpecialModule predefs usedModules (predefIndex, specialIdentIndex, specialFunctions)
+ | moduleIndex == NoIndex || not (inNumberSet moduleIndex usedModules)
+ = identity
+ // otherwise
+ = beBindSpecialModule specialIdentIndex moduleIndex
+ o` foldState (bindSpecialFunction predefs) specialFunctions
+ where
+ predef
+ = predefs.[predefIndex]
+ moduleIndex
+ = predef.pds_def
+
+ bindSpecialFunction :: PredefinedSymbols (Int, BESpecialIdentIndex) -> BackEnder
+ bindSpecialFunction predefs (predefIndex, specialIdentIndex)
+ | predef.pds_def == NoIndex
+ = identity
+ // otherwise
+ = beBindSpecialFunction specialIdentIndex predef.pds_def predef.pds_module
+ where
+ predef
+ = predefs.[predefIndex]
+
+ specialModules
+ = [ (PD_StdMisc, BESpecialIdentStdMisc,
+ [ (PD_abort, BESpecialIdentAbort)
+ , (PD_undef, BESpecialIdentUndef)
+ ]
+ )
+ , (PD_StdBool, BESpecialIdentStdBool,
+ [ (PD_AndOp, BESpecialIdentAnd)
+ , (PD_OrOp, BESpecialIdentOr)
+ ]
+ )
+ ]
+
adjustStrictListFunctions :: [Int] [Int] {#PredefinedSymbol} {#DclModule} NumberSet Int *BackEndState -> *BackEndState;
adjustStrictListFunctions list_first_instance_indices tail_strict_list_first_instance_indices predefs dcls used_module_numbers main_dcl_module_n backEnd
| std_strict_list_module_index==NoIndex || not (inNumberSet std_strict_list_module_index used_module_numbers)