From c27f421f367a4bc2135e89eba1267af10d339024 Mon Sep 17 00:00:00 2001
From: ronny
Date: Fri, 5 Oct 2001 07:34:56 +0000
Subject: 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
---
 backend/Clean System Files/backend_library |  2 ++
 backend/backend.dcl                        | 16 +++++++++--
 backend/backend.icl                        | 24 ++++++++++++++--
 backend/backendconvert.icl                 | 46 ++++++++++++++++++++++++++++++
 4 files changed, 84 insertions(+), 4 deletions(-)

(limited to 'backend')

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)
-- 
cgit v1.2.3