Commit 5c8aeef4 authored by Ronny Wichers Schreur's avatar Ronny Wichers Schreur

bind special idents (such as abort, undef from StdMisc) to the correct identifiers

parent 60812627
......@@ -4,6 +4,8 @@ BEInit
BEFree
BEArg
BEDeclareModules
BEBindSpecialModule
BEBindSpecialFunction
BESpecialArrayFunctionSymbol
BEDictionarySelectFunSymbol
BEDictionaryUpdateFunSymbol
......
......@@ -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;
......
......@@ -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;
......
......@@ -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)
......
......@@ -170,6 +170,9 @@ static SymbolP gTupleSelectSymbols [MaxNodeArity];
static int number_of_node_ids=0;
typedef IdentP *IdentH;
static IdentH gSpecialIdents[BESpecialIdentCount];
static IdentP
Identifier (char *name)
{
......@@ -536,6 +539,37 @@ GetArrayFunctionType (SymbDefP sdef, TypeNode *elementTypeP, TypeNode *arrayType
}
} /* GetArrayFunctionType */
void
BEBindSpecialModule (BESpecialIdentIndex index, int moduleIndex)
{
BEModuleP module;
Assert (index >= 0 && index < BESpecialIdentCount);
Assert ((unsigned int) moduleIndex < gBEState.be_nModules);
module = &gBEState.be_modules [moduleIndex];
(*gSpecialIdents [index])->ident_name = module->bem_name;
} /* BEBindSpecialModule */
void
BEBindSpecialFunction (BESpecialIdentIndex index, int functionIndex, int moduleIndex)
{
SymbolP functionSymbol;
BEModuleP module;
Assert (index >= 0 && index < BESpecialIdentCount);
Assert ((unsigned int) moduleIndex < gBEState.be_nModules);
module = &gBEState.be_modules [moduleIndex];
Assert ((unsigned int) functionIndex < module->bem_nFunctions);
functionSymbol = &module->bem_functions [functionIndex];
if (functionSymbol->symb_kind == definition)
*gSpecialIdents [index] = functionSymbol->symb_def->sdef_ident;
} /* BEBindSpecialFunction */
BESymbolP
BESpecialArrayFunctionSymbol (BEArrayFunKind arrayFunKind, int functionIndex, int moduleIndex)
{
......@@ -3522,7 +3556,6 @@ BEInit (int argc)
/* +++ remove symbol table from backend */
ScanInitIdentStringTable ();
InitScanner (); /* for inlining */
DeltaBId = Identifier ("StdBool");
ApplyId = Identifier ("AP");
ListId = Identifier ("List");
TupleId = Identifier ("Tuple");
......@@ -3535,6 +3568,23 @@ BEInit (int argc)
DynamicId = Identifier ("Dynamic");
#endif
#if SA_RECOGNIZES_ABORT_AND_UNDEF
StdMiscId = Identifier ("StdMisc");
abort_id = NULL;
undef_id = NULL;
gSpecialIdents [BESpecialIdentStdMisc] = &StdMiscId;
gSpecialIdents [BESpecialIdentAbort] = &abort_id;
gSpecialIdents [BESpecialIdentUndef] = &undef_id;
#endif
DeltaBId = Identifier ("StdBool");
AndId = NULL;
OrId = NULL;
gSpecialIdents [BESpecialIdentStdBool] = &DeltaBId;
gSpecialIdents [BESpecialIdentAnd] = &AndId;
gSpecialIdents [BESpecialIdentOr] = &OrId;
UserDefinedArrayFunctions = NULL;
#if STRICT_LISTS
unboxed_record_cons_list=NULL;
......
/* version info */
// increment this for every release
# define kBEVersionCurrent 0x02000214
# define kBEVersionCurrent 0x02000215
// change this to the same value as kBEVersionCurrent if the new release is not
// upward compatible (for example when a function is added)
// change this to the same value as kBEVersionCurrent if the new release is
// not upward compatible (for example when a function is added)
# define kBEVersionOldestDefinition 0x02000213
// change this to the same value as kBEVersionCurrent if the new release is not
// downward compatible (for example when a function is removed)
# define kBEVersionOldestImplementation 0x02000214
// change this to the same value as kBEVersionCurrent if the new release is
// not downward compatible (for example when a function is removed)
# define kBEVersionOldestImplementation 0x02000215
# define kBEDebug 1
......@@ -161,7 +161,15 @@ enum {
BEUpdateDummy, BEUpdate, BEUpdate_U
};
typedef int BESpecialIdentIndex;
Clean (::BESpecialIdentIndex :== Int)
enum {
/* StdMisc */
BESpecialIdentStdMisc, BESpecialIdentAbort, BESpecialIdentUndef,
BESpecialIdentStdBool, BESpecialIdentAnd, BESpecialIdentOr,
BESpecialIdentCount
};
/* functions */
void BEGetVersion (int *current, int *oldestDefinition, int *oldestImplementation);
......@@ -179,6 +187,12 @@ Clean (BEArg :: String BackEnd -> BackEnd)
void BEDeclareModules (int nModules);
Clean (BEDeclareModules :: Int BackEnd -> BackEnd)
void BEBindSpecialModule (BESpecialIdentIndex index, int moduleIndex);
Clean (BEBindSpecialModule :: BESpecialIdentIndex Int BackEnd -> BackEnd)
void BEBindSpecialFunction (BESpecialIdentIndex index, int functionIndex, int moduleIndex);
Clean (BEBindSpecialFunction :: BESpecialIdentIndex Int Int BackEnd -> BackEnd)
BESymbolP BESpecialArrayFunctionSymbol (BEArrayFunKind arrayFunKind, int functionIndex, int moduleIndex);
Clean (BESpecialArrayFunctionSymbol :: BEArrayFunKind Int Int BackEnd -> (BESymbolP, BackEnd))
......
......@@ -18,7 +18,7 @@
#define WRITE_DCL_MODIFICATION_TIME 1
#define SA_RECOGNIZES_ABORT_AND_UNDEF 0
#define SA_RECOGNIZES_ABORT_AND_UNDEF 1
#define STRICT_LISTS 1
......
No preview for this file type
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment