source: dev/trunk/abdev/BasicCompiler64/Opcode.h@ 308

Last change on this file since 308 was 308, checked in by dai_9181, 17 years ago

静的リンクライブラリにより、複数のグローバル領域が存在することになったのでそれぞれを関数ベースに分けた

File size: 10.4 KB
Line 
1#pragma once
2
3#include <Type.h>
4#include <Procedure.h>
5#include "MachineFixed.h"
6
7
8//変数の種類
9#define NON_VAR 0
10#define VAR_GLOBAL 1 // Global Variable
11#define VAR_REFGLOBAL 2 // Global Refference Variable
12#define VAR_LOCAL 3 // Local Variable
13#define VAR_REFLOCAL 4 // Local Refference Variable
14#define VAR_DIRECTMEM 5 // Direct memory
15
16
17extern int cp;
18
19#define breakpoint compiler.codeGenerator.PutOld( (char)0xCC );
20
21
22//プロシージャの種類
23#define PROC_DEFAULT 1 //ユーザー定義関数
24#define PROC_DLL 2 //DLL関数
25#define PROC_BUILTIN 3 //コンパイラ埋め込み型
26#define PROC_PTR 4 //関数ポインタ
27
28//プロシージャ
29struct PROCEDURE{
30 char name[255];
31 int address;
32 int types[MAX_PARMS];
33 _int8 ByVal[MAX_PARMS];
34 BOOL ReturnType;
35};
36
37//With情報
38struct WITHINFO{
39 char **ppName;
40 int *pWithCp;
41 int num;
42};
43
44
45extern StackFrame *pobj_sf;
46
47
48class CBlockReg{
49 int array_BlockReg[256];
50 int num;
51
52public:
53 CBlockReg();
54 void lock(int reg);
55 void unlock(int reg);
56 BOOL check(int reg);
57 void clear(void);
58
59 //レジスタのバックアップと復旧
60 void backup();
61 void restore();
62};
63extern CBlockReg *pobj_BlockReg;
64class CRegister{
65 ////////////////////
66 // レジスタ管理
67 ////////////////////
68
69 //利用可能なレジスタを列挙する関数
70 void EnumRegister(int *pRegList,int nMaxList,int *array_reg,int *sp,int AnswerReg);
71
72 int array_UseReg[16],sp_UseReg;
73
74 int array_XmmReg[16];
75 int sp_XmmReg;
76
77 int init_sp_reg,init_sp_xmm_reg;
78
79public:
80 CRegister(){};
81 CRegister(int AnswerReg);
82 ~CRegister(){};
83
84 //コンパイラにバグがないかをチェックする機構
85 void bug_check();
86
87 //汎用レジスタ
88 int GetNextReg();
89 int GetLockingReg();
90 int LockReg();
91 int UnlockReg();
92
93 //XMMレジスタ
94 int GetNextXmmReg();
95 int GetLockingXmmReg();
96 int LockXmmReg();
97 int UnlockXmmReg();
98
99 //レジスタが利用中かどうかを調べる
100 bool IsUsing( int reg );
101
102 //レジスタのバックアップと復旧
103 void backup();
104 void restore();
105};
106extern CRegister *pobj_reg;
107
108
109#define BACKUP_REGISTER_RESOURCE \
110 /* レジスタをスタックフレームにバックアップ */ \
111 pobj_BlockReg->backup(); \
112 if(pobj_reg) pobj_reg->backup(); \
113 \
114 /* レジスタブロッキングオブジェクトを退避して再生成 */ \
115 CBlockReg *pobj_BlockReg_back; \
116 pobj_BlockReg_back=pobj_BlockReg; \
117 pobj_BlockReg=new CBlockReg; \
118 \
119 /* レジスタ管理オブジェクトポインタを退避して0をセット */ \
120 CRegister *pobj_reg_back; \
121 pobj_reg_back=pobj_reg; \
122 pobj_reg=0;
123
124#define RESTORE_REGISTER_RESOURCE \
125 /* レジスタブロッキングオブジェクトポインタを復元 */ \
126 delete pobj_BlockReg; \
127 pobj_BlockReg=pobj_BlockReg_back; \
128 \
129 /* レジスタ管理オブジェクトポインタを復元 */ \
130 delete pobj_reg; \
131 pobj_reg=pobj_reg_back; \
132 \
133 /* レジスタをスタックフレームから復元 */ \
134 if(pobj_reg) pobj_reg->restore(); \
135 pobj_BlockReg->restore();
136
137
138
139//RSrcSection.cpp
140char *GetRSrcSectionBuffer(int *pLen);
141
142//Compile.cpp
143void ChangeOpcode(char *Command);
144void GetGlobalDataForDll(void);
145DWORD CompileBuffer(char Return_Sequence,WORD Return_Command);
146
147//Register.cpp
148BOOL IsGeneralReg(int reg);
149BOOL IsXmmReg(int reg);
150BOOL IsVolatileReg(int reg);
151void IfR14Push( int reg );
152
153//Compile_Calc.cpp
154void SetVariableFromRax( const Type &varType, int CalcType,RELATIVE_VAR *pRelativeVar);
155void OpcodeCalc(const char *Command);
156
157//NumOpe.cpp
158bool TermOpe(
159 const char *term,
160 const Type &baseType,
161 Type &resultType,
162 bool &isLiteral,
163 BOOL *pbUseHeap,
164 bool isWantObject = false,
165 bool *pIsClassName = NULL,
166 bool isProcedureCallOnly = false );
167bool NumOpe( int *pReg,
168 const char *Command,
169 const Type &baseType,
170 Type &resultType,
171 BOOL *pbUseHeap = NULL );
172
173//NumOpe_Arithmetic.cpp
174BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
175BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer);
176BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType);
177BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer);
178BOOL Calc_MinusMark(int *type,int sp);
179BOOL Calc_Power(int *type,int *pStackPointer);
180BOOL Calc_Shift(int idCalc,int *type,int *pStackPointer);
181
182//NumOpe_Logical.cpp
183BOOL CalcTwoTerm_Logical(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
184BOOL Calc_Not(int *type,int sp);
185
186//NumOpe_Relation.cpp
187BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
188
189//NumOpe_TypeOperation.cpp
190void ExtendTypeTo64( const Type &oldType, int reg );
191void ExtendTypeTo32( const Type &oldType, int reg );
192void ExtendTypeTo16( const Type &oldType, int reg );
193void ChangeTypeToXmm_Double(int type,int xmm_reg,int general_reg);
194void ChangeTypeToXmm_Single(int type,int xmm_reg,int general_reg);
195void ChangeTypeToWhole( const Type &oldType, const Type &newType, int reg, int xmm_reg );
196void SetOneTermToReg_RealCalc(int TermType,int *pXmmReg);
197void SetOneTermToReg_Whole64Calc(int TermType,int *pReg);
198void SetOneTermToReg_Whole32Calc(int TermType,int *pReg);
199void SetTowTermToReg_RealCalc(int AnswerType,int *type,int sp,int *pXmmReg1,int *pXmmReg2);
200void SetTowTermToReg_Whole64Calc(int *type,int sp,int *pReg1,int *pReg2);
201void SetTowTermToReg_Whole32Calc(int *type,int sp,int *pReg1,int *pReg2);
202BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer);
203
204//Compile_Set_Var.cpp
205BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar);
206void SetStructVariableFromRax( const Type &varType, const Type &calcType, RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
207void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar);
208void SetBooleanVariable(int type,RELATIVE_VAR *pRelative);
209void SetWholeVariable(int varSize,int type,RELATIVE_VAR *pRelative);
210
211//increment.cpp
212void IncDec(int idCalc, const char *lpszLeft, const char *lpszRight);
213
214//Compile_Calc_PushVar.cpp
215void SetXmmReg_DoubleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
216void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
217void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg);
218
219//Compile_Interface.cpp
220bool CastToInterface( int reg, int vtblReg, const CClass &baseClass, const CClass &interfaceClass );
221
222//Compile_Object.cpp
223void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter,const Type &baseTypeInfo );
224void OpcodeDelete(const char *Parameter, bool isSweeping);
225
226//Compile_Var.cpp
227bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess);
228void SetThisPtrToReg(int reg);
229bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts = NULL );
230bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *InitBuf);
231#define DIMFLAG_INITDEBUGVAR 0x01
232#define DIMFLAG_NONCALL_CONSTRACTOR 0x02
233#define DIMFLAG_STATIC 0x04
234#define DIMFLAG_CONST 0x08
235void dim( char *VarName, const Subscripts &subscripts, const Type &type, const char *InitBuf,const char *ConstractParameter,DWORD dwFlags);
236void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
237bool Compile_AddGlobalRootsForGc();
238
239//ParamImpl.cpp
240class ParamImpl{
241 char *Parms[255];
242 vector<Type> types;
243 int ParmsNum;
244
245 Type returnType;
246
247 //一時オブジェクト管理用
248 bool useTempObject;
249 bool useTempParameters[255];
250 int StackOffsetOfTempObject[255];
251
252public:
253 ParamImpl(const char *buffer);
254 ParamImpl(const Parameters &params);
255 ~ParamImpl();
256 void SetReturnType( const Type &returnType );
257
258private:
259 bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType );
260
261public:
262 const UserProc *_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
263 const UserProc *OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
264
265 void ApplyDefaultParameters( const Parameters &params );
266 bool ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum = -1 );
267 void MacroParameterSupport( const Parameters &params );
268 void SetStructParameter( int reg, const Type &baseType, const char *expression );
269 void SetParameter( const string &procName, const Parameters &params, int SecondParmNum = -1 );
270
271 //一時オブジェクトパラメータの生成と破棄
272 int NewTempParameters( const string &procName, const Parameters &params, int SecondParmNum = -1 );
273 void DeleteTempParameters();
274
275 void BackupParameter(int pi_num);
276 void RestoreParameter(int pi_num);
277};
278
279//CLockParameter.cpp
280#define MAX_LOCKPARMS 255
281class CDBLockParms{
282public:
283 int array_LevelCount[MAX_LOCKPARMS];
284 CDBLockParms();
285 ~CDBLockParms();
286
287 void lock(int level);
288 void unlock(int level);
289};
290
291//Compile_CallProc.cpp
292#define PROCFLAG_NEW 1
293bool Opcode_CallProcPtr(const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
294bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName);
295bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc);
296
297//Compile_ProcOp.cpp
298void CompileLocal();
299
300//Compile_Func.cpp
301int GetFunctionFromName(char *FuncName);
302bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo, bool isCallOn = true );
303
304//OperatorProc.cpp
305void FreeTempObject(int reg,const CClass *pobj_c);
306int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
307void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType);
308void CallIndexerGetterProc(int reg,const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType);
309
310//Compile_Statement.cpp
311void OpcodeOthers(const char *Command);
312void OpcodeIf(char *Parameter);
313void OpcodeGoto(char *Parameter);
314void OpcodeWhile(char *Parameter);
315void OpcodeFor(char *Parameter);
316void OpcodeDo(char *Parameter);
317void OpcodeContinue(void);
318void OpcodeExitSub(void);
319void OpcodeSelect( const char *Parameter );
320void OpcodeCase(char *Parameter);
321void OpcodeGosub(char *Parameter);
322void OpcodeReturn(char *Parameter);
323void OpcodeSetPtrData(char *Parameter,int type);
324
325
326//InsertOpcode.cpp
327void InsertDimStatement_ToProcHead(char *lpszCommand);
328
329
330BOOL IsSafeReg(int reg);
Note: See TracBrowser for help on using the repository browser.