1 | /* |
2 | * This Source Code Form is subject to the terms of the Mozilla Public |
3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
5 | * |
6 | * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. |
7 | */ |
8 | |
9 | #ifndef _MAL_INSTR_H |
10 | #define _MAL_INSTR_H |
11 | |
12 | #include "mal_type.h" |
13 | #include "mal_stack.h" |
14 | #include "mal_namespace.h" |
15 | |
16 | #define isaSignature(P) ((P)->token >=COMMANDsymbol) |
17 | |
18 | #ifdef HAVE_SYS_TIMES_H |
19 | # include <sys/times.h> |
20 | #endif |
21 | |
22 | #define DEBUG_MAL_INSTR |
23 | /* #define DEBUG_REDUCE */ |
24 | #define MAXARG 8 /* was 4 BEWARE the code depends on this knowledge, where? */ |
25 | #define STMT_INCREMENT 4 |
26 | #define MAL_VAR_WINDOW 32 |
27 | #define MAXLISTING (64*1024) |
28 | |
29 | /* Allocation of space assumes a rather exotic number of |
30 | * arguments. Access to module and function name are cast in macros to |
31 | * prepare for separate name space management. */ |
32 | #define getModuleId(P) (P)->modname |
33 | #define setModuleId(P,S) (P)->modname= S |
34 | #define setModuleScope(P,S) do {(P)->modname= (S)==NULL?NULL: (S)->name;} while (0) |
35 | |
36 | #define getFunctionId(P) (P)->fcnname |
37 | #define setFunctionId(P,S) (P)->fcnname= S |
38 | #define garbageControl(P) ((P)->gc & GARBAGECONTROL) |
39 | |
40 | #define getInstrPtr(M,I) (M)->stmt[I] |
41 | #define getSignature(S) getInstrPtr((S)->def,0) |
42 | #define isMain(M) ((getInstrPtr(M,0))->fcnname== putName("main",4)) |
43 | #define getFcnName(M) getFunctionId(getInstrPtr(M,0)) |
44 | #define getArgCount(M) getInstrPtr(M,0)->argc |
45 | #define getModName(M) getModuleId(getInstrPtr(M,0)) |
46 | #define getPrgSize(M) (M)->stop |
47 | |
48 | #define getVar(M,I) (&(M)->var[I]) |
49 | #define getVarType(M,I) ((M)->var[I].type) |
50 | #define getVarName(M,I) ((M)->var[I].id) |
51 | #define getVarGDKType(M,I) getGDKType((M)->var[I].type) |
52 | #define setVarType(M,I,V) (M)->var[I].type = V |
53 | |
54 | #define clrVarFixed(M,I) ((M)->var[I].fixedtype = 0) |
55 | #define setVarFixed(M,I) ((M)->var[I].fixedtype =1) |
56 | #define isVarFixed(M,I) ((M)->var[I].fixedtype) |
57 | |
58 | #define clrVarCleanup(M,I) ((M)->var[I].cleanup = 0) |
59 | #define setVarCleanup(M,I) ((M)->var[I].cleanup = 1) |
60 | #define isVarCleanup(M,I) ((M)->var[I].cleanup ) |
61 | |
62 | #define isTmpVar(M,I) (*getVarName(M,I) == REFMARKER && *(getVarName(M,I)+1) == TMPMARKER) |
63 | |
64 | #define clrVarUsed(M,I) ((M)->var[I].used = 0) |
65 | #define setVarUsed(M,I) ((M)->var[I].used = 1) |
66 | #define isVarUsed(M,I) ((M)->var[I].used) |
67 | |
68 | #define clrVarDisabled(M,I) ((M)->var[I].disabled= 0 ) |
69 | #define setVarDisabled(M,I) ((M)->var[I].disabled = 1) |
70 | #define isVarDisabled(M,I) ((M)->var[I].disabled) |
71 | |
72 | #define clrVarInit(M,I) ((M)->var[I].initialized = 0) |
73 | #define setVarInit(M,I) ((M)->var[I].initialized = 1) |
74 | #define isVarInit(M,I) ((M)->var[I].initialized) |
75 | |
76 | #define clrVarTypedef(M,I) ((M)->var[I].typevar = 0) |
77 | #define setVarTypedef(M,I) ((M)->var[I].typevar = 1) |
78 | #define isVarTypedef(M,I) ((M)->var[I].typevar) |
79 | |
80 | #define clrVarUDFtype(M,I) ((M)->var[I].udftype = 0) |
81 | #define setVarUDFtype(M,I) ((M)->var[I].udftype = 1) |
82 | #define isVarUDFtype(M,I) ((M)->var[I].udftype) |
83 | |
84 | #define clrVarConstant(M,I) ((M)->var[I].constant = 0) |
85 | #define setVarConstant(M,I) ((M)->var[I].constant = 1) |
86 | #define isVarConstant(M,I) ((M)->var[I].constant) |
87 | |
88 | #define setVarDeclared(M,I,X) ((M)->var[I].declared = X ) |
89 | #define getVarDeclared(M,I) ((M)->var[I].declared) |
90 | |
91 | #define setVarUpdated(M,I,X) ((M)->var[I].updated = X ) |
92 | #define getVarUpdated(M,I) ((M)->var[I].updated) |
93 | |
94 | #define setVarEolife(M,I,X) ((M)->var[I].eolife = X ) |
95 | #define getVarEolife(M,I) ((M)->var[I].eolife) |
96 | |
97 | #define setVarWorker(M,I,S) ((M)->var[I].worker = S) |
98 | #define getVarWorker(M,I) ((M)->var[I].worker) |
99 | |
100 | #define setVarScope(M,I,S) ((M)->var[I].depth = S) |
101 | #define getVarScope(M,I) ((M)->var[I].depth) |
102 | |
103 | #define clrVarCList(M,I) ((M)->var[I].id[0]= REFMARKER) |
104 | #define setVarCList(M,I) ((M)->var[I].id[0]= REFMARKERC) |
105 | #define isVarCList(M,I) ((M)->var[I].id[0] == REFMARKERC) |
106 | |
107 | #define getVarConstant(M,I) ((M)->var[I].value) |
108 | #define getVarValue(M,I) VALget(&(M)->var[I].value) |
109 | |
110 | #define setRowCnt(M,I,C) (M)->var[I].rowcnt = C |
111 | #define getRowCnt(M,I) ((M)->var[I].rowcnt) |
112 | |
113 | #define setMitosisPartition(P,C) (P)->mitosis = C |
114 | #define getMitosisPartition(P) ((P)->mitosis) |
115 | |
116 | #define getVarSTC(M,I) ((M)->var[I].stc) |
117 | |
118 | #define getDestVar(P) (P)->argv[0] |
119 | #define setDestVar(P,X) (P)->argv[0] =X |
120 | #define setDestType(M,P,V) setVarType((M),getDestVar(P),V) |
121 | #define getDestType(M,P) destinationType((M),(P)) |
122 | #define getArg(P,I) (P)->argv[I] |
123 | #define setArg(P,I,R) (P)->argv[I]= R |
124 | #define getArgName(M,P,I) getVarName((M),(P)->argv[I]) |
125 | #define getArgType(M,P,I) getVarType((M),(P)->argv[I]) |
126 | #define getArgGDKType(M,P,I) getVarGDKType((M),(P)->argv[I]) |
127 | #define getGDKType(T) ( T <= TYPE_str ? T : (T == TYPE_any ? TYPE_void : findGDKtype(T))) |
128 | |
129 | mal_export void addMalException(MalBlkPtr mb, str msg); |
130 | mal_export void mal_instruction_reset(void); |
131 | mal_export InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme); |
132 | mal_export InstrPtr newInstructionArgs(MalBlkPtr mb, str modnme, str fcnnme, int args); |
133 | mal_export InstrPtr copyInstruction(InstrPtr p); |
134 | mal_export void oldmoveInstruction(InstrPtr dst, InstrPtr src); |
135 | mal_export void clrInstruction(InstrPtr p); |
136 | mal_export void freeInstruction(InstrPtr p); |
137 | mal_export void clrFunction(InstrPtr p); |
138 | mal_export Symbol newSymbol(str nme, int kind); |
139 | mal_export void freeSymbol(Symbol s); |
140 | mal_export void freeSymbolList(Symbol s); |
141 | mal_export void printSignature(stream *fd, Symbol s, int flg); |
142 | |
143 | mal_export MalBlkPtr newMalBlk(int elements); |
144 | mal_export void resetMalBlk(MalBlkPtr mb, int stop); |
145 | mal_export void resetMalBlkAndFreeInstructions(MalBlkPtr mb, int stop); |
146 | mal_export int newMalBlkStmt(MalBlkPtr mb, int elements); |
147 | mal_export int resizeMalBlk(MalBlkPtr mb, int elements); |
148 | mal_export int prepareMalBlk(MalBlkPtr mb, str s); |
149 | mal_export void freeMalBlk(MalBlkPtr mb); |
150 | mal_export MalBlkPtr copyMalBlk(MalBlkPtr mb); |
151 | mal_export void addtoMalBlkHistory(MalBlkPtr mb); |
152 | mal_export MalBlkPtr getMalBlkHistory(MalBlkPtr mb, int idx); |
153 | mal_export MalBlkPtr getMalBlkOptimized(MalBlkPtr mb, str name); |
154 | mal_export void trimMalVariables(MalBlkPtr mb, MalStkPtr stk); |
155 | mal_export void trimMalVariables_(MalBlkPtr mb, MalStkPtr glb); |
156 | mal_export void moveInstruction(MalBlkPtr mb, int pc, int target); |
157 | mal_export void removeInstruction(MalBlkPtr mb, InstrPtr p); |
158 | mal_export void removeInstructionBlock(MalBlkPtr mb, int pc, int cnt); |
159 | mal_export str operatorName(int i); |
160 | |
161 | mal_export int findVariable(MalBlkPtr mb, const char *name); |
162 | mal_export int findVariableLength(MalBlkPtr mb, str name, int len); |
163 | mal_export malType getType(MalBlkPtr mb, str nme); |
164 | mal_export str getArgDefault(MalBlkPtr mb, InstrPtr p, int idx); |
165 | mal_export int newVariable(MalBlkPtr mb, const char *name, size_t len, malType type); |
166 | mal_export int cloneVariable(MalBlkPtr dst, MalBlkPtr src, int varid); |
167 | /* generate a new variable name based on a pattern with 1 %d argument |
168 | * -- not used, but this is how to do it */ |
169 | /* #define renameVariable(mb, id, pattern, newid) snprintf(getVarName(mb,id),IDLENGTH,pattern,newid) */ |
170 | mal_export int newTmpVariable(MalBlkPtr mb, malType type); |
171 | mal_export int newTypeVariable(MalBlkPtr mb, malType type); |
172 | mal_export void freeVariable(MalBlkPtr mb, int varid); |
173 | mal_export void clearVariable(MalBlkPtr mb, int varid); |
174 | mal_export int cpyConstant(MalBlkPtr mb, VarPtr vr); |
175 | mal_export int defConstant(MalBlkPtr mb, int type, ValPtr cst); |
176 | mal_export int fndConstant(MalBlkPtr mb, const ValRecord *cst, int depth); |
177 | mal_export str convertConstant(malType type, ValPtr vr); |
178 | |
179 | mal_export void pushInstruction(MalBlkPtr mb, InstrPtr p); |
180 | mal_export InstrPtr pushArgument(MalBlkPtr mb, InstrPtr p, int varid); |
181 | mal_export InstrPtr setArgument(MalBlkPtr mb, InstrPtr p, int idx, int varid); |
182 | mal_export InstrPtr pushReturn(MalBlkPtr mb, InstrPtr p, int varid); |
183 | mal_export InstrPtr pushArgumentId(MalBlkPtr mb, InstrPtr p, const char *name); |
184 | mal_export void delArgument(InstrPtr p, int varid); |
185 | mal_export void setArgType(MalBlkPtr mb, InstrPtr p, int i, int tpe); |
186 | mal_export void setReturnArgument(InstrPtr p, int varid); |
187 | mal_export malType destinationType(MalBlkPtr mb, InstrPtr p); |
188 | mal_export void setPolymorphic(InstrPtr p, int tpe, int force); |
189 | /* Utility macros to inspect an instruction */ |
190 | #define functionStart(X) ((X)->token == FUNCTIONsymbol || \ |
191 | (X)->token == COMMANDsymbol || \ |
192 | (X)->token == FACTORYsymbol ) |
193 | #define patternStart(X) ((X)->token == PATTERNsymbol) |
194 | #define functionExit(X) ((X)->token == ENDsymbol) |
195 | |
196 | #define blockStart(X) ((X)->barrier && (((X)->barrier == BARRIERsymbol || \ |
197 | (X)->barrier == CATCHsymbol ))) |
198 | #define blockExit(X) ((X)->barrier == EXITsymbol) |
199 | #define blockReturn(X) ((X)->barrier == RETURNsymbol) |
200 | #define blockCntrl(X) ( (X)->barrier== LEAVEsymbol || \ |
201 | (X)->barrier== REDOsymbol || (X)->barrier== RETURNsymbol ) |
202 | #define isLinearFlow(X) (!(blockStart(X) || blockExit(X) || \ |
203 | (X)->barrier== LEAVEsymbol || (X)->barrier== REDOsymbol )) |
204 | |
205 | mal_export void strBeforeCall(ValPtr v, ValPtr bak); |
206 | mal_export void strAfterCall(ValPtr v, ValPtr bak); |
207 | mal_export void batBeforeCall(ValPtr v, ValPtr bak); |
208 | mal_export void batAfterCall(ValPtr v, ValPtr bak); |
209 | #endif /* _MAL_INSTR_H */ |
210 | |