From d0b9848c54e6f85ab713f059dcd1ddef7e57caa6 Mon Sep 17 00:00:00 2001 From: Ash Wolf Date: Tue, 25 Oct 2022 20:30:28 +0100 Subject: a bunch of compiler stuff --- includes/compiler/CError.h | 364 ++++++++++++++++++++++++++++++++++++++ includes/compiler/CInt64.h | 88 +++++++++ includes/compiler/CompilerTools.h | 129 ++++++++++++++ includes/compiler/common.h | 283 +++++++++++++++++++++++++++++ includes/compiler/enode.h | 264 +++++++++++++++++++++++++++ includes/compiler/objc.h | 80 +++++++++ includes/compiler/objects.h | 200 +++++++++++++++++++++ includes/compiler/scopes.h | 53 ++++++ includes/compiler/som.h | 35 ++++ includes/compiler/templates.h | 237 +++++++++++++++++++++++++ includes/compiler/tokens.h | 182 +++++++++++++++++++ includes/compiler/types.h | 324 +++++++++++++++++++++++++++++++++ 12 files changed, 2239 insertions(+) create mode 100644 includes/compiler/CError.h create mode 100644 includes/compiler/CInt64.h create mode 100644 includes/compiler/CompilerTools.h create mode 100644 includes/compiler/common.h create mode 100644 includes/compiler/enode.h create mode 100644 includes/compiler/objc.h create mode 100644 includes/compiler/objects.h create mode 100644 includes/compiler/scopes.h create mode 100644 includes/compiler/som.h create mode 100644 includes/compiler/templates.h create mode 100644 includes/compiler/tokens.h create mode 100644 includes/compiler/types.h (limited to 'includes/compiler') diff --git a/includes/compiler/CError.h b/includes/compiler/CError.h new file mode 100644 index 0000000..89f67e4 --- /dev/null +++ b/includes/compiler/CError.h @@ -0,0 +1,364 @@ +#ifndef COMPILER_CERROR_H +#define COMPILER_CERROR_H + +#include "compiler/common.h" + +#define CError_ASSERT(cond) if (!(cond)) { CError_Internal(__FILE__, __LINE__); } +#define CError_FAIL(cond) if (cond) { CError_Internal(__FILE__, __LINE__); } +#define CError_FATAL() do { CError_Internal(__FILE__, __LINE__); } while (0) + +enum { + CErrorStr100 = 100, + CErrorStr101 = 101, + CErrorStr102 = 102, + CErrorStr103 = 103, + CErrorStr104 = 104, + CErrorStr105 = 105, + CErrorStr106 = 106, + CErrorStr107 = 107, + CErrorStr108 = 108, + CErrorStr109 = 109, + CErrorStr110 = 110, + CErrorStr111 = 111, + CErrorStr112 = 112, + CErrorStr113 = 113, + CErrorStr114 = 114, + CErrorStr115 = 115, + CErrorStr116 = 116, + CErrorStr117 = 117, + CErrorStr118 = 118, + CErrorStr119 = 119, + CErrorStr120 = 120, + CErrorStr121 = 121, + CErrorStr122 = 122, + CErrorStr123 = 123, + CErrorStr124 = 124, + CErrorStr125 = 125, + CErrorStr126 = 126, + CErrorStr127 = 127, + CErrorStr128 = 128, + CErrorStr129 = 129, + CErrorStr130 = 130, + CErrorStr131 = 131, + CErrorStr132 = 132, + CErrorStr133 = 133, + CErrorStr134 = 134, + CErrorStr135 = 135, + CErrorStr136 = 136, + CErrorStr137 = 137, + CErrorStr138 = 138, + CErrorStr139 = 139, + CErrorStr140 = 140, + CErrorStr141 = 141, + CErrorStr142 = 142, + CErrorStr143 = 143, + CErrorStr144 = 144, + CErrorStr145 = 145, + CErrorStr146 = 146, + CErrorStr147 = 147, + CErrorStr148 = 148, + CErrorStr149 = 149, + CErrorStr150 = 150, + CErrorStr151 = 151, + CErrorStr152 = 152, + CErrorStr153 = 153, + CErrorStr154 = 154, + CErrorStr155 = 155, + CErrorStr156 = 156, + CErrorStr157 = 157, + CErrorStr158 = 158, + CErrorStr159 = 159, + CErrorStr160 = 160, + CErrorStr161 = 161, + CErrorStr162 = 162, + CErrorStr163 = 163, + CErrorStr164 = 164, + CErrorStr165 = 165, + CErrorStr166 = 166, + CErrorStr167 = 167, + CErrorStr168 = 168, + CErrorStr169 = 169, + CErrorStr170 = 170, + CErrorStr171 = 171, + CErrorStr172 = 172, + CErrorStr173 = 173, + CErrorStr174 = 174, + CErrorStr175 = 175, + CErrorStr176 = 176, + CErrorStr177 = 177, + CErrorStr178 = 178, + CErrorStr179 = 179, + CErrorStr180 = 180, + CErrorStr181 = 181, + CErrorStr182 = 182, + CErrorStr183 = 183, + CErrorStr184 = 184, + CErrorStr185 = 185, + CErrorStr186 = 186, + CErrorStr187 = 187, + CErrorStr188 = 188, + CErrorStr189 = 189, + CErrorStr190 = 190, + CErrorStr191 = 191, + CErrorStr192 = 192, + CErrorStr193 = 193, + CErrorStr194 = 194, + CErrorStr195 = 195, + CErrorStr196 = 196, + CErrorStr197 = 197, + CErrorStr198 = 198, + CErrorStr199 = 199, + CErrorStr200 = 200, + CErrorStr201 = 201, + CErrorStr202 = 202, + CErrorStr203 = 203, + CErrorStr204 = 204, + CErrorStr205 = 205, + CErrorStr206 = 206, + CErrorStr207 = 207, + CErrorStr208 = 208, + CErrorStr209 = 209, + CErrorStr210 = 210, + CErrorStr211 = 211, + CErrorStr212 = 212, + CErrorStr213 = 213, + CErrorStr214 = 214, + CErrorStr215 = 215, + CErrorStr216 = 216, + CErrorStr217 = 217, + CErrorStr218 = 218, + CErrorStr219 = 219, + CErrorStr220 = 220, + CErrorStr221 = 221, + CErrorStr222 = 222, + CErrorStr223 = 223, + CErrorStr224 = 224, + CErrorStr225 = 225, + CErrorStr226 = 226, + CErrorStr227 = 227, + CErrorStr228 = 228, + CErrorStr229 = 229, + CErrorStr230 = 230, + CErrorStr231 = 231, + CErrorStr232 = 232, + CErrorStr233 = 233, + CErrorStr234 = 234, + CErrorStr235 = 235, + CErrorStr236 = 236, + CErrorStr237 = 237, + CErrorStr238 = 238, + CErrorStr239 = 239, + CErrorStr240 = 240, + CErrorStr241 = 241, + CErrorStr242 = 242, + CErrorStr243 = 243, + CErrorStr244 = 244, + CErrorStr245 = 245, + CErrorStr246 = 246, + CErrorStr247 = 247, + CErrorStr248 = 248, + CErrorStr249 = 249, + CErrorStr250 = 250, + CErrorStr251 = 251, + CErrorStr252 = 252, + CErrorStr253 = 253, + CErrorStr254 = 254, + CErrorStr255 = 255, + CErrorStr256 = 256, + CErrorStr257 = 257, + CErrorStr258 = 258, + CErrorStr259 = 259, + CErrorStr260 = 260, + CErrorStr261 = 261, + CErrorStr262 = 262, + CErrorStr263 = 263, + CErrorStr264 = 264, + CErrorStr265 = 265, + CErrorStr266 = 266, + CErrorStr267 = 267, + CErrorStr268 = 268, + CErrorStr269 = 269, + CErrorStr270 = 270, + CErrorStr271 = 271, + CErrorStr272 = 272, + CErrorStr273 = 273, + CErrorStr274 = 274, + CErrorStr275 = 275, + CErrorStr276 = 276, + CErrorStr277 = 277, + CErrorStr278 = 278, + CErrorStr279 = 279, + CErrorStr280 = 280, + CErrorStr281 = 281, + CErrorStr282 = 282, + CErrorStr283 = 283, + CErrorStr284 = 284, + CErrorStr285 = 285, + CErrorStr286 = 286, + CErrorStr287 = 287, + CErrorStr288 = 288, + CErrorStr289 = 289, + CErrorStr290 = 290, + CErrorStr291 = 291, + CErrorStr292 = 292, + CErrorStr293 = 293, + CErrorStr294 = 294, + CErrorStr295 = 295, + CErrorStr296 = 296, + CErrorStr297 = 297, + CErrorStr298 = 298, + CErrorStr299 = 299, + CErrorStr300 = 300, + CErrorStr301 = 301, + CErrorStr302 = 302, + CErrorStr303 = 303, + CErrorStr304 = 304, + CErrorStr305 = 305, + CErrorStr306 = 306, + CErrorStr307 = 307, + CErrorStr308 = 308, + CErrorStr309 = 309, + CErrorStr310 = 310, + CErrorStr311 = 311, + CErrorStr312 = 312, + CErrorStr313 = 313, + CErrorStr314 = 314, + CErrorStr315 = 315, + CErrorStr316 = 316, + CErrorStr317 = 317, + CErrorStr318 = 318, + CErrorStr319 = 319, + CErrorStr320 = 320, + CErrorStr321 = 321, + CErrorStr322 = 322, + CErrorStr323 = 323, + CErrorStr324 = 324, + CErrorStr325 = 325, + CErrorStr326 = 326, + CErrorStr327 = 327, + CErrorStr328 = 328, + CErrorStr329 = 329, + CErrorStr330 = 330, + CErrorStr331 = 331, + CErrorStr332 = 332, + CErrorStr333 = 333, + CErrorStr334 = 334, + CErrorStr335 = 335, + CErrorStr336 = 336, + CErrorStr337 = 337, + CErrorStr338 = 338, + CErrorStr339 = 339, + CErrorStr340 = 340, + CErrorStr341 = 341, + CErrorStr342 = 342, + CErrorStr343 = 343, + CErrorStr344 = 344, + CErrorStr345 = 345, + CErrorStr346 = 346, + CErrorStr347 = 347, + CErrorStr348 = 348, + CErrorStr349 = 349, + CErrorStr350 = 350, + CErrorStr351 = 351, + CErrorStr352 = 352, + CErrorStr353 = 353, + CErrorStr354 = 354, + CErrorStr355 = 355, + CErrorStr356 = 356, + CErrorStr357 = 357, + CErrorStr358 = 358, + CErrorStr359 = 359, + CErrorStr360 = 360, + CErrorStr361 = 361, + CErrorStr362 = 362, + CErrorStr363 = 363, + CErrorStr364 = 364, + CErrorStr365 = 365, + CErrorStr366 = 366, + CErrorStr367 = 367, + CErrorStr368 = 368, + CErrorStr369 = 369, + CErrorStr370 = 370, + CErrorStr371 = 371, + CErrorStr372 = 372, + CErrorStr373 = 373, + CErrorStr374 = 374, + CErrorStr375 = 375, + CErrorStr376 = 376, + CErrorStr377 = 377, + CErrorStr378 = 378, + CErrorStr379 = 379, + CErrorStr380 = 380, + CErrorStr381 = 381, + CErrorStr382 = 382, + CErrorStr383 = 383, + CErrorStr384 = 384, + CErrorStr385 = 385, + CErrorStr386 = 386, + CErrorStr387 = 387, + CErrorStr388 = 388, + CErrorStr389 = 389, + CErrorStr390 = 390, + CErrorStr391 = 391, + CErrorStr392 = 392, + CErrorStrMAX = 393 +}; + +typedef struct _CErrorBuffer { + char *start; + char *end; + UInt32 size; + UInt32 remaining; +} CErrorBuffer; + +extern void CError_Init(); +extern void CError_SetErrorToken(TStreamElement *token); +extern void CError_SetNullErrorToken(); +extern void CError_LockErrorPos(TStreamElement *token, TStreamElement **saved); +extern void CError_UnlockErrorPos(TStreamElement **saved); +extern void CError_ResetErrorSkip(); +extern void CError_GetErrorString(char *buf, short code); +extern void CError_BufferInit(CErrorBuffer *eb, char *buf, SInt32 bufSize); +extern void CError_BufferGrow(CErrorBuffer *eb, SInt32 amount); +extern void CError_BufferAppendChar(CErrorBuffer *eb, char ch); +extern void CError_BufferAppendString(CErrorBuffer *eb, const char *str); +extern void CError_BufferTerminate(CErrorBuffer *eb); +extern void CError_BufferAppendQualifier(CErrorBuffer *eb, UInt32 qual); +extern void CError_BufferAppendTemplArgExpr(CErrorBuffer *eb, ENode *node); +extern void CError_BufferAppendTemplArg(CErrorBuffer *eb, TemplArg *targ); +extern void CError_BufferAppendTemplArgs(CErrorBuffer *eb, TemplArg *targs); +extern void CError_BufferAppendNameSpace(CErrorBuffer *eb, NameSpace *nspace); +extern void CError_BufferAppendPType(CErrorBuffer *eb, Type *ty); +extern void CError_BufferAppendTemplDepType(CErrorBuffer *eb, TypeTemplDep *type); +extern void CError_BufferAppendFuncArgs(CErrorBuffer *eb, TypeFunc *tfunc, Boolean isMethod); +extern void CError_BufferAppendType(CErrorBuffer *eb, Type *ty, UInt32 qual); +extern char *CError_GetTypeName(Type *ty, UInt32 qual, Boolean useGlobalHeap); +extern void CError_AppendUnqualFunctionName(CErrorBuffer *eb, NameSpace *nspace, HashNameNode *name, TypeFunc *tfunc); +extern void CError_AppendFunctionName(CErrorBuffer *eb, NameSpace *nspace, HashNameNode *name, TemplArg *templargs, TypeFunc *tfunc); +extern void CError_AppendObjectName(CErrorBuffer *eb, Object *obj); +extern void CError_AppendMethodName(CErrorBuffer *eb, ObjCMethod *meth); +extern char *CError_GetQualifiedName(NameSpace *nspace, HashNameNode *name); +extern char *CError_GetFunctionName(NameSpace *nspace, HashNameNode *name, TypeFunc *tfunc); +extern char *CError_GetObjectName(Object *obj); +extern char *CError_GetNameString(NameSpace *nspace, HashNameNode *operatorName); +extern void CError_ErrorMessage(int errTable, char *buf, Boolean flag1, Boolean flag2); +extern void CError_BufferAppendTemplateStack(CErrorBuffer *eb); +extern void CError_ErrorMessageVA(int code, const char *format, va_list list, Boolean flag1, Boolean flag2); +extern void CError_VAErrorMessage(int code, va_list list, Boolean flag1, Boolean flag2); +extern void CError_Error(int code, ...); +extern void CError_ErrorTerm(short code); +extern void CError_ErrorSkip(int code, ...); +extern void CError_ErrorFuncCall(short code, NameSpaceObjectList *args, ENodeList *argNodes); +extern void CError_OverloadedFunctionError2(Object *obj, ObjectList *olst, ENodeList *argNodes); +extern void CError_OverloadedFunctionError(Object *obj, ObjectList *olst); +extern void CError_AbstractClassError(TypeClass *tclass); +extern void CError_Warning(int code, ...); +extern void CError_BreakPoint(const char *a, const char *b); +extern void CError_Internal(); +extern void CError_ExpressionTooComplex(); +extern void CError_NoMem(); +extern void CError_UserBreak(); +extern void CError_CannotOpen(); +extern void CError_QualifierCheck(UInt32 qual); + +#endif diff --git a/includes/compiler/CInt64.h b/includes/compiler/CInt64.h new file mode 100644 index 0000000..455bf3f --- /dev/null +++ b/includes/compiler/CInt64.h @@ -0,0 +1,88 @@ +#ifndef COMPILER_CINT64_H +#define COMPILER_CINT64_H + +#include "compiler/common.h" + +// make sure this is in the right place +extern const CInt64 cint64_negone; +extern const CInt64 cint64_zero; +extern const CInt64 cint64_one; +extern const CInt64 cint64_max; +extern const CInt64 cint64_min; + +inline int CInt64_IsNegative(const CInt64 *n) { + return (n->hi & 0x80000000) != 0; +} +inline void CInt64_SetLong(CInt64 *pN, SInt32 n) { + pN->lo = n; + pN->hi = (n < 0) ? 0xFFFFFFFF : 0; +} +inline void CInt64_SetULong(CInt64 *pN, UInt32 n) { + pN->lo = n; + pN->hi = 0; +} + +inline int CInt64_IsZero(CInt64 *n) { + //if (n->hi == 0 && n->lo == 0) + // return 1; + //else + // return 0; + return n->hi == 0 && n->lo == 0; +} +inline void CInt64_Extend32(CInt64 *n) { // assumed name + n->hi = (n->lo >> 31) ? 0xFFFFFFFF : 0; +} + +extern void CInt64_Init(); +extern CInt64 CInt64_Not(CInt64 input); +extern CInt64 CInt64_Inv(CInt64 input); +extern CInt64 CInt64_Add(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_Neg(CInt64 input); +extern CInt64 CInt64_Sub(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_MulU(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_Mul(CInt64 lhs, CInt64 rhs); +extern void CInt64_DivMod(const CInt64 *lhs, const CInt64 *rhs, CInt64 *pDiv, CInt64 *pMod); +extern CInt64 CInt64_Div(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_DivU(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_Mod(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_ModU(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_Shl(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_Shr(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_ShrU(CInt64 lhs, CInt64 rhs); +extern int CInt64_UnsignedCompare(const CInt64 *lhs, const CInt64 *rhs); +extern int CInt64_SignedCompare(const CInt64 *lhs, const CInt64 *rhs); +extern Boolean CInt64_Less(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_LessU(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_Greater(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_GreaterU(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_LessEqual(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_LessEqualU(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_GreaterEqual(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_GreaterEqualU(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_Equal(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_NotEqual(CInt64 lhs, CInt64 rhs); +extern Boolean CInt64_IsInRange(CInt64 value, short len); +extern Boolean CInt64_IsInURange(CInt64 value, short len); +extern CInt64 CInt64_And(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_Xor(CInt64 lhs, CInt64 rhs); +extern CInt64 CInt64_Or(CInt64 lhs, CInt64 rhs); +extern void CInt64_ConvertInt32(CInt64 *i); +extern void CInt64_ConvertUInt32(CInt64 *i); +extern void CInt64_ConvertInt16(CInt64 *i); +extern void CInt64_ConvertUInt16(CInt64 *i); +extern void CInt64_ConvertInt8(CInt64 *i); +extern void CInt64_ConvertUInt8(CInt64 *i); +extern void CInt64_ConvertUFromLongDouble(CInt64 *pResult, double value); +extern void CInt64_ConvertFromLongDouble(CInt64 *pResult, double value); +extern double CInt64_ConvertUToLongDouble(const CInt64 *value); +extern double CInt64_ConvertToLongDouble(const CInt64 *value); +extern char *CInt64_ScanOctString(CInt64 *pResult, char *str, Boolean *pFail); +extern char *CInt64_ScanDecString(CInt64 *pResult, char *str, Boolean *pFail); +extern char *CInt64_ScanHexString(CInt64 *pResult, char *str, Boolean *pFail); +extern char *CInt64_ScanBinString(CInt64 *pResult, char *str, Boolean *pFail); +extern char *CInt64_ScanAsmNumber(CInt64 *pResult, char *str, Boolean *pFail); +extern int CInt64_PrintDec(char *output, CInt64 value); +extern int CInt64_PrintHex(char *output, CInt64 value); +extern int CInt64_PrintBin(char *output, CInt64 value); + +#endif diff --git a/includes/compiler/CompilerTools.h b/includes/compiler/CompilerTools.h new file mode 100644 index 0000000..50581b0 --- /dev/null +++ b/includes/compiler/CompilerTools.h @@ -0,0 +1,129 @@ +#ifndef COMPILER_COMPILERTOOLS_H +#define COMPILER_COMPILERTOOLS_H + +#include "compiler/common.h" + +extern void CompilerGetPString(short index, unsigned char *string); +extern void CompilerGetCString(short index, char *string); +extern unsigned char *CTool_CtoPstr(char *cstr); + +typedef struct HeapBlock { + struct HeapBlock *next; + Handle blockhandle; + SInt32 blocksize; + SInt32 blockfree; +} HeapBlock; + +typedef struct HeapMem { + HeapBlock *blocks; + /// The minimum size for a new block + SInt32 allocsize; + HeapBlock *curblock; + char *curfreep; + SInt32 curfree; +} HeapMem; + +typedef struct _HeapInfo { + /// The amount of blocks in this heap + SInt32 blocks; + /// The value of allocsize for the heap + SInt32 allocsize; + /// The total amount of bytes across all blocks + SInt32 total_size; + /// The amount of free bytes across all blocks + SInt32 total_free; + /// The average size of a block + SInt32 average_block_size; + /// The average amount of free space in a block + SInt32 average_block_free; + /// The amount of bytes in the largest contiguous section of free space + SInt32 largest_free_block; +} HeapInfo; + +typedef struct GList { + char **data; + SInt32 size; + SInt32 hndlsize; + SInt32 growsize; +} GList; + +extern long hash_name_id; +extern HashNameNode **name_hash_nodes; +extern void (*GListErrorProc)(); + +extern short InitGList(GList *gl, SInt32 size); +extern void FreeGList(GList *gl); +extern void LockGList(GList *gl); +extern void UnlockGList(GList *gl); +extern void ShrinkGList(GList *gl); +extern void AppendGListData(GList *gl, const void *data, SInt32 size); +extern void AppendGListNoData(GList *gl, SInt32 size); +extern void AppendGListByte(GList *gl, SInt8 thebyte); +extern void AppendGListWord(GList *gl, SInt16 theword); +extern void AppendGListTargetEndianWord(GList *gl, SInt16 theword); +extern void AppendGListLong(GList *gl, SInt32 theword); +extern void AppendGListTargetEndianLong(GList *gl, SInt32 theword); +extern void AppendGListID(GList *gl, const char *name); +extern void AppendGListName(GList *gl, const char *name); +extern void RemoveGListData(GList *gl, SInt32 size); +extern SInt16 GetGListByte(GList *gl); +extern SInt16 GetGListWord(GList *gl); +extern SInt32 GetGListLong(GList *gl); +extern short GetGListID(GList *gl, char *name); +extern void GetGListData(GList *gl, char *where, SInt32 size); + +extern SInt16 CHash(const char *string); +extern HashNameNode *GetHashNameNode(const char *name); +extern HashNameNode *GetHashNameNodeHash(const char *name, SInt16 hashval); +extern HashNameNode *GetHashNameNodeHash2(const char *name, SInt16 hashval); +extern HashNameNode *GetHashNameNodeExport(const char *name); +extern SInt32 GetHashNameNodeExportID(HashNameNode *node); +extern HashNameNode *GetHashNameNodeByID(SInt32 id); +extern void NameHashExportReset(); +extern void NameHashWriteNameTable(GList *glist); +extern void NameHashWriteTargetEndianNameTable(GList *glist); +extern void InitNameHash(); + +typedef void (*heaperror_t)(); + +extern SInt32 CTool_TotalHeapSize(); +extern void CTool_GetHeapInfo(HeapInfo *result, unsigned char heapID); +extern short initheaps(heaperror_t heaperrorproc); +extern short initgheap(heaperror_t heaperrorproc); +extern heaperror_t getheaperror(); +extern void setheaperror(heaperror_t heaperrorproc); +extern void releaseheaps(); +extern void releasegheap(); +extern void releaseoheap(); +extern void *galloc(SInt32 s); +extern void *lalloc(SInt32 s); +extern void *aalloc(SInt32 s); +extern void *oalloc(SInt32 s); +extern void *balloc(SInt32 s); + +extern void locklheap(); +extern void unlocklheap(); +extern void freelheap(); +extern void freeaheap(); +extern void freeoheap(); +extern void freebheap(); + +extern char *ScanHex(char *string, UInt32 *result, Boolean *overflow); +extern char *ScanOct(char *string, UInt32 *result, Boolean *overflow); +extern char *ScanDec(char *string, UInt32 *result, Boolean *overflow); + +extern void OldUnmangle(char *name, char *out, Boolean full); + +extern short hash(char *a); +extern void memclr(void *ptr, SInt32 size); +extern void memclrw(void *ptr, SInt32 size); +extern void CToLowercase(char *a, char *b); +extern short getbit(SInt32 l); +extern void CTool_EndianConvertWord64(CInt64 ci, char *result); +extern UInt16 CTool_EndianConvertInPlaceWord16Ptr(UInt16 *x); +extern UInt32 CTool_EndianConvertInPlaceWord32Ptr(UInt32 *x); +extern void CTool_EndianConvertVector128(); // not correct but idc +extern HashNameNode *CTool_GetPathName(const FSSpec *fss, SInt32 *moddateptr); +extern int strcat_safe(char *dest, const char *src, SInt32 len); + +#endif diff --git a/includes/compiler/common.h b/includes/compiler/common.h new file mode 100644 index 0000000..b5909e2 --- /dev/null +++ b/includes/compiler/common.h @@ -0,0 +1,283 @@ +#ifndef COMPILER_COMMON_H +#define COMPILER_COMMON_H + +#include "cw_common.h" + +typedef struct HashNameNode { + struct HashNameNode *next; + SInt32 id; + SInt16 hashval; + char name[1]; +} HashNameNode; + +typedef struct CPrepFileInfo CPrepFileInfo; + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif +// TODO move me into CPrep.h or something? +struct CPrepFileInfo { + FSSpec textfile; + HashNameNode *nameNode; + SInt32 fileModDate; + char *textbuffer; + SInt32 textlength; + SInt32 linenumber; + SInt32 pos; + Boolean hasprepline; + SInt16 fileID; + Boolean recordbrowseinfo; + Boolean unkfield123; + Boolean unkfield124; + Boolean unkfield125; + Boolean unkfield126; +}; +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +typedef struct CInt64 { + SInt32 hi; + UInt32 lo; +} CInt64; + +typedef struct Float { + double value; +} Float; + +typedef union MWVector128 { + UInt8 uc[16]; + UInt16 us[8]; + UInt32 ul[4]; + float f[4]; +} MWVector128; + +typedef enum AccessType { + ACCESSPUBLIC, + ACCESSPRIVATE, + ACCESSPROTECTED, + ACCESSNONE +} AccessType; + +typedef enum Section { + SECT_DEFAULT = 0, + SECT_TEXT = 1, + SECT_DATA = 2, + SECT_UDATA = 3, + SECT_DATA_FAR = 4, + SECT_DATA_NEAR = 5, + SECT_INIT = 6, + SECT_OBJC_CAT_CLS_METH = 7, + SECT_OBJC_CAT_INST_METH = 8, + SECT_OBJC_STRING_OBJECT = 9, + SECT_OBJC_CSTRING_OBJECT = 10, + SECT_OBJC_MESSAGE_REFS = 11, + SECT_OBJC_SEL_FIXUP = 12, + SECT_OBJC_CLS_REFS = 13, + SECT_OBJC_CLASS = 14, + SECT_OBJC_META_CLASS = 15, + SECT_OBJC_CLS_METH = 16, + SECT_OBJC_INST_METH = 17, + SECT_OBJC_PROTOCOL = 18, + SECT_OBJC_CLASS_NAMES = 19, + SECT_OBJC_METH_VAR_TYPES = 20, + SECT_OBJC_METH_VAR_NAMES = 21, + SECT_OBJC_CATEGORY = 22, + SECT_OBJC_CLASS_VARS = 23, + SECT_OBJC_INSTANCE_VARS = 24, + SECT_OBJC_MODULE_INFO = 25, + SECT_OBJC_MSYMBOLS = 26, + SECT_TEXT_CSTRING = 27, + SECT_BACKEND_SPECIFIC = 28, + SECT_MW_EX_TABLE = 28, + SECT_MW_EX_TABLE_INDEX = 29, + SECT_MW_SWITCH = 30, + SECT_8BYTE_LITERALS = 31, + SECT_4BYTE_LITERALS = 32, + SECT_MOD_INIT_FUNC = 33, + SECT_MOD_TERM_FUNC = 34, + SECT_CONST = 35, + SECT_CONST_PTR = 36, + SECT_NONLAZY_PTRS = 37, + SECT_COMMON_VARS = 38, + SECT_16BYTE_LITERALS = 39, + SECT_TEXT_COALESCE = 40, + SECT_DATA_COALESCE = 41, + SECT_UDATA_COALESCE = 42, + SECT_CONST_COALESCE = 43, + SECT_CONST_PTR_COALESCE = 44, + SECT_CSTR_COALESCE = 45, + N_SECTIONS = 46 +} Section; + +typedef struct BClassList BClassList; +typedef struct CI_FuncData CI_FuncData; +typedef struct CLabel CLabel; +typedef struct DefArgCtorInfo DefArgCtorInfo; +typedef struct DepName DepName; +typedef struct ENode ENode; +typedef struct ENodeList ENodeList; +typedef struct ExceptionAction ExceptionAction; +typedef struct ExtendedParam ExtendedParam; +typedef struct FuncArg FuncArg; +typedef struct Initializer Initializer; +typedef struct InlineXRef InlineXRef; +typedef struct MemInitializer MemInitializer; +typedef struct NameSpace NameSpace; +typedef struct NameSpaceName NameSpaceName; +typedef struct NameSpaceList NameSpaceList; +typedef struct NameSpaceLookupList NameSpaceLookupList; +typedef struct NameSpaceObjectList NameSpaceObjectList; +typedef struct ObjBase ObjBase; +typedef struct ObjEnumConst ObjEnumConst; +typedef struct ObjMemberVar ObjMemberVar; +typedef struct ObjMemberVarPath ObjMemberVarPath; +typedef struct ObjNameSpace ObjNameSpace; +typedef struct ObjType ObjType; +typedef struct ObjTypeTag ObjTypeTag; +typedef struct Object Object; +typedef struct ObjectList ObjectList; +typedef struct ObjCInfo ObjCInfo; +typedef struct ObjCMethod ObjCMethod; +typedef struct PCodeLabel PCodeLabel; +typedef struct PointsToFunction PointsToFunction; +typedef struct PTFList PTFList; +typedef struct SOMInfo SOMInfo; +typedef struct Statement Statement; +typedef struct StructMember StructMember; +typedef struct Template Template; +typedef struct TemplateAction TemplateAction; +typedef struct TemplateFriend TemplateFriend; +typedef struct TemplateMember TemplateMember; +typedef struct TemplArg TemplArg; +typedef struct TemplClass TemplClass; +typedef struct TemplClassInst TemplClassInst; +typedef struct TemplateFunction TemplateFunction; +typedef struct TemplFuncInstance TemplFuncInstance; +typedef struct TemplInstance TemplInstance; +typedef struct TemplParam TemplParam; +typedef struct TemplPartialSpec TemplPartialSpec; +typedef struct TemplStack TemplStack; +typedef struct TStream TStream; +typedef struct TStreamElement TStreamElement; +typedef struct Type Type; +typedef struct TypeBitfield TypeBitfield; +typedef struct TypeClass TypeClass; +typedef struct TypeEnum TypeEnum; +typedef struct TypeFunc TypeFunc; +typedef struct TypeIntegral TypeIntegral; +typedef struct TypeMemberPointer TypeMemberPointer; +typedef struct TypeMethod TypeMethod; +typedef struct TypePointer TypePointer; +typedef struct TypeStruct TypeStruct; +typedef struct TypeTemplDep TypeTemplDep; +typedef struct VarInfo VarInfo; +typedef struct VarRecord VarRecord; + +// Common bits for templates +typedef enum TemplParamType { + TPT_TYPE = 0, + TPT_NONTYPE, + TPT_TEMPLATE +} TemplParamType; + +typedef struct TemplParamID { + UInt16 index; + UInt8 nindex; + TemplParamType type; +} TemplParamID; + +typedef enum TemplDepSubType { + TDE_PARAM, + TDE_TYPEEXPR, + TDE_CAST, + TDE_QUALNAME, + TDE_QUALTEMPL, + TDE_OBJACCESS, + TDE_SOURCEREF, + TDE_FUNCCALL, + TDE_LOCAL, + TDE_MONAND, + TDE_MONPLUS, + TDE_MONMUL, + TDE_NEW, + TDE_DELETE, + TDE_ARRAY, + TDE_DYNAMIC_CAST, + TDE_STATIC_CAST, + TDE_REINTERPRET_CAST, + TDE_CONST_CAST, + TDE_TYPEID, + TDE_MEMBERACCESS, + TDE_THROW, + TDE_EXCEPTIONINIT, + TDE_LOCALINIT, + TDE_STATICINIT, + TDE_LOCALDESTROY, + TDE_ILLEGAL +} TemplDepSubType; + +/// Things that can be applied to a type expression +typedef enum TEFuncSel { + TEFS_SIZEOF, + TEFS_ALIGNOF, + TEFS_UUIDOF, + TEFS_BI_ALIGN, + TEFS_BI_TYPE, + TEFS_BI_VTYPE, + TEFS_BI_CTYPE +} TEFuncSel; + +/// How to access an object +/// this might not actually be in Pro7 lol +typedef struct ObjAccess { + NameSpaceObjectList *list; + TypeClass *naming; + TypeClass *member; + TemplArg *targs; + HashNameNode *name; + ENode *expr; + Boolean is_qualified; + Boolean is_member; + Boolean is_ambig : 1; + Boolean is_ptm : 1; + Boolean ext_only : 1; +} ObjAccess; + +/// Qualifiers +enum { + Q_CONST = 1, + Q_VOLATILE = 2, + Q_ASM = 4, + Q_PASCAL = 8, + Q_INLINE = 0x10, + Q_REFERENCE = 0x20, + Q_EXPLICIT = 0x40, + Q_MUTABLE = 0x80, + Q_VIRTUAL = 0x100, + Q_FRIEND = 0x200, + Q_IN = 0x400, + Q_OUT = 0x800, + Q_INOUT = 0x1000, + Q_BYCOPY = 0x2000, + Q_BYREF = 0x4000, + Q_ONEWAY = 0x8000, + Q_RESTRICT = 0x200000, + Q_ALIGNED_1 = 0x2000000, + Q_ALIGNED_2 = 0x4000000, + Q_ALIGNED_4 = 0x6000000, + Q_ALIGNED_8 = 0x8000000, + Q_ALIGNED_16 = 0xA000000, + Q_ALIGNED_32 = 0xC000000, + Q_ALIGNED_64 = 0x10000000, + Q_ALIGNED_128 = 0x12000000, + Q_ALIGNED_256 = 0x14000000, + Q_ALIGNED_512 = 0x16000000, + Q_ALIGNED_1024 = 0x18000000, + Q_ALIGNED_2048 = 0x1A000000, + Q_ALIGNED_4096 = 0x1C000000, + Q_ALIGNED_8192 = 0x1E000000, + Q_ALIGNED_MASK = 0x1E000000 +}; + +#endif diff --git a/includes/compiler/enode.h b/includes/compiler/enode.h new file mode 100644 index 0000000..6e0ab2c --- /dev/null +++ b/includes/compiler/enode.h @@ -0,0 +1,264 @@ +#ifndef COMPILER_ENODE_H +#define COMPILER_ENODE_H + +#include "compiler/common.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +typedef enum ENodeType { + EPOSTINC, + EPOSTDEC, + EPREINC, + EPREDEC, + EINDIRECT, + EMONMIN, + EBINNOT, + ELOGNOT, + EFORCELOAD, + EMUL, + EMULV, + EDIV, + EMODULO, + EADDV, + ESUBV, + EADD, + ESUB, + ESHL, + ESHR, + ELESS, + EGREATER, + ELESSEQU, + EGREATEREQU, + EEQU, + ENOTEQU, + EAND, + EXOR, + EOR, + ELAND, + ELOR, + EASS, + EMULASS, + EDIVASS, + EMODASS, + EADDASS, + ESUBASS, + ESHLASS, + ESHRASS, + EANDASS, + EXORASS, + EORASS, + ECOMMA, + EPMODULO, + EROTL, + EROTR, + EBCLR, + EBTST, + EBSET, + ETYPCON, + EBITFIELD, + EINTCONST, + EFLOATCONST, + ESTRINGCONST, + ECOND, + EFUNCCALL, + EFUNCCALLP, + EOBJREF, + EMFPOINTER, + ENULLCHECK, + EPRECOMP, + ETEMP, + EARGOBJ, + ELOCOBJ, + ELABEL, + ESETCONST, + ENEWEXCEPTION, + ENEWEXCEPTIONARRAY, + EOBJLIST, + EMEMBER, + ETEMPLDEP, + EINSTRUCTION, + EDEFINE, + EREUSE, + EASSBLK, + EVECTOR128CONST, + ECONDASS, + MAXEXPR +} ENodeType; + + +struct ENodeList { + ENodeList *next; + ENode *node; +}; + + +typedef union ENodeUnion { + CInt64 intval; + Float floatval; + SInt32 longval; + ENode *monadic; + Object *objref; + CLabel *label; + MWVector128 vector128val; + struct { + ENode *left; + ENode *right; + } diadic; + struct { + ENode *cond; + ENode *expr1; + ENode *expr2; + } cond; + struct { + ENode *funcref; + ENodeList *args; + TypeFunc *functype; + } funccall; + ObjAccess objaccess; + struct { + ENode *accessnode; + ENode *mfpointer; + } mfpointer; + struct { + ENode *nullcheckexpr; + ENode *condexpr; + SInt32 precompid; + } nullcheck; + SInt32 precompid; + struct { + Type *type; + SInt32 uniqueid; + Boolean needs_dtor; + } temp; + struct { + SInt32 size; + char *data; + SInt32 segnum; + char ispascal; + char ispacked; + } string; + struct { + SInt32 size; + char *data; + } set; + struct { + ENode *initexpr; + ENode *tryexpr; + Object *pointertemp; + Object *deletefunc; + } newexception; + struct { + ENode *initexpr; + ENode *tryexpr; + ENode *catchexpr; + ENode *result; + } itc; + struct { + Object *objref; + SInt32 offset; + } addr; + void *inst; + MemInitializer *ctorinit; + Statement *stmt; + struct { + union { + TemplParamID pid; + struct { + union { + Type *type; + ENode *expr; + } u; + TEFuncSel sel; + Boolean is_expr; + } typeexpr; + struct { + ENodeList *args; + Type *type; + UInt32 qual; + } cast; + struct { + TypeTemplDep *type; + HashNameNode *name; + } qual; + struct { + TypeTemplDep *type; + HashNameNode *name; + TemplArg *args; + } qualtempl; + ObjAccess objaccess; + struct { + ENode *expr; + TStreamElement *token; + } sourceref; + ENode *monadic; + struct { + ENode *expr; + ENodeList *args; + } funccall; + struct { + Type *type; + UInt32 qual; + ENode *arraydim; + ENodeList *placement; + ENodeList *initlist; + Boolean is_global; + Boolean has_init; + } nw; + struct { + ENode *expr; + Boolean is_global; + Boolean is_array; + } del; + struct { + ENode *left; + ENode *right; + } dyadic; + struct { + ENode *expr; + Type *type; + UInt32 qual; + } newcast; + struct { + ENode *expr; + DepName *dname; + Boolean is_pointer; + } member; + struct { + Object *object; + Object *info; + } exinit; + struct { + Object *obj; + Initializer *init; + } varinit; + Object *obj; + } u; + TemplDepSubType subtype; + } templdep; +} ENodeUnion; + +struct ENode { + ENodeType type; + UInt8 cost; + UInt16 flags; // &1, &2 correspond to quals + Boolean ignored; + Boolean hascall; + // void *loc; - might not be in pro7? + Type *rtype; + PointsToFunction *pointsTo; + ENodeUnion data; +}; + +enum { + ENODE_FLAG_CONST = Q_CONST, + ENODE_FLAG_VOLATILE = Q_VOLATILE, + ENODE_FLAG_QUALS = Q_CONST | Q_VOLATILE +}; + +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +#endif diff --git a/includes/compiler/objc.h b/includes/compiler/objc.h new file mode 100644 index 0000000..ce3ebe4 --- /dev/null +++ b/includes/compiler/objc.h @@ -0,0 +1,80 @@ +#ifndef COMPILER_OBJC_H +#define COMPILER_OBJC_H + +#include "compiler/common.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +typedef struct ObjCMethodArg { // bigger in v7 (0x20 vs 0x14) + struct ObjCMethodArg *next; + HashNameNode *selector; + HashNameNode *name; + Type *type; + UInt32 qual; + UInt32 unk14; + UInt32 unk18; + UInt32 unk1C; +} ObjCMethodArg; + +typedef struct ObjCMethodList { // verified via CPrec + struct ObjCMethodList *next; + struct ObjCMethod *method; +} ObjCMethodList; + +typedef struct ObjCSelector { // verified via CPrec + struct ObjCSelector *next; + Object *selobject; + HashNameNode *name; + struct ObjCMethodList *methods; +} ObjCSelector; + +typedef struct ObjCMethod { // verified via CPrec + struct ObjCMethod *next; + Object *object; + TypeFunc *functype; + ObjCSelector *selector; + Type *return_type; + UInt32 return_qual; + ObjCMethodArg *selector_args; + Boolean has_valist; + Boolean is_class_method; + Boolean is_defined; +} ObjCMethod; + +typedef struct ObjCProtocol { // verified via CPrec + struct ObjCProtocol *next; + HashNameNode *name; + struct ObjCProtocolList *protocols; + ObjCMethod *methods; + Object *object; +} ObjCProtocol; + +typedef struct ObjCProtocolList { // verified via CPrec + struct ObjCProtocolList *next; + ObjCProtocol *protocol; +} ObjCProtocolList; + +typedef struct ObjCCategory { // verified via CPrec + struct ObjCCategory *next; + HashNameNode *name; + ObjCProtocolList *protocols; + ObjCMethod *methods; +} ObjCCategory; + +struct ObjCInfo { // verified via CPrec + Object *classobject; + Object *metaobject; + Object *classrefobj; + ObjCMethod *methods; + ObjCProtocolList *protocols; + ObjCCategory *categories; + Boolean is_implemented; +}; + +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +#endif diff --git a/includes/compiler/objects.h b/includes/compiler/objects.h new file mode 100644 index 0000000..32552ec --- /dev/null +++ b/includes/compiler/objects.h @@ -0,0 +1,200 @@ +#ifndef COMPILER_OBJECTS_H +#define COMPILER_OBJECTS_H + +#include "compiler/common.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +typedef enum ObjectType { + OT_ENUMCONST, + OT_TYPE, + OT_TYPETAG, + OT_NAMESPACE, + OT_MEMBERVAR, + OT_OBJECT, + OT_ILLEGAL +} ObjectType; + + +struct ObjectList { + ObjectList *next; + Object *object; +}; + + +/// General structure with all shared fields for all kinds of objects +struct ObjBase { + ObjectType otype; + AccessType access; +}; + + +/// Type 0 (OT_ENUMCONST) +struct ObjEnumConst { + ObjectType otype; + AccessType access; + ObjEnumConst *next; + HashNameNode *name; + Type *type; + CInt64 val; +}; + + +/// Type 1 (OT_TYPE) +struct ObjType { + ObjectType otype; + AccessType access; + Type *type; + void *unk6; +}; + + +/// Type 2 (OT_TYPETAG) +struct ObjTypeTag { + ObjectType otype; + AccessType access; + Type *type; +}; + + +/// Type 3 (OT_NAMESPACE) +struct ObjNameSpace { + ObjectType otype; + AccessType access; + NameSpace *nspace; +}; + + +/// Type 4 (OT_MEMBERVAR) +struct ObjMemberVar { + ObjectType otype; + AccessType access; + Boolean anonunion; + Boolean has_path; + struct ObjMemberVar *next; + HashNameNode *name; + Type *type; + UInt32 qual; + UInt32 offset; +}; +struct ObjMemberVarPath { + ObjectType otype; + AccessType access; + Boolean anonunion; + Boolean has_path; + struct ObjMemberVar *next; + HashNameNode *name; + Type *type; + UInt32 qual; + UInt32 offset; + BClassList *path; +}; + + +typedef enum DataType { + DDATA, + DLOCAL, + DABSOLUTE, + DFUNC, + DVFUNC, + DINLINEFUNC, + DALIAS, + DEXPR, + DNONLAZYPTR, + DLABEL, + DUNUSED +} DataType; + +/// Type 5 (OT_OBJECT) +struct Object { + ObjectType otype; + AccessType access; + DataType datatype; + Section section; + NameSpace *nspace; + HashNameNode *name; + Type *type; + UInt32 qual; + SInt16 sclass; + UInt8 flags; + ExtendedParam *extParam; + Object *toc; + void *any; + //char reg; // notsure? + //VarRecord *varptr; // notsure? + // union starts at 0x24 in v7 + union { + struct { + union { + CInt64 intconst; + Float *floatconst; + MWVector128 *vector128const; + char *string; + struct { + char *data; + SInt32 size; + } switchtable; + } u; + VarInfo *info; + HashNameNode *linkname; + Boolean islocalstatic; + } data; + UInt32 address; + struct { + VarInfo *info; + HashNameNode *linkname; + Object *over_load; + } toc; + struct { + union { + TemplateFunction *templ; + CI_FuncData *ifuncdata; + SInt32 intrinsicid; + } u; + DefArgCtorInfo *defargdata; + HashNameNode *linkname; + TemplFuncInstance *inst; + PTFList *ptfList; + ObjectList *argList; + } func; + struct { + char *data; + SInt32 size; + InlineXRef *xrefs; + } ifunc; + struct { + VarInfo *info; + SInt32 uid; + SInt32 offset; + Object *realObj; + } var; + struct { + Object *object; + //TypeClass *member; + BClassList *member; // ??? + SInt32 offset; + } alias; + struct { + Object *function; + HashNameNode *labelname; + } label; + ENode *expr; + } u; +}; + +#define OBJ_BASE(obj) ((ObjBase *) (obj)) +#define OBJ_ENUM_CONST(obj) ((ObjEnumConst *) (obj)) +#define OBJ_TYPE(obj) ((ObjType *) (obj)) +#define OBJ_TYPE_TAG(obj) ((ObjTypeTag *) (obj)) +#define OBJ_NAMESPACE(obj) ((ObjNameSpace *) (obj)) +#define OBJ_MEMBER_VAR(obj) ((ObjMemberVar *) (obj)) +#define OBJ_MEMBER_VAR_PATH(obj) ((ObjMemberVarPath *) (obj)) +#define OBJECT(obj) ((Object *) (obj)) + +#endif + +#ifdef __MWERKS__ +#pragma options align=reset +#endif diff --git a/includes/compiler/scopes.h b/includes/compiler/scopes.h new file mode 100644 index 0000000..ea2ae98 --- /dev/null +++ b/includes/compiler/scopes.h @@ -0,0 +1,53 @@ +#ifndef COMPILER_SCOPES_H +#define COMPILER_SCOPES_H + +#include "compiler/common.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +struct NameSpace { + NameSpace *parent; + HashNameNode *name; + NameSpaceList *usings; + TypeClass *theclass; + NameSpaceName *tparams; + union { + NameSpaceName **hash; + NameSpaceName *list; + } data; + UInt32 names; + Boolean is_hash; + Boolean is_global; + Boolean is_unnamed; + Boolean is_templ; +}; + +struct NameSpaceList { + NameSpaceList *next; + NameSpace *nspace; +}; + +struct NameSpaceObjectList { + NameSpaceObjectList *next; + ObjBase *object; +}; + +struct NameSpaceName { + NameSpaceName *next; + HashNameNode *name; + NameSpaceObjectList first; +}; + +struct NameSpaceLookupList { // assumed name + NameSpaceLookupList *next; + NameSpace *nspace; + NameSpaceList *namespaces; +}; + +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +#endif diff --git a/includes/compiler/som.h b/includes/compiler/som.h new file mode 100644 index 0000000..ab541ef --- /dev/null +++ b/includes/compiler/som.h @@ -0,0 +1,35 @@ +#ifndef COMPILER_SOM_H +#define COMPILER_SOM_H + +#include "compiler/common.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +typedef enum SOMMethodState { + SOMMS_Deleted, + SOMMS_Method, + SOMMS_Migrated +} SOMMethodState; + +typedef struct SOMReleaseOrder { // checked via CPrec + struct SOMReleaseOrder *next; + HashNameNode *name; + SOMMethodState state; +} SOMReleaseOrder; + +struct SOMInfo { // checked via CPrec + TypeClass *metaclass; + Object *classdataobject; + SOMReleaseOrder *order; + UInt32 majorversion; + UInt32 minorversion; + UInt8 oidl_callstyle; +}; + +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +#endif diff --git a/includes/compiler/templates.h b/includes/compiler/templates.h new file mode 100644 index 0000000..f188e0d --- /dev/null +++ b/includes/compiler/templates.h @@ -0,0 +1,237 @@ +#ifndef COMPILER_TEMPLATES_H +#define COMPILER_TEMPLATES_H + +#include "compiler/common.h" +#include "compiler/types.h" +#include "compiler/tokens.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +typedef struct PackedDeclInfo { // ok + Type *thetype; + UInt32 qual; + NameSpace *nspace; + HashNameNode *name; + TemplArg *expltargs; + SInt16 storageclass; + Section section; + UInt8 exportflags; + Boolean has_expltargs; +} PackedDeclInfo; + +struct Template { + Template *parent; + TemplInstance *parentinst; + TemplParam *params; + Boolean is_class; +}; + +struct TemplateFriend { // verified via CPrec + PackedDeclInfo decl; + FileOffsetInfo fileoffset; + TStream stream; +}; + +struct TemplateMember { // verified via CPrec + struct TemplateMember *next; + TemplParam *params; + Object *object; + FileOffsetInfo fileoffset; + TStream stream; + CPrepFileInfo *srcfile; + SInt32 startoffset; + SInt32 endoffset; +}; + +struct TemplInstance { + // Template *templ; + TemplInstance *parent; + TemplArg *args; + Boolean is_instantiated; + Boolean is_specialized; + Boolean is_extern; + Boolean static_instantiated; +}; +/* +struct __attribute__((packed)) TemplInstance +{ + Template *templ; + TemplInstance *parent; + TemplArg *args; + unsigned __int8 is_instantiated; + unsigned __int8 is_specialized; + unsigned __int8 is_extern; + unsigned __int8 static_instantiated; +}; + + */ + +struct TemplParam { // verified via CPrec + TemplParam *next; + HashNameNode *name; + TemplParamID pid; + union { + struct { + Type *type; + UInt32 qual; + } typeparam; + struct { + Type *type; + UInt32 qual; + ENode *defaultarg; + } paramdecl; + struct { + TemplParam *plist; + Type *defaultarg; + } templparam; + } data; +}; + +struct TemplArg { // verified by CPrec + TemplArg *next; + TemplParamID pid; + union { + struct { + Type *type; + UInt32 qual; + } typeparam; + struct { + ENode *expr; + Boolean is_ref; + } paramdecl; + Type *ttargtype; + } data; + Boolean is_deduced; +}; + +struct TemplPartialSpec { // confirmed via CPrec (but templ might be a different type?) + TemplPartialSpec *next; + TemplClass *templ; + TemplArg *args; +}; + +struct TemplStack { + TemplStack *next; + union { + Object *func; + TypeClass *theclass; + } u; + Boolean is_func; + Boolean is_poi; +}; + +/***********/ +/* Classes */ +/***********/ + +struct TemplClass { + TypeClass theclass; + TemplClass *next; + TemplClass *templ__parent; + Type *x3A_maybe_parentinst; + TemplParam *templ__params; + TemplateMember *members; + TemplClassInst *instances; + TemplClass *pspec_owner; + TemplPartialSpec *pspecs; + TemplateAction *actions; + // not confirmed these last 3 fields yet but there is space for them + UInt16 lex_order_count; + SInt8 align; + UInt8 flags; +}; + +struct TemplClassInst { + TypeClass theclass; + TemplClassInst *next; + Type *x36; // not sure what this represents + TemplClass *templ; + TemplArg *inst_args; + TemplArg *oargs; + void *x46; +}; + +#define TEMPL_CLASS(ty) ( (TemplClass *) (ty) ) +#define TEMPL_CLASS_INST(ty) ( (TemplClassInst *) (ty) ) + +/*************/ +/* Functions */ +/*************/ + +struct TemplateFunction { // verified via CPrec + TemplateFunction *next; + TemplateFunction *unk4; // parent? + HashNameNode *name; + TemplParam *params; + TStream stream; + TStreamElement deftoken; + Object *tfunc; + TemplFuncInstance *instances; + CPrepFileInfo *srcfile; + SInt32 startoffset; + SInt32 endoffset; +}; + +struct TemplFuncInstance { // verified via CPrec + TemplFuncInstance *next; + Object *object; + TemplArg *args; + Boolean is_instantiated; + Boolean is_specialized; + Boolean is_extern; + Boolean static_instantiated; +}; + +/***********/ +/* Actions */ +/***********/ + +typedef enum TemplateActionType { + TAT_NESTEDCLASS, + TAT_ENUMTYPE, + TAT_FRIEND, + TAT_ENUMERATOR, // in pro7 but not pro8 + TAT_BASE, + TAT_OBJECTINIT, + TAT_USINGDECL, + TAT_OBJECTDEF, + TAT_ILLEGAL +} TemplateActionType; + +struct TemplateAction { // verified via CPrec + TemplateAction *next; + TStreamElement source_ref; + union { + TemplClass *tclasstype; + TypeEnum *enumtype; + TemplateFriend *tfriend; + struct { + ObjEnumConst *objenumconst; + ENode *initexpr; + } enumerator; + struct { + Type *type; + ClassList *insert_after; + AccessType access; + Boolean is_virtual; + } base; + struct { + Object *object; + ENode *initexpr; + } objectinit; + struct { + TypeTemplDep *type; + AccessType access; + } usingdecl; + ObjBase *refobj; + } u; + TemplateActionType type; +}; + +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +#endif diff --git a/includes/compiler/tokens.h b/includes/compiler/tokens.h new file mode 100644 index 0000000..b574a81 --- /dev/null +++ b/includes/compiler/tokens.h @@ -0,0 +1,182 @@ +#ifndef COMPILER_TOKENS_H +#define COMPILER_TOKENS_H + +#include "compiler/common.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +#define TKD_OPERATOR 328 +#define TKD_TEMPLATE 332 +#define TKD_IDENTIFIER -3 +#define TKD_COLON_COLON 372 + +typedef enum EToken { + TK_INTCONST = -1, + TK_FLOATCONST = -2, + TK_IDENTIFIER = -3, + TK_STRING = -4, + TK_STRING_WIDE = -5, + TK_NEG6 = -6, + TK_NEG7 = -7, + TK_AUTO = 256, + TK_REGISTER, + TK_STATIC, + TK_EXTERN, + TK_TYPEDEF, + TK_INLINE, + TK_VOID, + TK_CHAR, + TK_SHORT, + TK_INT, + TK_LONG, + TK_FLOAT, + TK_DOUBLE, + TK_SIGNED, + TK_UNSIGNED, + TK_STRUCT, + TK_UNION, + TK_ENUM, + TK_CLASS, + TK_UU_VECTOR = 283, + TK_UU_TYPEOF_UU, + TK_BOOL, + TK_WCHAR_T, + TK_U_COMPLEX, + TK_U_IMAGINARY, + TK_TYPENAME, + TK_CONST, + TK_VOLATILE, + TK_PASCAL, + TK_UU_DECLSPEC, + TK_UU_STDCALL, + TK_UU_CDECL, + TK_UU_FASTCALL, + TK_UU_FAR, + TK_EXPLICIT, + TK_MUTABLE, + TK_ONEWAY, + TK_IN, + TK_INOUT, + TK_OUT, + TK_BYCOPY, + TK_BYREF, + TK_ASM = 310, + TK_CASE, + TK_DEFAULT, + TK_IF, + TK_ELSE, + TK_SWITCH, + TK_WHILE, + TK_DO, + TK_FOR, + TK_GOTO, + TK_CONTINUE, + TK_BREAK, + TK_RETURN, + TK_SIZEOF, + TK_CATCH, + TK_DELETE, + TK_FRIEND, + TK_NEW, + TK_OPERATOR, + TK_PRIVATE, + TK_PROTECTED, + TK_PUBLIC, + TK_TEMPLATE, + TK_THIS, + TK_THROW, + TK_TRY, + TK_VIRTUAL, + TK_INHERITED, + TK_CONST_CAST, + TK_DYNAMIC_CAST, + TK_NAMESPACE, + TK_REINTERPRET_CAST, + TK_STATIC_CAST, + TK_USING, + TK_TRUE, + TK_FALSE, + TK_TYPEID, + TK_EXPORT, + TK_MULT_ASSIGN, + TK_DIV_ASSIGN, + TK_MOD_ASSIGN, + TK_ADD_ASSIGN, + TK_SUB_ASSIGN, + TK_SHL_ASSIGN, + TK_SHR_ASSIGN, + TK_AND_ASSIGN, + TK_XOR_ASSIGN, + TK_OR_ASSIGN, + TK_LOGICAL_OR, + TK_LOGICAL_AND, + TK_LOGICAL_EQ, + TK_LOGICAL_NE, + TK_LESS_EQUAL, + TK_GREATER_EQUAL, + TK_SHL, + TK_SHR, + TK_INCREMENT, + TK_DECREMENT, + TK_ARROW, + TK_ELLIPSIS, + TK_DOT_STAR, + TK_ARROW_STAR, + TK_COLON_COLON, + TK_AT_INTERFACE, + TK_AT_IMPLEMENTATION, + TK_AT_PROTOCOL, + TK_AT_END, + TK_AT_PRIVATE, + TK_AT_PROTECTED, + TK_AT_PUBLIC, + TK_AT_CLASS, + TK_AT_SELECTOR, + TK_AT_ENCODE, + TK_AT_DEFS, + TK_SELF, + TK_SUPER, + TK_UU_ALIGNOF_UU = 388, + TK_RESTRICT, + TK_UU_ATTRIBUTE_UU, + TK_UU_UUIDOF +} EToken; + +typedef struct FileOffsetInfo { + CPrepFileInfo *file; + SInt32 offset; + SInt32 tokenoffset; + Boolean is_inline; +} FileOffsetInfo; + +typedef union TData { + HashNameNode *tkidentifier; + CInt64 tkintconst; + Float tkfloatconst; + struct { + char *data; + SInt32 size; + } tkstring; +} TData; + +struct TStreamElement { + SInt16 tokentype; + SInt16 subtype; + CPrepFileInfo *tokenfile; + SInt32 tokenoffset; + SInt32 tokenline; + TData data; +}; + +struct TStream { + SInt32 tokens; + TStreamElement *firsttoken; +}; + +#endif + +#ifdef __MWERKS__ +#pragma options align=reset +#endif diff --git a/includes/compiler/types.h b/includes/compiler/types.h new file mode 100644 index 0000000..9b07590 --- /dev/null +++ b/includes/compiler/types.h @@ -0,0 +1,324 @@ +#ifndef COMPILER_TYPES_H +#define COMPILER_TYPES_H + +#include "compiler/common.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +typedef enum TypeType { + TYPEVOID = 0, + TYPEINT, + TYPEFLOAT, + TYPEENUM, + TYPESTRUCT, + TYPECLASS, + TYPEFUNC, + TYPEBITFIELD, + TYPELABEL, + TYPETEMPLATE, + TYPEMEMBERPOINTER, + TYPEPOINTER, + TYPEARRAY, + TYPEOBJCID, + TYPETEMPLDEPEXPR, + TYPEILLEGAL = -1 +} TypeType; + + +/// Common fields across all kinds of types +struct Type { + TypeType type; + SInt32 size; +}; + + +typedef enum IntegralType { + IT_BOOL = 0, + IT_CHAR = 1, + IT_SCHAR = 2, + IT_UCHAR = 3, + IT_WCHAR_T = 4, + IT_SHORT = 5, + IT_USHORT = 6, + IT_INT = 7, + IT_UINT = 8, + IT_LONG = 9, + IT_ULONG = 10, + IT_LONGLONG = 11, + IT_ULONGLONG = 12, + IT_FLOAT = 13, + IT_SHORTDOUBLE = 14, + IT_DOUBLE = 15, + IT_LONGDOUBLE = 16 +} IntegralType; + +struct TypeIntegral { + TypeType type; + SInt32 size; + unsigned char integral; +}; + + +struct TypeEnum { // checked via CPrec + TypeType type; + SInt32 size; + NameSpace *nspace; + ObjEnumConst *enumlist; + Type *enumtype; + HashNameNode *enumname; +}; + + +struct TypeStruct { + TypeType type; + SInt32 size; + HashNameNode *name; + StructMember *members; + char stype; + SInt16 align; +}; +struct StructMember { + StructMember *next; + Type *type; + HashNameNode *name; + SInt32 offset; + UInt32 qual; +}; + +enum { + STRUCT_TYPE_STRUCT = 0, + STRUCT_TYPE_UNION = 1, + STRUCT_TYPE_4 = 4, + STRUCT_TYPE_5 = 5, + STRUCT_TYPE_6 = 6, + STRUCT_TYPE_7 = 7, + STRUCT_TYPE_8 = 8, + STRUCT_TYPE_9 = 9, + STRUCT_TYPE_A = 10, + STRUCT_TYPE_B = 11, + STRUCT_TYPE_C = 12, + STRUCT_TYPE_D = 13, + STRUCT_TYPE_E = 14 +}; + + +typedef struct ClassList { // checked via CPrec + struct ClassList *next; + TypeClass *base; + SInt32 offset; + SInt32 voffset; + AccessType access; + Boolean is_virtual; +} ClassList; + +typedef struct VClassList { // checked via CPrec + struct VClassList *next; + TypeClass *base; + SInt32 offset; + SInt32 voffset; + Boolean has_override; + char alignsave; +} VClassList; + +typedef struct ClassFriend { // checked via CPrec + struct ClassFriend *next; + union { + TypeClass *theclass; + Object *obj; + } u; + Boolean isclass; +} ClassFriend; + +struct BClassList { // checked via CPrec + struct BClassList *next; + Type *type; +}; + +typedef struct VTable { // checked via CPrec + Object *object; + TypeClass *owner; + SInt32 offset; + SInt32 size; +} VTable; + +struct TypeClass { + TypeType type; + SInt32 size; + NameSpace *nspace; + HashNameNode *classname; + ClassList *bases; + VClassList *vbases; + ObjMemberVar *ivars; + ClassFriend *friends; + VTable *vtable; + SOMInfo *sominfo; + ObjCInfo *objcinfo; + UInt16 flags; + SInt8 mode; + SInt8 action; + SInt16 align; + UInt8 eflags; +}; + +enum { + CLASS_FLAGS_2 = 2, + CLASS_FLAGS_20 = 0x20, + CLASS_FLAGS_100 = 0x100, // is TemplClass + CLASS_FLAGS_800 = 0x800, // is TemplClassInst + CLASS_FLAGS_900 = 0x900 +}; + + +typedef struct ExceptSpecList { + struct ExceptSpecList *next; + Type *type; + UInt32 qual; +} ExceptSpecList; + +struct FuncArg { // ok + struct FuncArg *next; + HashNameNode *name; + ENode *dexpr; + Type *type; + UInt32 qual; + SInt16 sclass; + Boolean is_array; + Boolean has_defdefarg; +}; + +struct TypeFunc { + TypeType type; + SInt32 size; + FuncArg *args; + ExceptSpecList *exspecs; + Type *functype; + UInt32 qual; + UInt32 flags; +}; +enum { + FUNC_FLAGS_PASCAL = 1, // on TypeFunc::flags + FUNC_FLAGS_METHOD = 0x10, + FUNC_FLAGS_40 = 0x40, // func that's like "operator SomeOtherType()" + FUNC_FLAGS_1000 = 0x1000, + FUNC_FLAGS_2000 = 0x2000, + FUNC_FLAGS_100000 = 0x100000, + FUNC_FLAGS_900000 = 0x900000 +}; + +// There seems to be a version of this which adds a class pointer at the end +struct TypeMethod { + TypeType type; + SInt32 size; + FuncArg *args; + ExceptSpecList *exspecs; + Type *functype; + UInt32 qual; + UInt32 flags; + TypeClass *theclass; + void *x1E; + void *x22; + Boolean x26; +}; + + +struct TypeBitfield { + TypeType type; + SInt32 size; + Type *bitfieldtype; + unsigned char unkA; + char unkB; +}; + + +// Label + + +typedef enum TypeTemplDepType { + TEMPLDEP_ARGUMENT, + TEMPLDEP_QUALNAME, + TEMPLDEP_TEMPLATE, + TEMPLDEP_ARRAY, + TEMPLDEP_QUALTEMPL, + TEMPLDEP_BITFIELD, + TEMPLDEP_VALUEDEP, // not in v7? + TEMPLDEP_ENUMVAL, // not in v7? + TEMPLDEP_TYPEOF // not in v7? +} TypeTemplDepType; + +struct TypeTemplDep { + TypeType type; + SInt32 size; + TypeTemplDepType dtype; + union { + TemplParamID pid; + struct { + TypeTemplDep *type; + HashNameNode *name; + } qual; + struct { + TemplClass *templ; + TemplArg *args; + } templ; + struct { + Type *type; + ENode *index; + } array; + struct { + TypeTemplDep *type; + TemplArg *args; + } qualtempl; + struct { + Type *type; + ENode *size; + } bitfield; + // the following ones may not be in v7 + Type *vdep; + ENode *tof; + struct { + TypeEnum *etype; + ENode *expr; + } enumval; + } u; +}; + + +struct TypeMemberPointer { + TypeType type; + SInt32 size; + Type *ty1; + Type *ty2; + UInt32 qual; +}; + + +/// Used for TYPEPOINTER and TYPEARRAY +struct TypePointer { + TypeType type; + SInt32 size; + Type *target; + UInt32 qual; +}; + + +// ObjCID + + +// Not sure if these existed originally, but they'll help +#define TYPE_INTEGRAL(ty) ((TypeIntegral *) (ty)) +#define TYPE_ENUM(ty) ((TypeEnum *) (ty)) +#define TYPE_STRUCT(ty) ((TypeStruct *) (ty)) +#define TYPE_CLASS(ty) ((TypeClass *) (ty)) +#define TYPE_FUNC(ty) ((TypeFunc *) (ty)) +#define TYPE_METHOD(ty) ((TypeMethod *) (ty)) +#define TYPE_BITFIELD(ty) ((TypeBitfield *) (ty)) +#define TYPE_TEMPLATE(ty) ((TypeTemplDep *) (ty)) +#define TYPE_MEMBER_POINTER(ty) ((TypeMemberPointer *) (ty)) +#define TYPE_POINTER(ty) ((TypePointer *) (ty)) + +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +#endif -- cgit v1.2.3