This commit is contained in:
Ash Wolf
2022-11-07 03:06:21 +00:00
parent d0b9848c54
commit 9a46dd0e2e
62 changed files with 30796 additions and 1532 deletions

39
includes/compiler/CABI.h Normal file
View File

@@ -0,0 +1,39 @@
#ifndef COMPILER_CABI_H
#define COMPILER_CABI_H
#include "compiler/common.h"
#include "compiler/CDecl.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
extern short CABI_GetStructResultArgumentIndex(void);
extern Type *CABI_GetSizeTType(void);
extern Type *CABI_GetPtrDiffTType(void);
extern SInt16 CABI_StructSizeAlignValue(Type *type, SInt32 size);
extern void CABI_ReverseBitField(TypeBitfield *tbitfield);
extern void CABI_AddVTable(TypeClass *tclass);
extern SInt32 CABI_GetVTableOffset(TypeClass *tclass);
extern void CABI_LayoutClass(DeclE *decle, TypeClass *tclass);
extern void CABI_MakeDefaultArgConstructor(Object *obj, TypeClass *tclass);
extern ENode *CABI_MakeThisExpr(TypeClass *tclass, SInt32 offset);
extern SInt32 CABI_GetCtorOffsetOffset(TypeClass *tclass, TypeClass *base);
extern Object *CABI_ConstructorCallsNew(TypeClass *tclass);
typedef Statement *(*TransConstructorCallback)(Statement *stmt, TypeClass *tclass, TypeClass *base, SInt32 offset, Boolean flag);
extern void CABI_TransConstructor(Object *obj, Statement *stmt, TypeClass *tclass, TransConstructorCallback callback, Boolean flag);
extern void CABI_MakeDefaultConstructor(TypeClass *tclass, Object *obj);
extern void CABI_MakeDefaultCopyConstructor(TypeClass *tclass, Object *obj);
extern void CABI_MakeDefaultAssignmentOperator(TypeClass *tclass, Object *obj);
extern void CABI_TransDestructor(Object *obj1, Object *obj2, Statement *stmt, TypeClass *tclass);
extern void CABI_MakeDefaultDestructor(TypeClass *tclass, Object *obj);
extern void CABI_MakeLayeredDestructor(TypeClass *tclass, Object *obj);
extern Object *CABI_GetDestructorObject(Object *obj, int what);
extern void CABI_AddLayeredDestructors(TypeClass *tclass);
extern ENode *CABI_DestroyObject(Object *dtor, ENode *objexpr, UInt8 mode, Boolean flag1, Boolean flag2);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -0,0 +1,71 @@
#ifndef COMPILER_CCLASS_H
#define COMPILER_CCLASS_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct VTableObjectLink {
struct VTableObjectLink *next;
Object *methodobj;
SInt32 offset;
SInt32 xC;
} VTableObjectLink;
extern void CClass_Init(void);
extern void CClass_GenThunks(void);
extern UInt8 CClass_GetOverrideKind(TypeFunc *a, TypeFunc *b, Boolean errorflag);
extern Boolean CClass_IsEmpty(TypeClass *tclass);
extern Boolean CClass_IsNonStaticMemberFunc(TypeMethod *tmethod);
extern Object *CClass_DefaultConstructor(TypeClass *tclass);
extern Object *CClass_DummyDefaultConstructor(TypeClass *tclass);
extern ENode *CClass_DefaultConstructorCall(TypeClass *a, TypeClass *b, ENode *expr, SInt32 unkshortparam, Boolean flag1, Boolean flag2, Boolean *errorflag);
extern Object *CClass_AssignmentOperator(TypeClass *tclass);
extern Object *CClass_CopyConstructor(TypeClass *tclass);
extern NameSpaceObjectList *CClass_MemberObject(TypeClass *tclass, HashNameNode *name);
extern Object *CClass_Constructor(TypeClass *tclass);
extern Object *CClass_Destructor(TypeClass *tclass);
extern Boolean CClass_IsConstructor(Object *obj);
extern Boolean CClass_IsDestructor(Object *obj);
extern Boolean CClass_IsPODClass(TypeClass *tclass);
extern Boolean CClass_IsTrivialCopyClass(TypeClass *tclass);
extern Boolean CClass_IsTrivialCopyAssignClass(TypeClass *tclass);
extern Boolean CClass_ReferenceArgument(TypeClass *tclass);
extern BClassList *CClass_GetPathCopy(BClassList *path, Boolean is_global);
extern BClassList *CClass_AppendPath(BClassList *a, BClassList *b);
extern Boolean CClass_IsMoreAccessiblePath(BClassList *path1, BClassList *path2);
extern BClassList *CClass_GetBasePath(TypeClass *a, TypeClass *b, short *founddepth, Boolean *isambigbase);
extern Boolean CClass_IsBaseClass(TypeClass *a, TypeClass *b, short *founddepth, Boolean pathcheckflag, Boolean ambigerrorflag);
extern TypeClass *CClass_GetQualifiedClass(void);
extern ENode *CClass_AccessPathCast(BClassList *path, ENode *expr, Boolean flag);
extern ENode *CClass_ClassPointerCast(ENode *expr, TypeClass *a, TypeClass *b, Boolean typconflag, Boolean ambigerrorflag, Boolean pathcheckflag);
extern ENode *CClass_DirectBasePointerCast(ENode *expr, TypeClass *a, TypeClass *b);
extern SInt32 CClass_GetPathOffset(BClassList *path);
extern Boolean CClass_ClassDominates(TypeClass *a, TypeClass *b);
extern SInt32 CClass_VirtualBaseOffset(TypeClass *a, TypeClass *b);
extern SInt32 CClass_VirtualBaseVTableOffset(TypeClass *a, TypeClass *b);
extern SInt32 CClass_GetMemberOffset(TypeClass *tclass, HashNameNode *name, ObjMemberVar **obj);
extern Boolean CClass_OverridesBaseMember(TypeClass *tclass, HashNameNode *name, Object *obj);
extern void CClass_DefineCovariantFuncs(Object *method, CI_FuncData *ifuncdata);
extern void CClass_CheckOverrides(TypeClass *tclass);
extern void CClass_ClassDefaultFuncAction(TypeClass *tclass);
extern void CClass_ClassAction(TypeClass *tclass);
extern void CClass_MakeStaticActionClass(TypeClass *tclass);
extern Object *CClass_CheckPures(TypeClass *tclass);
extern void CClass_MemberDef(Object *obj, TypeClass *tclass);
extern Object *CClass_ThisSelfObject(void);
extern ENode *CClass_CreateThisSelfExpr(void);
extern void CClass_CheckPathAccess(BClassList *path, Object *obj, AccessType access);
extern void CClass_CheckStaticAccess(BClassList *path, TypeClass *tclass, AccessType access);
extern void CClass_CheckObjectAccess(BClassList *path, Object *obj);
extern void CClass_CheckEnumAccess(BClassList *path, ObjEnumConst *objec);
extern Type *CClass_CombineClassAccessQualifiers(Type *type, UInt32 qual1, UInt32 qual2, UInt32 *outflags);
extern ENode *CClass_AccessMember(ENode *classexpr, Type *type, UInt32 qual, SInt32 offset);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

127
includes/compiler/CDecl.h Normal file
View File

@@ -0,0 +1,127 @@
#ifndef COMPILER_CDECL_H
#define COMPILER_CDECL_H
#include "compiler/common.h"
#include "compiler/tokens.h"
#include "compiler/types.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
// named because it's 0xE bytes big (hurr)
typedef struct DeclE {
ObjBase **objlist;
void *x4;
unsigned short x8;
unsigned short xA;
Boolean xC;
} DeclE;
struct DeclInfo {
Type *thetype;
UInt32 qual;
NameSpace *nspace;
HashNameNode *name;
Object *x10;
NameSpaceObjectList *x14;
void *x18;
void *x1C;
Type *x20;
ENode *x24;
TemplClass *x28;
TemplArg *expltargs;
void *x30;
void *x34;
void *x38;
Boolean x3C;
Boolean x3D;
short x3E;
short storageclass;
UInt8 section;
UInt8 exportflags;
Boolean x44;
Boolean x45;
Boolean x46;
Boolean x47;
Boolean x48;
Boolean x49;
Boolean x4A;
Boolean x4B;
Boolean x4C;
Boolean x4D;
Boolean x4E;
Boolean x4F;
Boolean x50;
Boolean x51;
Boolean has_expltargs;
Boolean x53;
Boolean x54;
Boolean x55;
Boolean x56;
Boolean x57;
FileOffsetInfo fileoffsetinfo;
};
typedef struct BigDeclInfo {
DeclInfo declinfo;
DeclInfo declinfo2;
Boolean xCC;
Boolean xCD;
} BigDeclInfo;
extern AccessType global_access;
extern FileOffsetInfo member_fileoffset;
extern Type *CDecl_NewStructType(SInt32 size, SInt16 align);
extern Type *CDecl_NewArrayType(Type *type, SInt32 size);
extern Type *CDecl_NewPointerType(Type *type);
extern Type *CDecl_NewRefPointerType(Type *type);
extern Type *CDecl_NewTemplDepType(TypeTemplDepType tdt);
extern void CDecl_SetResultReg(TypeFunc *tfunc);
extern void CDecl_SetFuncFlags(TypeFunc *tfunc, UInt32 flags);
extern void CDecl_NewConvFuncType(DeclInfo *declinfo);
extern void CDecl_CompleteType(Type *type);
extern Boolean IsCompleteType(Type *type);
extern Boolean CanAllocObject(Type *type);
extern Boolean CanCreateObject(Type *type);
extern void makethetypepointer(DeclInfo *declinfo, UInt32 qual);
extern void CDecl_AddThisPointerArgument(TypeFunc *tfunc, TypeClass *tclass);
extern void CDecl_MakePTMFuncType(TypeFunc *tfunc);
extern void CDecl_AddArgument(TypeFunc *tfunc, Type *argtype);
extern Boolean CDecl_CheckArrayIntegr(Type *type);
extern void CDecl_ParseDirectFuncDecl(DeclInfo *declinfo);
extern void makememberpointertype(DeclInfo *declinfo, TypeClass *tclass, UInt32 qual);
extern void CDecl_ScanPointer(DeclInfo *declinfo, NameSpace *nspace, Boolean flag);
extern void scandeclarator(DeclInfo *declinfo);
extern void conversion_type_name(DeclInfo *declinfo);
extern void MergeDefaultArgs(FuncArg *a, FuncArg *b);
extern void CheckDefaultArgs(FuncArg *args);
extern Object *CDecl_GetFunctionObject(DeclInfo *declinfo, NameSpace *nspace, Boolean *pflag, Boolean someotherflag);
extern void CDecl_TypedefDeclarator(DeclInfo *declinfo);
extern Boolean CDecl_FunctionDeclarator(DeclInfo *declinfo, NameSpace *nspace, Boolean flag, Boolean flag2);
extern void CDecl_ScanDeclarator(DeclInfo *declinfo);
extern void scandeclaratorlist(DeclInfo *declinfo);
extern void CDecl_ComputeUnderlyingEnumType(TypeEnum *tenum);
extern void scanenum(DeclInfo *declinfo);
extern void CDecl_ScanStructDeclarator(BigDeclInfo *bde);
extern void scanstruct(DeclInfo *declinfo, short structtype);
extern void CDecl_ExtractClassExportFlags(DeclInfo *declinfo, UInt8 flags);
extern TypeMethod *CDecl_MakeTypeMemberFunc(TypeFunc *tfunc, TypeClass *tclass, Boolean flag);
extern void CDecl_PackDeclInfo(PackedDeclInfo *packed, DeclInfo *declinfo);
extern void CDecl_UnpackDeclInfo(DeclInfo *declinfo, PackedDeclInfo *packed);
extern void CDecl_AddFriend(TypeClass *tclass, Object *friendfunc, TypeClass *friendclass);
extern void CDecl_CheckCtorIntegrity(FuncArg *args, TypeClass *tclass);
extern void CDecl_MakeVBaseList(TypeClass *tclass);
extern Boolean CDecl_CheckNewBase(TypeClass *a, TypeClass *b, Boolean flag);
extern TypeMethod *CDecl_MakeDefaultDtorType(TypeClass *tclass, Boolean is_virtual);
extern void CDecl_CompleteClass(DeclE *decle, TypeClass *tclass);
extern TypeClass *CDecl_DefineClass(NameSpace *nspace, HashNameNode *name, TypeClass *tclass, short mode, Boolean flag2, Boolean flag3);
extern void CDecl_ParseClassDeclSpec(UInt8 *declspec);
extern void CDecl_ParseClass(DeclInfo *declinfo, short mode, Boolean flag1, UInt8 class_declspec);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -311,6 +311,11 @@ typedef struct _CErrorBuffer {
UInt32 remaining;
} CErrorBuffer;
extern TStreamElement *cerror_locktoken;
extern char cerror_synchdata[32];
extern short cerror_synchoffset;
extern int CError_BreakPointcount;
extern void CError_Init();
extern void CError_SetErrorToken(TStreamElement *token);
extern void CError_SetNullErrorToken();
@@ -354,7 +359,7 @@ 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_Internal(char *filename, int line);
extern void CError_ExpressionTooComplex();
extern void CError_NoMem();
extern void CError_UserBreak();

237
includes/compiler/CExpr.h Normal file
View File

@@ -0,0 +1,237 @@
#ifndef COMPILER_CEXPR_H
#define COMPILER_CEXPR_H
#include "compiler/common.h"
#include "compiler/enode.h"
#include "compiler/types.h"
#include "compiler/CScope.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct ConIteratorList {
struct ConIteratorList *next;
struct ConIterator *iter;
} ConIteratorList;
typedef struct ConIterator {
struct ConIterator *parent;
ConIteratorList *children;
TypeClass *tclass;
} ConIterator;
typedef struct ConversionIterator {
CScopeObjectIterator objiter;
ConIterator myconiter;
ConIterator *coniter;
} ConversionIterator;
enum {
CheckResult0,
CheckResult1,
CheckResult2,
CheckResult3,
CheckResult4
};
// Rename me to StdMatch?
typedef struct Match5 {
short x0;
short x2;
short x4;
short x6;
short x8;
} Match5;
typedef struct Match13 {
short x0;
short x2;
short x4;
short x6;
short x8;
short xA;
short xC;
short xE;
Match5 match5;
} Match13;
// CExpr.c
extern Boolean (*name_obj_check)(void *, Object *); // TODO figure out the right type
extern Boolean disallowgreaterthan;
// CExpr2.c
extern ENode *assign_node;
extern Boolean temp_reference_init;
// CExpr.c
extern void CExpr_RewriteConst();
extern void optimizecomm(ENode *expr);
extern short canadd(ENode *expr, SInt32 value);
extern ENode *checkreference(ENode *expr);
extern ENode *pointer_generation(ENode *expr);
extern void CExpr_PointerGeneration();
extern void oldassignmentpromotion();
extern ENode *argumentpromotion(ENode *expr, Type *type, short qual, Boolean flag);
extern ENode *classargument(ENode *expr);
extern ENodeList *CExpr_ScanExpressionList(Boolean flag);
extern void CExpr_DoExplicitConversion();
extern void CExpr_MakeNameLookupResultExpr();
extern void scansizeof();
extern void scanalignof();
extern ENode *getnodeaddress(ENode *expr, Boolean flag);
extern void getpointertomemberfunc();
extern void CExpr_New_ELOGNOT_Node();
extern void CExpr_New_EMONMIN_Node();
extern void CExpr_New_EBINNOT_Node();
extern ENode *unary_expression(void);
extern ENode *do_castnullcheck(ENode *a, ENode *b);
extern void CExpr_SafeClassPointerCast();
extern ENode *PointerToMemberCast(ENode *expr, TypeMemberPointer *tm1, TypeMemberPointer *tm2, Boolean flag);
extern void CExpr_MemberPointerConversion();
extern ENode *do_typecast(ENode *expr, Type *type, UInt32 qual);
extern void cast_expression();
extern void CExpr_New_EMUL_Node();
extern void CExpr_New_EDIV_Node();
extern void CExpr_New_EMODULO_Node();
extern void CExpr_New_EADD_Node();
extern void CExpr_New_ESUB_Node();
extern void CExpr_New_ESHL_Node();
extern void CExpr_New_ESHR_Node();
extern void CExpr_New_ELESS_Node();
extern void CExpr_New_ELESSEQU_Node();
extern void CExpr_New_EGREATER_Node();
extern void CExpr_New_EGREATEREQU_Node();
extern ENode *memberpointercompare(ENodeType t, ENode *left, ENode *right);
extern void CExpr_New_EEQU_Node();
extern void CExpr_New_ENOTEQU_Node();
extern void CExpr_New_EAND_Node();
extern void CExpr_New_EXOR_Node();
extern void CExpr_New_EOR_Node();
extern void CExpr_New_ELAND_Node();
extern void CExpr_New_ELOR_Node();
extern void CExpr_NewDyadicNode();
extern void CExpr_New_ECOND_Node();
extern ENode *assignment_expression(void);
extern ENode *conv_assignment_expression(void);
extern void CExpr_CheckUnusedExpression();
extern void s_expression();
extern ENode *expression(void);
extern CInt64 CExpr_IntegralConstExprType(Type **tint);
extern ENode *CExpr_IntegralConstOrDepExpr(void);
extern CInt64 CExpr_IntegralConstExpr(void);
extern void CExpr_CheckUnwantedAssignment();
extern void CExpr_ParseAsmExpr();
// CExpr2.c
typedef void (*CExprSearchCB)(ENode *expr);
typedef ENode *(*CExprReplaceCB)(ENode *expr);
extern void CExpr_SearchExprTree(ENode *expr, CExprSearchCB callback, int count, ...);
extern ENode *CExpr_SearchExprTreeReplace(ENode *expr, CExprReplaceCB callback, int count, ...);
extern Boolean CExpr_HasFuncCall(ENode *expr);
extern void CExpr_AliasTransform(ENode *expr);
extern ENode *CExpr_UnaryFloatExpression(ENode *expr);
extern ENode *CExpr_BinaryFloatExpression(ENode *expr);
extern ENode *CExpr_NewENode(ENodeType ty);
extern ENode *CExpr_NewTemplDepENode(TemplDepSubType t);
extern ENode *nullnode(void);
extern ENode *intconstnode(Type *type, SInt32 value);
extern ENode *stringconstnode(char *str);
extern ENode *forceintegral(ENode *expr);
extern ENode *makemonadicnode(ENode *inner, ENodeType ty);
extern ENode *makediadicnode(ENode *left, ENode *right, ENodeType ty);
extern ENode *makecommaexpression(ENode *left, ENode *right);
extern short iszero(ENode *expr);
extern short isnotzero(ENode *expr);
extern Boolean CExpr_IsOne(ENode *expr);
extern Boolean CExpr_AllBitsSet(ENode *expr);
extern ENode *CExpr_NewETEMPNode(Type *type, Boolean assign_id);
extern ENode *CExpr_GetETEMPCopy(ENode *expr);
extern ENode *integralpromote(ENode *expr);
extern CInt64 CExpr_IntConstConvert(Type *a, Type *b, CInt64 val);
extern ENode *promote(ENode *expr, Type *type);
extern void CExpr_ArithmeticConversion(ENode **left, ENode **right);
extern ENode *CExpr_TempModifyExpr(ENode *expr);
extern Boolean CExpr_IsLValue(ENode *expr);
extern ENode *CExpr_LValue(ENode *expr, Boolean flag1, Boolean flag2);
extern ENode *CExpr_MakeObjRefNode(Object *obj, Boolean flag);
extern ENode *create_objectrefnode(Object *obj);
extern ENode *create_objectnode2(Object *obj);
extern ENode *create_objectnode(Object *obj);
extern ENode *CExpr_IsTempConstruction(ENode *expr, Type *type, ENode **resultexpr);
extern ENode *CExpr_AdjustFunctionCall(ENode *expr);
extern ENode *funccallexpr(Object *func, ENode *arg1, ENode *arg2, ENode *arg3, ENode *arg4);
extern ENode *CExpr_FuncCallSix(Object *func, ENode *arg1, ENode *arg2, ENode *arg3, ENode *arg4, ENode *arg5, ENode *arg6);
extern void CExpr_MatchCV(Type *t1, UInt32 q1, Type *t2, UInt32 q2, Match13 *match);
extern Boolean CExpr_MatchAssign(Type *type, UInt32 qual, ENode *expr, Match13 *match);
extern ENode *CExpr_ClassPointerCast(BClassList *cls, ENode *expr, Boolean nullcheckflag);
extern ENode *CExpr_GetClassAccessNode(BClassList *a, BClassList *b, ENode *expr, Object *obj, AccessType access, Boolean flag);
extern ENode *CExpr_ConvertToBool(ENode *expr, Boolean flag);
extern void CExpr_ConversionIteratorInit(ConversionIterator *iter, TypeClass *tclass);
extern Object *CExpr_ConversionIteratorNext(ConversionIterator *iter);
extern void user_assign_check();
extern ENode *CExpr_ConvertToCondition(ENode *expr);
extern void CExpr_ConvertToIntegral();
extern void CExpr_CheckArithmConversion();
extern void get_address_of_temp_copy();
extern short assign_check(ENode *expr, Type *type, UInt32 qual, Boolean flag1, Boolean flag2, Boolean flag3);
extern void CExpr_MatchCompare();
extern void CExpr_GetFuncMatchArgs();
extern ENode *CExpr_GetDefaultArgument(ENode *funcexpr, FuncArg *arg);
extern ENode *CExpr_VarArgPromotion(ENode *expr, Boolean flag);
extern void CExpr_GenericFuncCall();
extern void CExpr_GenericPtmfCall();
extern void CExpr_MakeFunctionCall();
extern void CExpr_CheckOperatorConversion();
extern void CExpr_CheckOperator();
extern ENode *CExpr_ConstructObject(TypeClass *tclass, ENode *addr_expr, ENodeList *args, Boolean flag1, Boolean flag2, Boolean flag3, Boolean flag4, Boolean flag5);
extern void scannew();
extern void scandelete();
// CExprConvMatch.c
// static void CExpr_GetImplictObjectParamType();
// static void CExpr_GetParamType();
// static void CExpr_HasNParams();
// static void CExpr_TypeCompare();
// static void CExpr_IsReferenceCompatible();
// static void CExpr_IsBaseOf();
// static void CExpr_IsBetterClassConversion();
// static void CExpr_IsBetterStandardConv();
// static void CExpr_IsBetterImplicitConv();
// static void CExpr_SetupStandardConversionResult();
// static void CExpr_SetQualConversionResult();
// static void CExpr_OverloadFuncMatch();
// static void CExpr_StandardConversionMatch();
// static void CExpr_UserConversion();
// static void CExpr_UserConversionMatch();
// static void CExpr_ImplicitConversionMatch();
extern Boolean CExpr_CanImplicitlyConvert(ENode *expr, Type *type, UInt32 qual);
// static void CExpr_DerivedToBase();
// static void CExpr_ClassReferenceConversion();
// static void CExpr_BindToReference();
extern ENode *CExpr_Convert(ENode *expr, Type *type, UInt32 qual, Boolean flag1, Boolean flag2);
extern ENode *CExpr_AssignmentPromotion(ENode *expr, Type *type, UInt32 qual, Boolean flag);
// static void CExpr_IsBetterMatch();
// static void CExpr_MatchArgs();
// static void CExpr_GetMatchObject();
// static void CExpr_FindBestMatch();
extern void CExpr_FuncArgMatch();
// static void CExpr_BuildConversionTypeList();
// static void CExpr_NextPromotedIntegralType();
// static void CExpr_NextArithmeticType();
// static void CExpr_NextPromotedArithmeticType();
// static void CExpr_MatchBuiltin();
// static void CExpr_CheckIncDecBuiltin();
// static void CExpr_CheckUnaryBuiltin();
// static void CExpr_CheckBinaryBuiltin();
// static void CExpr_MatchOperands();
extern void CExpr_CondOperatorMatch();
extern void CExpr_OperatorMatch();
// static void CExpr_ClassCopyInit();
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

147
includes/compiler/CFunc.h Normal file
View File

@@ -0,0 +1,147 @@
#ifndef COMPILER_CFUNC_H
#define COMPILER_CFUNC_H
#include "compiler/common.h"
#include "compiler/CScope.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct DeclBlock {
struct DeclBlock *next;
ExceptionAction *dobjstack; // is type right?
NameSpace *parent_nspace;
short index;
} DeclBlock;
struct CLabel {
CLabel *next;
Statement *stmt;
HashNameNode *uniquename;
HashNameNode *name;
PCodeLabel *pclabel;
//void *sicg_label;
};
typedef enum StatementType {
ST_NOP = 1,
ST_LABEL,
ST_GOTO,
ST_EXPRESSION,
ST_SWITCH,
ST_IFGOTO,
ST_IFNGOTO,
ST_RETURN,
ST_OVF,
ST_EXIT,
ST_ENTRY,
ST_BEGINCATCH,
ST_ENDCATCH,
ST_ENDCATCHDTOR,
ST_GOTOEXPR,
ST_ASM,
ST_BEGINLOOP,
ST_ENDLOOP,
ST_ILLEGAL
} StatementType;
enum {
StmtFlag_1 = 1
};
struct Statement {
Statement *next;
StatementType type;
char marked;
UInt8 flags;
UInt16 value;
ENode *expr;
CLabel *label;
ExceptionAction *dobjstack;
SInt32 sourceoffset;
HashNameNode *sourcefilepath;
};
typedef struct InitExpr {
struct InitExpr *next;
ENode *expr;
Object *object;
} InitExpr;
typedef struct CtorChain {
struct CtorChain *next;
UInt8 what;
ENode *objexpr;
union {
ClassList *base; // 0
VClassList *vbase; // 1
ObjMemberVar *membervar; // 2
} u;
} CtorChain;
typedef struct CFuncSave {
CScopeSave scope;
// lots of fields
} CFuncSave;
struct DeclThing {
Type *thetype;
UInt32 qual;
NameSpace *nspace;
CLabel *xC;
CLabel *x10;
};
extern FuncArg elipsis;
extern FuncArg oldstyle;
extern ObjectList *arguments;
extern ObjectList *locals;
extern short localcount;
extern SInt32 curstmtvalue;
extern SInt32 sourceoffset;
extern HashNameNode *sourcefilepath;
extern SInt32 functionbodyoffset;
extern HashNameNode *functionbodypath;
extern InitExpr *init_expressions;
extern CLabel *Labels;
extern CtorChain *ctor_chain;
extern Statement *curstmt;
extern DeclBlock *CFunc_NewDeclBlock(void);
extern void CFunc_RestoreBlock(DeclBlock *block);
extern void CFunc_SetupLocalVarInfo(Object *obj);
extern void CFunc_DefaultArg(Type *type, short qual, FuncArg *args);
extern Boolean CFunc_ParseFakeArgList(Boolean flag);
extern FuncArg *parameter_type_list(DeclInfo *declinfo);
extern CLabel *findlabel(void);
extern CLabel *newlabel(void);
extern Statement *CFunc_AppendStatement(StatementType sttype);
extern Statement *CFunc_InsertStatement(StatementType sttype, Statement *after);
extern Statement *CFunc_InsertBeforeStatement(StatementType sttype, Statement *before);
extern void CheckCLabels(void);
extern Object *create_temp_object(Type *type);
extern ENode *create_temp_node(Type *type);
extern ENode *create_temp_node2(Type *type);
extern void CFunc_WarnUnused(void);
extern void CFunc_CodeCleanup(Statement *stmt);
extern void CFunc_DestructorCleanup(Statement *stmt);
extern Statement *CFunc_GenerateLoop(Statement *stmt, Type *type, ENode *expr1, ENode *expr2, ENode *expr3, ENode *expr4, ENode (*callback)(ENode *, ENode *));
extern void CFunc_CompoundStatement(DeclThing *thing);
extern void CFunc_SetupNewFuncArgs(Object *obj, FuncArg *args);
extern NameSpace *CFunc_FuncGenSetup(Statement *stmt);
extern void CFunc_GetGlobalCompilerState(CFuncSave *state);
extern void CFunc_SetGlobalCompilerState(CFuncSave *state);
extern void CFunc_Gen(Statement *stmt, Object *obj, UInt8 unk);
extern void CFunc_CheckClassCtors(TypeClass *tclass);
extern void CFunc_ParseFuncDef(Object *obj, DeclInfo *declinfo, TypeClass *tclass, Boolean is_method, Boolean is_static, NameSpace *nspace);
extern void InitExpr_Register(ENode *expr, Object *object);
extern void CFunc_GenerateDummyFunction(Object *a);
extern void CFunc_GenerateSingleExprFunc(Object *a, ENode *expr);
extern void CFunc_GenerateDummyCtorFunc(Object *a, Object *b);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

77
includes/compiler/CInit.h Normal file
View File

@@ -0,0 +1,77 @@
#ifndef COMPILER_CINIT_H
#define COMPILER_CINIT_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef void (*ExprCB)(Type *type, ENode *expr, Boolean flag);
typedef void (*InitExprRegisterCB)(ENode *expr);
typedef void (*InsertExprCB)(ENode *expr);
// fix last arg
typedef ENode *(*RegisterObjectCB)(Type *type, Object *obj, SInt32 offset, void *);
typedef ENode *(*TempNodeCB)(Type *type, Boolean flag);
typedef struct OLinkList {
struct OLinkList *next;
Object *obj;
SInt32 offset;
SInt32 somevalue;
} OLinkList;
typedef struct PooledString {
struct PooledString *next;
Object *obj;
int offset;
char *data;
SInt32 size;
Boolean ispascal;
Boolean iswide;
} PooledString;
typedef struct InitInfo {
Object *obj;
OLinkList *list;
void *x8;
SInt32 expr_offset;
ExprCB expr_cb;
Boolean expr_cb_called;
Boolean x15;
Boolean x16;
InitExprRegisterCB init_expr_register_cb;
Object *obj1C;
InsertExprCB insert_expr_cb;
RegisterObjectCB register_object_cb;
char *buffer;
SInt32 size;
SInt32 bufferSize;
struct InitInfo *next;
} InitInfo;
extern TempNodeCB cinit_tempnodefunc;
extern InitInfo *cinit_initinfo;
#ifdef __MWERKS__
#pragma options align=reset
#endif
extern void CInit_Init(void);
extern Boolean CInit_RelocInitCheck(ENode *expr, Object **objptr, CInt64 *valptr, Boolean flag);
extern void CInit_ExportConst(Object *obj);
extern Statement *CInit_ConstructClassArray(Statement *stmt, TypeClass *tclass, Object *ctor, Object *dtor, ENode *firstarg, SInt32 count);
extern ENode *CInit_AutoObject(Object *obj, Type *type, UInt32 qual);
extern void CInit_InitializeAutoData(Object *obj, InsertExprCB insert_cb, RegisterObjectCB register_cb);
extern void CInit_InitializeStaticData(Object *obj, InitExprRegisterCB cb);
extern void CInit_InitializeData(Object *obj);
extern Object *CInit_DeclareString(char *data, SInt32 size, Boolean ispascal, Boolean iswide);
extern PooledString *CInit_DeclarePooledString(char *data, SInt32 size, Boolean ispascal);
extern PooledString *CInit_DeclarePooledWString(char *data, SInt32 size);
extern void CInit_RewriteString(ENode *expr, Boolean flag);
extern void CInit_DeclarePooledStrings(void);
extern void CInit_DeclareData(Object *obj, void *data, OLinkList *list, SInt32 size);
extern void CInit_DeclareReadOnlyData(Object *obj, void *data, OLinkList *list, SInt32 size);
extern void CInit_DefineTentativeData(void);
#endif

121
includes/compiler/CInline.h Normal file
View File

@@ -0,0 +1,121 @@
#ifndef COMPILER_CINLINE_H
#define COMPILER_CINLINE_H
#include "compiler/common.h"
#include "compiler/tokens.h"
#include "compiler/CFunc.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct CI_Var {
HashNameNode *name;
Type *type;
UInt32 qual;
UInt8 sflags;
UInt8 xD;
UInt8 xE;
} CI_Var;
typedef struct CI_Switch {
int fix_me;
} CI_Switch;
typedef struct CI_Statement {
StatementType type;
UInt8 flags;
UInt16 value;
SInt32 sourceoffset;
HashNameNode *sourcefilepath;
ExceptionAction *dobjstack;
union {
SInt16 statementnum;
ENode *expr;
struct {
ENode *expr;
SInt16 statementnum;
} ifgoto;
CI_Switch *switchdata;
// TODO: Figure out the one for Inline ASM
} u;
} CI_Statement;
struct CI_FuncData {
short numarguments;
CI_Var *arguments;
short numlocals;
CI_Var *locals;
short numstatements;
CI_Statement *statements;
FileOffsetInfo fileoffset;
SInt32 symdecloffset;
SInt32 functionbodyoffset;
HashNameNode *functionbodypath;
SInt32 symdeclend;
Boolean can_inline;
};
typedef enum {
CI_ActionInlineFunc = 0,
CI_ActionMemberFunc = 1,
CI_ActionTemplateFunc = 2,
CI_ActionDefaultFunc = 3
} CI_ActionType;
typedef struct CI_Action {
struct CI_Action *next;
Object *obj;
union {
struct {
FileOffsetInfo fileoffset;
TStream stream;
TypeClass *tclass;
CI_ActionType actiontype;
} inlinefunc;
struct {
Type *a;
Type *b;
TemplateMember *tmemb;
} memberfunc;
struct {
TemplateFunction *func;
TemplFuncInstance *inst;
} templatefunc;
} u;
} CI_Action;
typedef enum {
CopyMode0,
CopyMode1,
CopyMode2,
CopyMode3,
CopyMode4
} CInlineCopyMode;
extern CI_Action *cinline_tactionlist;
extern void CInline_Init(void);
extern SInt32 CInline_GetLocalID(Object *obj);
extern Boolean CInline_ExpressionHasSideEffect(ENode *expr);
extern ENode *CInline_CopyExpression(ENode *expr, CInlineCopyMode mode);
extern void CInline_SerializeStatement(Statement *stmt);
extern Object *CInline_GetLocalObj(SInt32 id, Boolean flag);
extern SInt32 CInline_GetStatementNumber(Statement *first, Statement *stmt);
extern void CInline_PackIFunctionData(CI_FuncData *packed, Statement *stmt, Object *obj);
extern void CInline_UnpackIFunctionData(Object *obj, CI_FuncData *packed, Statement *stmt);
extern void CInline_AddDefaultFunctionAction(Object *obj);
extern void CInline_AddInlineFunctionAction(Object *obj, TypeClass *tclass, FileOffsetInfo *fileoffset, TStream *stream, Boolean flag);
extern void CInline_AddMemberFunctionAction(Object *obj, Type *a, Type *b, TemplateMember *tmemb);
extern void CInline_AddTemplateFunctionAction(Object *obj, TemplateFunction *func, TemplFuncInstance *inst);
extern void CInline_ObjectAddrRef(Object *obj);
extern void CInline_GenFunc(Statement *stmt, Object *obj, UInt8 unk);
extern Boolean CInline_CanFreeLHeap(void);
extern Boolean CInline_GenerateDeferredFuncs(void);
extern void CInline_Finish(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -13,6 +13,10 @@ extern const CInt64 cint64_min;
inline int CInt64_IsNegative(const CInt64 *n) {
return (n->hi & 0x80000000) != 0;
}
inline UInt32 CInt64_GetULong(const CInt64 *n) { // 42E660 in mwcppc.exe
return n->lo;
}
inline void CInt64_SetLong(CInt64 *pN, SInt32 n) {
pN->lo = n;
pN->hi = (n < 0) ? 0xFFFFFFFF : 0;
@@ -22,7 +26,7 @@ inline void CInt64_SetULong(CInt64 *pN, UInt32 n) {
pN->hi = 0;
}
inline int CInt64_IsZero(CInt64 *n) {
inline Boolean CInt64_IsZero(CInt64 *n) {
//if (n->hi == 0 && n->lo == 0)
// return 1;
//else

View File

@@ -0,0 +1,84 @@
#ifndef COMPILER_CMACHINE_H
#define COMPILER_CMACHINE_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
extern TypeIntegral stbool;
extern TypeIntegral stchar;
extern TypeIntegral stsignedchar;
extern TypeIntegral stunsignedchar;
extern TypeIntegral stwchar;
extern TypeIntegral stsignedshort;
extern TypeIntegral stunsignedshort;
extern TypeIntegral stsignedint;
extern TypeIntegral stunsignedint;
extern TypeIntegral stsignedlong;
extern TypeIntegral stunsignedlong;
extern TypeIntegral stsignedlonglong;
extern TypeIntegral stunsignedlonglong;
extern TypeIntegral stfloat;
extern TypeIntegral stshortdouble;
extern TypeIntegral stdouble;
extern TypeIntegral stlongdouble;
extern TypeStruct stvectorunsignedchar;
extern TypeStruct stvectorsignedchar;
extern TypeStruct stvectorboolchar;
extern TypeStruct stvectorunsignedshort;
extern TypeStruct stvectorsignedshort;
extern TypeStruct stvectorboolshort;
extern TypeStruct stvectorunsignedlong;
extern TypeStruct stvectorsignedlong;
extern TypeStruct stvectorboollong;
extern TypeStruct stvectorfloat;
extern TypeStruct stvectorpixel;
extern TypeStruct stvector;
extern void CMach_Configure(void);
extern SInt32 CMach_GetQUALalign(UInt32 qual);
extern SInt32 CMach_ArgumentAlignment(Type *type);
extern SInt32 CMach_AllocationAlignment(Type *type, UInt32 qual);
extern CInt64 CMach_CalcIntDiadic(Type *type, CInt64 left, short op, CInt64 right);
extern CInt64 CMach_CalcIntMonadic(Type *type, short op, CInt64 val);
extern CInt64 CMach_CalcIntConvertFromFloat(Type *type, Float fval);
extern void CMach_InitIntMem(Type *type, CInt64 val, void *mem);
extern void CMach_InitVectorMem(Type *type, MWVector128 val, void *mem, Boolean flag);
extern Float CMach_CalcFloatDiadic(Type *type, Float left, short op, Float right);
extern Float CMach_CalcFloatMonadic(Type *type, short op, Float fval);
extern Boolean CMach_CalcFloatDiadicBool(Type *type, Float left, short op, Float right);
extern Boolean CMach_CalcVectorDiadicBool(Type *type, MWVector128 *left, short op, MWVector128 *right);
extern char *CMach_FloatScan(char *input, Float *result, Boolean *fail);
extern Float CMach_CalcFloatConvertFromInt(Type *type, CInt64 val);
extern Float CMach_CalcFloatConvert(Type *type, Float fval);
extern Boolean CMach_FloatIsZero(Float fval);
extern Boolean CMach_FloatIsOne(Float fval);
extern Boolean CMach_FloatIsNegOne(Float fval);
extern void CMach_InitFloatMem(Type *type, Float val, void *mem);
extern void CMach_PrintFloat(char *buf, Float val);
extern void CMach_PragmaParams(void);
extern void CMach_AdjustFuntionArgs(void);
extern SInt16 CMach_GetStructAlign(TypeStruct *tstruct);
extern SInt16 CMach_GetClassAlign(TypeClass *tclass);
extern SInt16 CMach_GetTypeAlign(Type *type);
extern SInt16 CMach_MemberAlignValue(Type *type, SInt32 var);
extern void CMach_StructLayoutInitOffset(SInt32 offset);
extern SInt32 CMach_StructLayoutGetCurSize(void);
extern SInt32 CMach_StructLayoutGetOffset(Type *type, UInt32 qual);
extern SInt32 CMach_StructLayoutBitfield(TypeBitfield *tbitfield, UInt32 qual);
extern UInt8 CMach_GetFunctionResultClass(TypeFunc *tfunc);
extern Boolean CMach_PassResultInHiddenArg(Type *type);
extern const char *CMach_GetCPU(void);
extern Boolean CMach_FloatIsPowerOf2(Float flt);
extern Float CMach_FloatReciprocal(Float flt);
extern SInt32 CMach_RoundedSizeOf(Object *object);
extern void CMach_ReInitRuntimeObjects(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -0,0 +1,35 @@
#ifndef COMPILER_CMANGLER_H
#define COMPILER_CMANGLER_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
extern HashNameNode *constructor_name_node;
extern HashNameNode *destructor_name_node;
extern HashNameNode *asop_name_node;
extern void CMangler_Setup(void);
extern HashNameNode *CMangler_BasicDtorName(void);
extern HashNameNode *CMangler_VBaseDtorName(void);
extern HashNameNode *CMangler_ArrayDtorName(void);
extern HashNameNode *CMangler_SDeleteDtorName(void);
extern HashNameNode *CMangler_DeleteDtorName(void);
extern char *CMangler_GetOperator(HashNameNode *opname);
extern HashNameNode *CMangler_OperatorName(short token);
extern HashNameNode *CMangler_VTableName(TypeClass *tclass);
extern HashNameNode *CMangler_RTTIObjectName(Type *type, UInt32 qual);
extern HashNameNode *CMangler_ThunkName(Object *obj, int a, int b, int c);
extern HashNameNode *CMangler_TemplateInstanceName(HashNameNode *basename, TemplArg *args);
extern void CMangler_MangleType(Type *type, UInt32 qual);
extern HashNameNode *CMangler_ConversionFuncName(Type *type, UInt32 qual);
extern HashNameNode *CMangler_GetCovariantFunctionName(Object *obj, Type *type);
extern HashNameNode *CMangler_GetLinkName(Object *obj);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

385
includes/compiler/CParser.h Normal file
View File

@@ -0,0 +1,385 @@
#ifndef COMPILER_CPARSER_H
#define COMPILER_CPARSER_H
#include "compiler/common.h"
#include "compiler/enode.h"
#include "compiler/tokens.h"
#include "compiler/types.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
enum {
AlignMode0_Mac68k,
AlignMode1_Mac68k4byte,
AlignMode2_PPC,
AlignMode3_1Byte,
AlignMode4_2Byte,
AlignMode5_4Byte,
AlignMode6_8Byte,
AlignMode7_16Byte,
AlignMode8_Packed
};
// not sure how many of these are char and how many are unsigned char or Boolean
typedef struct COpts {
Boolean little_endian;
Boolean codegen_dynamic;
Boolean codegen_pic;
Boolean no_common;
char no_implicit_templates;
char absolutepath; // determines the path written to debug info
char x06; // linker/objgen related
short cpu;
char schedule_cpu;
unsigned char schedule_mode; // may be an enum??
SInt32 debuglisting;
char profile;
char traceback;
Boolean disable_registers;
char fp_contract;
Boolean no_register_save_helpers;
char ppc_unroll_speculative;
short ppc_unroll_instructions_limit;
short ppc_unroll_factor_limit;
Boolean altivec_model;
UInt8 x1B; // altivec/vrsave related
UInt8 code_alignment;
char x1D;
UInt8 x1E; // some register used in TOC_use_isel
UInt8 gen_fsel;
char ppc_opt_bclr_bcctr;
Boolean use_lmw_stmw;
char report_heap_info;
char misaligned_mem_access;
char switch_tables;
char prepare_compress;
char some_alignment; // used in CMach_AllocationAlignment
Boolean asmsemicolcomment;
Boolean asmpoundcomment;
StringPtr oldprefixname;
short inlinelevel;
int inline_max_size;
int inline_max_total_size;
char inline_bottom_up;
Boolean cplusplus;
Boolean ecplusplus;
Boolean objective_c;
char objc_strict;
Boolean ARM_conform;
char ARM_scoping;
Boolean require_prototypes;
Boolean trigraphs;
Boolean only_std_keywords;
Boolean enumsalwaysint;
Boolean ANSI_strict;
Boolean mpwc_relax;
Boolean mpwc_newline;
Boolean ignore_oldstyle;
Boolean cpp_extensions;
Boolean pointercast_lvalue;
char useRTTI;
char delete_exception;
char _4B;
Boolean oldalignment;
Boolean unsignedchars;
Boolean multibyteaware;
char autoinline;
char defer_codegen;
Boolean direct_to_som;
char som_env_check;
char som_call_opt;
Boolean booltruefalse;
char old_enum_mangler;
Boolean longlong;
Boolean longlong_enums;
char no_tfuncinline;
char _59;
Boolean flat_include;
char syspath_once;
Boolean always_import;
char simple_class_byval;
Boolean wchar_type;
Boolean vbase_ctor_offset;
char vbase_abi_v2;
Boolean def_inherited;
char template_patch;
char template_friends;
char faster_pch_gen;
Boolean array_new_delete;
Boolean dollar_identifiers;
char def_inline_tfuncs;
char arg_dep_lookup;
Boolean simple_prepdump;
char line_prepdump;
char fullpath_prepdump;
char old_mtemplparser;
char suppress_init_code;
Boolean reverse_bitfields;
Boolean c9x;
Boolean float_constants;
Boolean no_static_dtors;
Boolean longlong_prepeval;
Boolean const_strings;
char dumpir;
char experimental;
Boolean gcc_extensions;
char stdc_fp_contract;
char stdc_fenv_access;
char stdc_cx_limitedr;
Boolean old_argmatch;
char optEH;
char optEH2;
Boolean new_mangler;
char microsoft;
Boolean warningerrors;
Boolean pedantic;
char check_header_flags;
Boolean supress_warnings;
Boolean warn_illpragma;
Boolean warn_emptydecl;
char warn_possunwant;
char warn_unusedvar;
char warn_unusedarg;
Boolean warn_extracomma;
char warn_hidevirtual;
Boolean warn_largeargs;
char warn_implicitconv;
char warn_notinlined;
Boolean warn_structclass;
Boolean warn_padding;
char warn_no_side_effect;
char warn_resultnotused;
char warn_ptr_int_conv;
char align_mode;
Boolean align_array_members;
Boolean dont_reuse_strings;
Boolean pool_strings;
Boolean explicit_zero_data;
Boolean readonly_strings;
Boolean exceptions;
char _99;
char dont_inline;
char always_inline;
Boolean peephole;
char global_optimizer;
char side_effects;
Boolean internal;
Boolean import;
Boolean export;
Boolean lib_export;
char nosyminline;
char force_active;
char optimizationlevel;
Boolean optimize_for_size;
char optimizewithasm;
Boolean crippled;
char opt_common_subs;
char opt_loop_invariants;
char opt_propagation;
char opt_dead_assignments;
char opt_strength_reduction;
char opt_strength_reduction_strict;
char opt_dead_code;
char opt_lifetimes;
char _B1; // unused?
char opt_unroll_loops;
char opt_vectorize_loops;
char _B4; // amount of IRO passes?
char opt_pointer_analysis;
char opt_pointer_analysis_mode;
char loop_unroll_count;
char loop_unroll_size_threshold;
Boolean isGeneratingDebugInfo;
CWDataType pchCreator;
CWDataType pchType;
CWDataType text;
HashNameNode *forcedSegment; // when set by #pragma segment
} COpts;
typedef struct ParserTryBlock {
struct ParserTryBlock *next;
jmp_buf jmpbuf;
NameSpace *cscope_current;
TypeClass *cscope_currentclass;
Object *cscope_currentfunc;
TemplStack *ctempl_curinstance;
TStreamElement *cerror_locktoken;
Boolean cscope_is_member_func;
} ParserTryBlock;
typedef struct CallbackAction {
struct CallbackAction *next;
Object *obj;
TypeClass *tclass;
} CallbackAction;
extern FileOffsetInfo cparser_fileoffset;
extern TStreamElement symdecltoken;
extern ParserTryBlock *trychain;
extern Boolean inassembler;
extern Boolean dont_set_references;
extern TypeStruct ptmstruct;
extern TypeStruct catchinfostruct;
extern Boolean in_assembler;
extern Boolean illegalimplicitconversion;
extern Boolean in_func_arglist;
extern NameSpaceName *newp_fobj;
extern NameSpaceName *newa_fobj;
extern NameSpaceName *delp_fobj;
extern NameSpaceName *dela_fobj;
extern Object *newh_func;
extern Object *delh_func;
extern Object *copy_func;
extern Object *clear_func;
extern Object *Rgtid_func;
extern Object *Rdync_func;
extern Object *rt_ptmf_cast;
extern Object *rt_ptmf_cmpr;
extern Object *rt_ptmf_test;
extern Object *rt_ptmf_call;
extern Object *rt_ptmf_scall;
extern Object *rt_ptmf_call4;
extern Object *rt_ptmf_scall4;
extern Object *rt_ptmf_null;
extern Object *rt_som_new;
extern Object *rt_som_newcheck;
extern Object *rt_som_check;
extern Object *rt_som_glue1;
extern Object *rt_som_glue2;
extern Object *rt_som_glue3;
extern Object *carr_func;
extern Object *cnar_func;
extern Object *darr_func;
extern Object *dnar_func;
extern Object *dnar3_func;
extern Object *Xgreg_func;
extern Object *Xthrw_func;
extern Object *Xicth_func;
extern Object *Xecth_func;
extern Object *Xunex_func;
extern COpts copts;
extern struct GList name_mangle_list;
extern HashNameNode *no_name_node;
extern HashNameNode *temp_argument_name;
extern HashNameNode *this_name_node;
extern HashNameNode *self_name_node;
extern HashNameNode *vptr_name_node;
extern CallbackAction *callbackactions;
extern Boolean fatalerrors;
extern Boolean anyerrors;
extern jmp_buf errorreturn;
extern char string[256];
extern SInt32 compilererrornum;
extern SInt32 compilererrfile;
extern SInt32 compilererrline;
extern Type sttemplexpr;
extern Type stillegal;
extern Type stvoid;
extern TypePointer void_ptr;
extern TypeFunc rt_func;
enum {
ATOM_VOID = 1,
ATOM_CHAR,
ATOM_UCHAR,
ATOM_WCHAR,
ATOM_SHORT,
ATOM_USHORT,
ATOM_INT,
ATOM_UINT,
ATOM_LONG,
ATOM_ULONG,
ATOM_LONGLONG,
ATOM_ULONGLONG,
ATOM_FLOAT,
ATOM_SHORTDOUBLE,
ATOM_DOUBLE,
ATOM_LONGDOUBLE
};
extern Object *CParser_NewRTFunc(Type *rettype, HashNameNode *name, Boolean flag, int argcount, ...);
extern Boolean CParser_IsPublicRuntimeObject(Object *obj);
extern Object *CParser_FindPublicRuntimeObject(HashNameNode *name);
extern Boolean CParser_ReInitRuntimeObjects(Boolean is_precompiler);
extern void CParser_Setup(void);
extern void CParser_Cleanup(void);
extern short GetPrec(short token);
extern Boolean CParser_ParseOperatorName(short *token, Boolean flag1, Boolean flag2);
extern SInt32 CParser_GetUniqueID(void);
extern void CParser_PrintUniqueID(char *buf);
extern void CParser_SetUniqueID(SInt32 id);
extern HashNameNode *CParser_GetUniqueName(void);
extern HashNameNode *CParser_NameConcat(char *a, char *b);
extern HashNameNode *CParser_AppendUniqueName(char *prefix);
extern HashNameNode *CParser_AppendUniqueNameFile(char *prefix);
extern Boolean IsTempName(HashNameNode *name);
extern void CParser_UpdateObject(Object *object, DeclInfo *declinfo);
extern Object *CParser_NewObject(DeclInfo *declinfo);
extern Object *CParser_NewLocalDataObject(DeclInfo *declinfo, Boolean add_to_locals);
extern Object *CParser_NewGlobalDataObject(DeclInfo *declinfo);
extern Object *CParser_NewCompilerDefDataObject(void);
extern Object *CParser_NewFunctionObject(DeclInfo *declinfo);
extern Object *CParser_NewCompilerDefFunctionObject(void);
extern Object *CParser_NewAliasObject(Object *object, SInt32 offset);
extern FuncArg *CParser_NewFuncArg(void);
extern Type *atomtype(void);
extern Object *CParser_FindDeallocationObject(Type *type, FuncArg *args, Boolean flag1, Boolean flag2, Boolean *outflag);
extern short is_memberpointerequal(Type *a, Type *b);
extern short is_typeequal(Type *a, Type *b);
extern short iscpp_typeequal(Type *a, Type *b);
extern short CParser_CompareArgLists(FuncArg *a, FuncArg *b);
extern Boolean is_arglistsame(FuncArg *a, FuncArg *b);
extern short is_typesame(Type *a, Type *b);
extern Type *CParser_GetBoolType(void);
extern Type *CParser_GetWCharType(void);
extern short CParser_GetOperator(ENodeType t);
extern Boolean CParser_IsMoreCVQualified(UInt32 a, UInt32 b);
extern Boolean CParser_IsSameOrMoreCVQualified(UInt32 a, UInt32 b);
extern Boolean is_unsigned(Type *type);
extern StructMember *ismember(TypeStruct *tstruct, HashNameNode *name);
extern void appendmember(TypeStruct *tstruct, StructMember *member);
extern Boolean isdeclaration(UInt8 flag1, UInt8 flag2, UInt8 flag3, short token);
extern Boolean islookaheaddeclaration(void);
extern Type *CParser_ParseTypeID(UInt32 *qual, Boolean *flag);
extern Boolean CParser_TryFuncDecl(void);
extern Boolean CParser_TryParamList(Boolean flag);
extern Type *CParser_RemoveTopMostQualifiers(Type *type, UInt32 *qual);
extern UInt32 CParser_GetTypeQualifiers(Type *type, UInt32 qual);
extern UInt32 CParser_GetCVTypeQualifiers(Type *type, UInt32 qual);
extern Boolean CParser_IsConst(Type *type, UInt32 qual);
extern Boolean CParser_IsVolatile(Type *type, UInt32 qual);
extern Boolean is_const_object(Object *obj);
extern Boolean is_volatile_object(Object *obj);
extern Boolean CParserIsConstExpr(ENode *expr);
extern Boolean CParserIsVolatileExpr(ENode *expr);
extern Boolean CParser_HasInternalLinkage(Object *obj);
extern Boolean CParser_HasInternalLinkage2(Object *obj);
extern Boolean CParser_IsVirtualFunction(Object *obj, TypeClass **tclass, SInt32 *index);
extern Boolean is_pascal_object(Object *obj);
extern Boolean is_cfm_type(Type *type);
extern Boolean CParser_IsVTableObject(Object *obj);
extern void TypedefDeclInfo(DeclInfo *declinfo, Type *type, UInt32 qual);
extern void CParser_ParseAttribute(Type *type, DeclInfo *declinfo);
extern void CParser_ParseDeclSpec(DeclInfo *declinfo, Boolean flag);
extern Boolean CParser_CheckTemplateClassUsage(TemplClass *tmclass, Boolean flag);
extern void CParser_GetDeclSpecs(DeclInfo *di, Boolean flag);
extern void CParser_RegisterNonGlobalClass(TypeClass *tclass);
extern void CParser_RegisterSingleExprFunction(Object *func, ENode *expr);
extern void CParser_RegisterDummyCtorFunction(Object *func, Object *obj);
extern Boolean CParser_IsAnonymousUnion(DeclInfo *di, Boolean flag);
extern void CParser_CheckAnonymousUnion(DeclInfo *di, Boolean flag);
extern void CParser_NewCallBackAction(Object *obj, TypeClass *tclass);
extern void CParser_NewClassAction(TypeClass *tclass);
extern void CParser_CallBackAction(Object *obj);
extern Object *CParser_ParseObject(void);
extern void CParser_ParseGlobalDeclaration(void);
extern void cparser(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

122
includes/compiler/CPrep.h Normal file
View File

@@ -0,0 +1,122 @@
#ifndef COMPILER_CPREP_H
#define COMPILER_CPREP_H
#include "compiler/common.h"
#include "compiler/tokens.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct Macro {
struct Macro *next;
HashNameNode *name;
void *c;
unsigned short xC;
Boolean is_special;
Boolean xF;
void *e;
} Macro;
typedef struct TokenStack {
char *pos;
char *macrostart;
Macro *macro;
Boolean macrocheck;
} TokenStack;
extern CParams *cparamblkptr;
extern short tk;
extern CInt64 tkintconst;
extern Float tkfloatconst;
extern char *tkstring;
extern HashNameNode *tkidentifier;
extern SInt32 tksize;
extern short ispascalstring;
extern short nlflag;
extern SInt32 lines;
extern Boolean spaceskip;
extern struct Macro **macrohashtable;
extern Boolean cprep_nomem_exit;
extern Boolean cprep_nostring;
extern Boolean cprep_eoltokens;
extern TokenStack tokenstack[128];
extern short tokenstacklevel;
extern CPrepFileInfo *cprep_cursymfile;
extern char *pos;
extern char *macropos;
extern char *nextcharpos;
extern unsigned char CPrep_SkipNewCommentChar;
extern Boolean preprocessing_only;
extern Handle stringmem;
extern SInt32 maxstringsize;
extern char cprep_idarray[256];
extern Boolean was_escchar;
extern Boolean macrocheck;
extern Boolean widestring;
extern Boolean at_linestart;
extern char *prep_file_start;
extern char *prep_file_end;
extern char *macrostart;
extern Boolean cprep_strconcat;
extern CPrepFileInfo *prep_file;
extern short filesp;
extern SInt32 linenumber;
extern struct GList pplist;
extern TStreamElement *ts_current;
extern SInt32 ts_preread_elements;
extern void CPrep_InsertSpecialMacro(Macro *macro, char *name);
extern void CPrep_InsertSpecialMacros(void);
extern void CPrep_RemoveSpecialMacros(void);
extern Boolean setupprep(void);
extern void cleanupprep(void);
extern void CPrep_TSBufferGrow(int amount);
extern void CPrep_TokenStreamGetState(SInt32 *state);
extern void CPrep_TokenStreamSetState(SInt32 *state);
extern void CPrep_UnLex(void);
extern void CPrep_TokenStreamSetCurState(SInt32 *state);
typedef void (*CPrepStreamFuncPtr)(TStreamElement *);
extern void CPrep_StreamGetBlock(TStream *stream, CPrepStreamFuncPtr func, int arg);
extern void CPrep_StreamGetSemicolon(TStream *stream, CPrepStreamFuncPtr func);
extern void CPrep_StreamGetTemplate(TStream *stream, CPrepStreamFuncPtr func);
extern void CPrep_StreamInsert(TStream *stream, SInt32 *state);
extern void CPrep_StreamRemove(TStream *stream, SInt32 *state);
extern void CPrep_RemoveTokens(SInt32 amount);
extern void CPrep_TokenStreamFlush(void);
extern TStreamElement *CPrep_CurStreamElement(void);
extern void CPrep_GetTokenContext(TStreamElement *token, CPrepFileInfo **tokenfile, SInt32 *selectionoffset, short *tokensize, SInt32 *linenumber, char *buf1, short *tokenoffset, short *tokenlength, char *buf2, short *lastarg);
extern void CPrep_Error(short code);
extern void CPrep_ErrorName(short code, const char *name);
extern void CPrep_Warning(short code);
extern void CPrep_WarningName(short code, const char *name);
extern void CPrep_ErrorMessage(int errTable, char *str, Boolean flag1, Boolean flag2);
extern void CPrep_ErrorMessageVA(int code, const char *format, va_list list, Boolean flag1, Boolean flag2);
extern void popfile(void);
extern void CPrep_SetSourceFile(FileOffsetInfo *foi);
extern HashNameNode *CPrep_GetSourceFilePath(CPrepFileInfo *fileinfo);
extern void CPrep_NewFileOffsetInfo(FileOffsetInfo *foi, TStreamElement *ts);
extern SInt32 CPrep_GetFileOffsetInfo(FileOffsetInfo *foi);
extern void CPrep_GetFileOffsetInfo2(FileOffsetInfo *foi, SInt32 *pLine, HashNameNode **pName);
extern void CPrep_ResetFileInfo(FileOffsetInfo *foi);
extern void CPrep_GetPrepPos(CPrepFileInfo **file, SInt32 *ppos);
extern UInt8 C_Compiler(CParams *param);
extern void poptokenseq(void);
extern void foundnl(void);
extern void newline(void);
extern short notendofline(void);
extern char *CPrep_GetFileName(char *buffer, Boolean flag1, Boolean flag2);
extern Boolean macrotest(void);
extern short CPrep_PragmaLex(Boolean no_err);
extern void CPrep_PushOption(SInt32 id, char value);
extern void CPrep_PopOption(SInt32 id);
extern void preprocessor(void);
extern SInt32 CPrep_BrowserTokenOffset(FileOffsetInfo *foi);
extern SInt32 CPrep_BrowserFileOffset(void);
extern void CPrep_BrowserFilePosition(CPrepFileInfo **fileinfo, SInt32 *offset);
extern CPrepFileInfo *CPrep_BrowserCurrentFile(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -0,0 +1,32 @@
#ifndef COMPILER_CPREPTOKENIZER_H
#define COMPILER_CPREPTOKENIZER_H
#include "compiler/common.h"
#include "compiler/tokens.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
extern short prepskipnextchar(void);
extern short prepnextchar(void);
extern short prepnextstringchar(char *str, Boolean flag);
extern void CPrep_MatchChar(char ch, Boolean flag);
extern char *CPrep_MatchChar2(char *start, char ch, Boolean flag);
extern short prepcurchar(void);
extern char *ReadIdentifier(char *p);
extern char *CPrep_SkipNewComment(char *str);
extern Boolean skipendoflinematch(char *str, short token);
extern void skipendofline(void);
extern void CPrep_SkipAsmComment(void);
extern short lookahead(void);
extern short lookahead_noeol(void);
extern short lex(void);
extern short plex(void);
extern short lexidentifier(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

107
includes/compiler/CScope.h Normal file
View File

@@ -0,0 +1,107 @@
#ifndef COMPILER_CSCOPE_H
#define COMPILER_CSCOPE_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
extern Boolean cscope_is_member_func;
extern Object *cscope_currentfunc;
extern TypeClass *cscope_currentclass;
extern NameSpace *cscope_current;
extern NameSpace *cscope_root;
typedef struct CScopeSave {
NameSpace *current;
TypeClass *currentclass;
Object *currentfunc;
Boolean is_member_func;
} CScopeSave; // assumed name
typedef struct CScopeParseResult {
NameSpace *nspace_0;
HashNameNode *name_4;
Type *x8;
UInt32 xC; // qual
ObjBase *obj_10;
NameSpaceObjectList *nsol_14;
BClassList *bcl_18;
Boolean x1C;
Boolean x1D;
Boolean isambig;
Boolean x1F;
Boolean x20;
Boolean x21;
} CScopeParseResult;
typedef struct CScopeNSIterator {
NameSpace *nspace;
NameSpaceLookupList *lookup;
CScopeParseResult *result;
} CScopeNSIterator;
typedef struct CScopeObjectIterator {
NameSpace *nspace;
NameSpaceName *nextname;
NameSpaceObjectList *currlist;
int hashindex;
} CScopeObjectIterator;
extern void CScope_Setup(void);
extern void CScope_Cleanup(void);
extern void CScope_GetScope(CScopeSave *save);
extern void CScope_SetNameSpaceScope(NameSpace *nspace, CScopeSave *save);
extern void CScope_SetClassScope(TypeClass *cls, CScopeSave *save);
extern void CScope_SetClassDefScope(TypeClass *cls, CScopeSave *save);
extern void CScope_SetFunctionScope(Object *function, CScopeSave *save);
extern void CScope_SetMethodScope(Object *function, TypeClass *cls, Boolean unknownFlag, CScopeSave *save);
extern void CScope_RestoreScope(CScopeSave *saved);
extern Boolean CScope_IsEmptySymTable(void);
extern Boolean CScope_IsInLocalNameSpace(NameSpace *nspace);
extern NameSpaceObjectList *CScope_FindName(NameSpace *nspace, HashNameNode *name);
extern NameSpaceName *CScope_FindNameSpaceName(NameSpace *nspace, HashNameNode *name);
extern NameSpaceObjectList *CScope_InsertName(NameSpace *nspace, HashNameNode *name);
extern NameSpaceObjectList *CScope_ArgumentDependentNameLookup(NameSpaceObjectList *list, HashNameNode *name, ENodeList *argNodes, Boolean flag);
extern NameSpace *CScope_NewHashNameSpace(HashNameNode *name);
extern NameSpace *CScope_NewListNameSpace(HashNameNode *name, Boolean is_global);
extern NameSpace *CScope_FindNonClassNonFunctionNS(NameSpace *nspace);
extern NameSpace *CScope_FindGlobalNS(NameSpace *nspoce);
extern Boolean CScope_IsStdNameSpace(NameSpace *nspace);
extern Boolean CScope_IsEmptyNameSpace(NameSpace *nspace);
extern void CScope_MergeNameSpace(NameSpace *dst, NameSpace *src);
extern void CScope_AddObject(NameSpace *nspace, HashNameNode *name, ObjBase *obj);
extern void CScope_AddGlobalObject(Object *obj);
extern NameSpaceLookupList *CScope_BuildNameSpaceLookupList(NameSpace *nspace);
extern Boolean CScope_FindQualifiedClassMember(CScopeParseResult *result, TypeClass *tclass, HashNameNode *name);
extern Type *CScope_GetType(NameSpace *nspace, HashNameNode *name, UInt32 *qual);
extern Type *CScope_GetTagType(NameSpace *nspace, HashNameNode *name);
extern Boolean CScope_ParseExprName(CScopeParseResult *result);
extern Boolean CScope_ParseDeclName(CScopeParseResult *result);
extern Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1, Boolean flag2);
extern Boolean CScope_ParseElaborateName(CScopeParseResult *result);
extern Boolean CScope_FindObject(NameSpace *nspace, CScopeParseResult *result, HashNameNode *name);
extern Boolean CScope_FindNonClassObject(NameSpace *nspace, CScopeParseResult *result, HashNameNode *name);
extern NameSpaceObjectList *CScope_FindObjectList(CScopeParseResult *result, HashNameNode *name);
extern Boolean CScope_PossibleTypeName(HashNameNode *name);
extern Boolean CScope_FindClassMemberObject(TypeClass *tclass, CScopeParseResult *result, HashNameNode *name);
extern void CScope_InitObjectIterator(CScopeObjectIterator *iterator, NameSpace *nspace);
extern ObjBase *CScope_NextObjectIteratorObject(CScopeObjectIterator *iterator);
extern NameSpaceObjectList *CScope_NextObjectIteratorObjectList(CScopeObjectIterator *iterator);
extern void CScope_DefineTypeTag(NameSpace *nspace, HashNameNode *name, Type *type);
extern Type *CScope_GetLocalTagType(NameSpace *nspace, HashNameNode *name);
extern Boolean CScope_FindTypeName(NameSpace *nspace, HashNameNode *name, CScopeParseResult *result);
extern NameSpaceObjectList *CScope_GetLocalObject(NameSpace *nspace, HashNameNode *name);
extern BClassList *CScope_GetClassAccessPath(BClassList *list, TypeClass *tclass);
extern Boolean CScope_ParseMemberName(TypeClass *tclass, CScopeParseResult *result, Boolean flag);
extern void CScope_AddClassUsingDeclaration(TypeClass *tclass, TypeClass *tclass2, HashNameNode *name, AccessType access);
extern void CScope_ParseUsingDeclaration(NameSpace *nspace, short access, Boolean flag);
extern void CScope_ParseNameSpaceAlias(HashNameNode *name);
extern void CScope_ParseUsingDirective(NameSpace *nspace);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -0,0 +1,79 @@
#ifndef COMPILER_CODEGEN_H
#define COMPILER_CODEGEN_H
#include "compiler/common.h"
#include "compiler/CPrep.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
extern Macro vecM;
extern Macro altivecM;
extern Object *gFunction;
extern PCodeLabel *returnlabel;
extern PCodeLabel *cleanreturnlabel;
extern Boolean needs_cleanup;
extern Statement *current_statement;
extern int has_catch_blocks;
extern int disable_optimizer;
extern SInt32 current_linenumber;
extern Boolean has_altivec_arrays;
extern short high_reg;
extern short low_reg;
extern short high_offset;
extern short low_offset;
extern short low_reg2;
extern short high_reg2;
extern PCodeLabel *pic_base_pcodelabel;
extern Object *dyld_stub_binding_helper;
extern Object *rt_cvt_fp2unsigned;
extern Object *rt_profile_entry;
extern Object *rt_profile_exit;
extern Object *rt_div2i;
extern Object *rt_div2u;
extern Object *rt_mod2i;
extern Object *rt_mod2u;
extern Object *rt_shr2i;
extern Object *rt_shr2u;
extern Object *rt_shl2i;
extern Object *rt_cvt_ull_dbl;
extern Object *rt_cvt_sll_dbl;
extern Object *rt_cvt_ull_flt;
extern Object *rt_cvt_sll_flt;
extern Object *rt_cvt_dbl_usll;
extern VarInfo *CodeGen_GetNewVarInfo(void);
extern Object *maketemporary(Type *type);
typedef void (*ArgumentProcessor)(Object *obj, short reg);
extern void process_arguments(ArgumentProcessor func, Boolean flag);
extern void move_assigned_argument(Object *obj, short reg);
extern void assign_labels();
extern void CodeGen_Generator();
extern void CodeGen_GenVDispatchThunk();
extern void CodeGen_SetupRuntimeObjects();
extern Boolean CodeGen_ReInitRuntimeObjects(Boolean is_precompiler);
extern Boolean CodeGen_IsPublicRuntimeObject(Object *obj);
extern void CodeGen_SOMStub();
extern void CodeGen_ParseDeclSpec(HashNameNode *identifier, DeclInfo *declinfo);
extern void CodeGen_ParsePragma(HashNameNode *name);
extern void CodeGen_UpdateObject(Object *object);
extern void CodeGen_UpdateBackEndOptions();
extern void CodeGen_objc_method_self_offset();
extern void CodeGen_objc_method_sel_offset();
extern void CodeGen_objc_method_arg_offset();
extern void CodeGen_objc_method_args_size();
extern void CodeGen_HandleIntrinsicCall();
extern void CodeGen_HandleTypeCast();
extern short CodeGen_AssignCheck(ENode *expr, Type *type, Boolean flag1, Boolean flag2);
extern void CodeGen_CollapseVectorExpression();
extern void CodeGen_InsertSpecialMacros();
extern char *CodeGen_ExpandSpecialMacro(Macro *macro);
extern void CodeGen_reportheapinfo();
extern void CodeGen_InitialSanityCheck();
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -0,0 +1,85 @@
#ifndef COMPILER_OPERANDS_H
#define COMPILER_OPERANDS_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
extern Float one_point_zero;
enum OperandType {
// Value in a register (identified by 'reg')
OpndType_GPR = 0,
// Uses 'reg', 'object, 'immOffset'
OpndType_GPR_ImmOffset = 1,
// Uses 'reg', 'regOffset'
OpndType_GPR_Indexed = 2,
// Value in two registers (identified by 'reg' and 'regHi')
OpndType_GPRPair = 3,
// Value at an absolute address (identified by 'abs_address')
OpndType_Absolute = 4,
// Value in a float register (identified by 'reg')
OpndType_FPR = 5,
// Value in a vector register (identified by 'reg')
OpndType_VR = 6,
// Condition value: 'reg' stores which condition register, and 'regOffset' is equal to ENOTEQU, EEQU, EGREATEREQU,
// ELESS, ELESS or ELESSEQU
OpndType_CRField = 7,
// Value of a symbol (identified by 'object')
OpndType_Symbol = 8,
// Reference to a location (at 'reg', offset using 'object' and 'immOffset')
OpndType_IndirectGPR_ImmOffset = 9,
// Reference to a location (at 'reg', offset using the value of register 'regOffset')
OpndType_IndirectGPR_Indexed = 0xA,
// Reference to a symbol (identified by 'object')
OpndType_IndirectSymbol = 0xB
};
// These are probably the same as the PCode Flags and can be unified?
enum {
OpndFlags_Const = 0x40,
OpndFlags_Volatile = 0x80
};
struct Operand {
enum OperandType optype;
SInt16 reg;
SInt16 regHi;
SInt16 regOffset;
SInt32 immOffset;
SInt32 abs_address;
Object *object;
UInt32 flags;
};
extern void load_immediate(short reg, SInt32 value);
extern void symbol_operand(Operand *op, Object *obj);
extern void indirect(Operand *op, ENode *expr);
extern void combine(Operand *opA, Operand *opB, short output_reg, Operand *opOut);
extern void coerce_to_addressable(Operand *op);
extern void Coerce_to_register(Operand *op, Type *type, short output_reg);
extern void coerce_to_register_pair(Operand *op, Type *type, short output_reg, short output_regHi);
extern void Coerce_to_fp_register(Operand *op, TypeIntegral *tint, short output_reg);
extern void Coerce_to_v_register(Operand *op, TypeStruct *tstruct, short output_reg);
extern void store(short reg, Operand *op, Type *type);
extern void store_pair(short reg, short regHi, Operand *op, Type *type);
extern void store_fp(short reg, Operand *op, TypeIntegral *tint);
extern void store_v(short reg, Operand *op, TypeStruct *tstruct);
extern void extend32(Operand *op, Type *type, short output_reg);
extern void extend64(Operand *op, Type *type, short output_reg, short output_regHi);
extern void load_floating_constant(short reg, TypeIntegral *type, double *data);
extern void convert_integer_to_floating(Operand *op, Boolean is_single, short output_reg);
extern void convert_unsigned_to_floating(Operand *op, Boolean is_single, short output_reg);
extern void convert_floating_to_integer(Operand *op, short output_reg);
extern void convert_floating_to_unsigned(Operand *op, short output_reg);
extern void extract_bitfield(Operand *input_op, TypeBitfield *tbitfield, short output_reg, Operand *output_op);
extern void insert_bitfield(short reg, Operand *op, TypeBitfield *tbitfield);
extern void load_address(short dest_reg, Operand *op);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

194
includes/compiler/PCode.h Normal file
View File

@@ -0,0 +1,194 @@
#ifndef COMPILER_PCODE_H
#define COMPILER_PCODE_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
#define PCODE_FLAG_SET_T(pcode) (((pcode)->flags & (fPCodeFlag1 | fPCodeFlag8)) ? (pcode)->flags : 0)
#define PCODE_FLAG_SET_F(pcode) (((pcode)->flags & (fPCodeFlag1 | fPCodeFlag8)) ? 0 : (pcode)->flags)
enum {
EffectRead = 1,
EffectWrite = 2
};
typedef enum {
PCOp_REGISTER,
PCOp_SYSREG,
PCOp_IMMEDIATE,
PCOp_MEMORY,
PCOp_LABEL,
PCOp_LABELDIFF,
PCOp_PLACEHOLDEROPERAND
} PCOpKind;
typedef enum {
RefType_0,
RefType_1,
RefType_2,
RefType_3,
RefType_4,
RefType_5,
RefType_6,
RefType_7,
RefType_8,
RefType_9,
RefType_A,
RefType_B,
RefType_C,
RefType_D
} PCRefType;
struct PCodeArg {
PCOpKind kind;
char arg;
union {
struct {
unsigned short effect;
short reg;
} reg;
struct {
SInt32 value;
Object *obj;
} imm;
struct {
SInt32 offset;
Object *obj;
} mem;
struct {
PCodeLabel *label;
} label;
struct {
SInt16 offset;
PCodeLabel *labelA;
PCodeLabel *labelB;
} labeldiff;
unsigned char placeholder[10]; // keep the size
} data;
};
struct PCode {
PCode *nextPCode;
PCode *prevPCode;
PCodeBlock *block;
unsigned int xx_C;
unsigned int _10;
int flags;
void *_18;
SInt32 sourceoffset;
short op;
short argCount;
PCodeArg args[0];
};
struct PCodeLabel {
PCodeLabel *nextLabel;
PCodeBlock *block;
short resolved;
short index;
};
typedef struct _PCLink {
struct _PCLink *nextLink;
struct PCodeBlock *block;
} PCLink;
struct PCodeBlock {
struct PCodeBlock *nextBlock;
struct PCodeBlock *prevBlock;
PCodeLabel *labels;
PCLink *predecessors;
PCLink *successors;
PCode *firstPCode;
PCode *lastPCode;
int blockIndex;
int codeOffset; // in bytes
int loopWeight;
short pcodeCount;
unsigned short flags;
};
/* PCode Flags */
enum {
fPCodeFlag1 = 1,
fPCodeFlag2 = 2,
fPCodeFlag4 = 4,
fPCodeFlag8 = 8,
fPCodeFlag10 = 0x10,
fPCodeFlag20 = 0x20,
// Always valid
fIsConst = 0x40,
fIsVolatile = 0x80,
fSideEffects = 0x100,
fPCodeFlag200 = 0x200, // ?
fPCodeFlag400 = 0x400, // ?
fPCodeFlag800 = 0x800, // ?
fPCodeFlag1000 = 0x1000, // ?
fCommutative = 0x2000,
fIsCSE = 0x4000,
fPCodeFlag8000 = 0x8000,
fPCodeFlag20000 = 0x20000, // ?
fPCodeFlag40000 = 0x40000, // ?
// Set 1 only
fLink = 0x1000000,
fBranchNotTaken = 0x4000000,
fBranchTaken = 0x8000000,
fAbsolute = 0x10000000,
// Set 2 only
fIsPtrOp = 0x20,
fOverflow = 0x800000,
fSetsCarry = 0x10000000,
// ??
fPCodeFlag8000000 = 0x8000000,
fPCodeFlag10000000 = 0x10000000,
fPCodeFlag20000000 = 0x20000000,
fPCodeFlag40000000 = 0x40000000,
fPCodeFlag80000000 = 0x80000000
};
enum {
fPCBlockFlag1 = 1, // prologue
fPCBlockFlag2 = 2, // epilogue
fPCBlockFlag4 = 4,
fPCBlockFlag8 = 8,
fPCBlockFlag10 = 0x10,
fPCBlockFlag20 = 0x20,
fPCBlockFlag4000 = 0x4000
};
extern PCodeBlock *pcbasicblocks;
extern PCodeBlock *pclastblock;
extern PCodeBlock *prologue;
extern PCodeBlock *epilogue;
extern PCodeBlock **depthfirstordering;
extern int pcblockcount;
extern int pcloopweight;
extern void initpcode();
extern PCode *makepcode(short op, ...);
extern void emitpcode(short op, ...);
extern PCode *copypcode(PCode *pcode);
extern PCodeLabel *makepclabel();
extern PCodeBlock *makepcblock();
extern void pclabel(PCodeBlock *block, PCodeLabel *label);
extern void pcbranch(PCodeBlock *block, PCodeLabel *label);
extern void pccomputepredecessors();
extern void deleteblock(PCodeBlock *block);
extern void deleteunreachableblocks();
extern void appendpcode(PCodeBlock *block, PCode *pcode);
extern void deletepcode(PCode *pcode);
extern void insertpcodebefore(PCode *anchor, PCode *newpcode);
extern void insertpcodeafter(PCode *anchor, PCode *newpcode);
extern void setpcodeflags(int flags);
extern void clearpcodeflags(int flags);
extern int pccomputeoffsets();
extern void computedepthfirstordering();
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,23 @@
#ifndef COMPILER_PCODEUTILITIES_H
#define COMPILER_PCODEUTILITIES_H
#include "compiler/common.h"
extern void pcsetrecordbit(PCode *pc);
extern void pcsetsideeffects(PCode *pc);
extern void pcsetlinkbit(PCode *pc);
extern void branch_label(PCodeLabel *label);
extern void branch_conditional(short a, short compareop, short c, PCodeLabel *label);
extern void branch_always(PCodeLabel *label);
extern void branch_decrement_always(short opcode, PCodeLabel *label);
extern void branch_indirect(Object *obj);
extern int branch_count_volatiles(void);
extern PCodeArg *branch_record_volatiles(PCodeArg *arglist, UInt32 *masks);
extern void branch_subroutine(Object *obj, short add_nop, UInt32 *masks);
extern void branch_subroutine_ctr(UInt32 *masks);
extern void add_immediate(short dest_reg, short base_reg, Object *obj, short offset);
extern PCode *add_immediate_lo(short dest_reg, short base_reg, Object *obj, short offset, char add_to_block);
extern PCode *op_absolute_ha(short dest_reg, short base_reg, Object *obj, short offset, char add_to_block);
extern void load_store_register(short opcode, short dest_reg, short base_reg, Object *obj, SInt32 offset);
#endif

View File

@@ -0,0 +1,60 @@
#ifndef COMPILER_STACKFRAME_H
#define COMPILER_STACKFRAME_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
enum ObjClass {
ObjClass0,
ObjClass1,
ObjClass2,
ObjClassMax
};
extern Boolean requires_frame;
extern Boolean makes_call;
extern Boolean uses_globals;
extern Boolean dynamic_stack;
extern Boolean large_stack;
extern Object *dummyvaparam;
extern void *dummyprofiler;
extern void init_stack_globals(void);
extern void init_frame_sizes(void);
extern void assign_local_memory(Object *obj);
extern void assign_locals_to_memory(ObjectList *first);
extern void compute_frame_sizes(void);
extern void generate_prologue(PCodeBlock *block);
extern void generate_epilogue(PCodeBlock *block, Boolean add_blr);
extern void allocate_dynamic_stack_space(Boolean flag1, int reg1, int reg2, SInt32 size);
extern char *generate_traceback(SInt32 funcsize, char *funcname, SInt32 *tbsize, Object *func);
extern void check_dynamic_aligned_frame(void);
extern void move_varargs_to_memory(void);
extern void assign_arguments_to_memory(Object *func, UInt8 mysteryFlag, Boolean hasVarargs);
extern SInt32 set_out_param_displ(SInt32 a, Type *type, Boolean flag, SInt32 *outvar, SInt32 b);
extern SInt32 out_param_displ_to_offset(SInt32 displ);
extern Boolean needs_frame(void);
extern void update_out_param_size(SInt32 size);
extern void estimate_out_param_size(SInt32 size);
extern void update_out_param_align(SInt32 align);
extern void update_in_param_align(SInt32 align);
extern void update_frame_align(SInt32 align);
extern SInt32 local_offset_32(Object *obj);
extern SInt16 local_offset_lo(Object *obj, SInt32 offset);
extern SInt16 local_offset_ha(Object *obj, SInt32 offset);
extern SInt16 local_offset_16(Object *obj);
extern Boolean local_is_16bit_offset(Object *obj);
extern int local_base_register(Object *obj);
extern Boolean is_large_frame(void);
extern void no_frame_for_asm(void);
extern Boolean can_add_displ_to_local(Object *obj, SInt32 displ);
extern SInt32 get_alloca_alignment(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

60
includes/compiler/TOC.h Normal file
View File

@@ -0,0 +1,60 @@
#ifndef COMPILER_TOC_H
#define COMPILER_TOC_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct CodeLabelList {
struct CodeLabelList *next;
Object *object;
CLabel *label;
} CodeLabelList;
extern ObjectList *toclist;
extern ObjectList *exceptionlist;
extern void *descriptorlist;
extern void *floatconstpool;
extern void *doubleconstpool;
extern ObjectList *floatconstlist;
extern void *vectorconstpool;
extern ObjectList *vectorconstlist;
extern Object toc0;
extern Boolean no_descriptors;
extern Object pic_base;
extern VarInfo pic_base_varinfo;
extern short pic_base_reg;
extern CodeLabelList *codelabellist;
extern void setupaddressing(void);
extern void createNonLazyPointer(Object *obj);
extern void referenceIndirectPointer(Object *obj);
extern Object *createIndirect(Object *obj, Boolean flag1, Boolean flag2);
extern Object *createfloatconstant(Type *type, Float *data);
extern Object *createvectorconstant(Type *type, MWVector128 *data);
extern void DeclarePooledConstants();
extern Object *CreateFloatConst(Type *type, Float *data, SInt32 *unkptr);
extern void dumpcodelabels(Object *func);
typedef struct COVCResult {
// this struct might be used in other places too???
short op1;
short op2;
unsigned char arg;
} COVCResult;
extern Boolean canoptimizevectorconst(MWVector128 *vecp, Type *type, COVCResult *result);
extern Boolean TOC_use_fsel(ENode *expr);
extern Boolean TOC_use_isel(ENode *expr, Boolean flag);
extern SInt32 GetSizeSkip(ENode *expr);
extern void Optimize64bitMath(ENode *expr);
extern void expandTOCreferences(Statement **stmts);
extern void resetTOCvarinfo(void);
extern Boolean needdescriptor(void);
extern Object *createstaticinitobject(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -94,27 +94,34 @@ typedef enum Section {
SECT_MW_SWITCH = 30,
SECT_8BYTE_LITERALS = 31,
SECT_4BYTE_LITERALS = 32,
// one of these next 2 is missing in pro7
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
SECT_CONST = 34,
SECT_CONST_PTR = 35,
// everything after here is known ok
SECT_NONLAZY_PTRS = 36,
SECT_COMMON_VARS = 37,
SECT_16BYTE_LITERALS = 38,
SECT_TEXT_COALESCE = 39,
SECT_DATA_COALESCE = 40,
SECT_UDATA_COALESCE = 41,
SECT_CONST_COALESCE = 42,
SECT_CONST_PTR_COALESCE = 43,
SECT_CSTR_COALESCE = 44,
N_SECTIONS = 45
} Section;
typedef struct BClassList BClassList;
typedef struct CI_FuncData CI_FuncData;
typedef struct CLabel CLabel;
typedef struct ClassList ClassList;
typedef struct CParams CParams;
typedef struct DeclInfo DeclInfo;
typedef struct DeclThing DeclThing; // rename me please
typedef struct DefArgCtorInfo DefArgCtorInfo;
typedef struct DepName DepName;
typedef struct EMemberInfo EMemberInfo;
typedef struct ENode ENode;
typedef struct ENodeList ENodeList;
typedef struct ExceptionAction ExceptionAction;
@@ -139,6 +146,11 @@ typedef struct Object Object;
typedef struct ObjectList ObjectList;
typedef struct ObjCInfo ObjCInfo;
typedef struct ObjCMethod ObjCMethod;
typedef struct Operand Operand;
typedef struct PackedDeclInfo PackedDeclInfo;
typedef struct PCode PCode;
typedef struct PCodeArg PCodeArg;
typedef struct PCodeBlock PCodeBlock;
typedef struct PCodeLabel PCodeLabel;
typedef struct PointsToFunction PointsToFunction;
typedef struct PTFList PTFList;
@@ -166,6 +178,7 @@ typedef struct TypeClass TypeClass;
typedef struct TypeEnum TypeEnum;
typedef struct TypeFunc TypeFunc;
typedef struct TypeIntegral TypeIntegral;
typedef struct TypeList TypeList;
typedef struct TypeMemberPointer TypeMemberPointer;
typedef struct TypeMethod TypeMethod;
typedef struct TypePointer TypePointer;
@@ -173,6 +186,7 @@ typedef struct TypeStruct TypeStruct;
typedef struct TypeTemplDep TypeTemplDep;
typedef struct VarInfo VarInfo;
typedef struct VarRecord VarRecord;
typedef struct VClassList VClassList;
// Common bits for templates
typedef enum TemplParamType {
@@ -262,7 +276,12 @@ enum {
Q_BYCOPY = 0x2000,
Q_BYREF = 0x4000,
Q_ONEWAY = 0x8000,
Q_10000 = 0x10000,
Q_20000 = 0x20000,
Q_OVERLOAD = 0x40000, // weak
Q_80000 = 0x80000,
Q_RESTRICT = 0x200000,
Q_1000000 = 0x1000000,
Q_ALIGNED_1 = 0x2000000,
Q_ALIGNED_2 = 0x4000000,
Q_ALIGNED_4 = 0x6000000,
@@ -280,4 +299,42 @@ enum {
Q_ALIGNED_MASK = 0x1E000000
};
enum {
EXPORT_FLAGS_INTERNAL = 0x10,
EXPORT_FLAGS_IMPORT = 0x20,
EXPORT_FLAGS_EXPORT = 0x40
};
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
struct CParams {
CWPluginContext context;
CWObjectData objectdata;
Handle objectDataHandle;
Handle browseDataHandle;
SInt32 pluginRequest;
SInt32 apiVersion;
FSSpec projectFile;
SInt32 projectFileCount;
SInt32 mainFileNumber;
FSSpec mainFileSpec;
const char *mainFileText;
SInt32 mainFileTextLength;
Boolean isPrecompiling;
Boolean isAutoPrecompiling;
Boolean isPreprocessing;
Boolean isGeneratingDebugInfo;
Boolean isCachingPrecompiledHeaders;
CWBrowseOptions browseOptions;
Boolean field276;
SInt16 mainFileID;
CWDataType targetOS;
CWDataType targetCPU;
char *targetName;
};
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -75,6 +75,7 @@ typedef enum ENodeType {
ESETCONST,
ENEWEXCEPTION,
ENEWEXCEPTIONARRAY,
EMYSTERY67, // no name???
EOBJLIST,
EMEMBER,
ETEMPLDEP,
@@ -88,6 +89,15 @@ typedef enum ENodeType {
} ENodeType;
struct EMemberInfo {
BClassList *path;
ENodeList *nodes;
void *x8;
void *xC;
void *x10;
};
struct ENodeList {
ENodeList *next;
ENode *node;
@@ -116,7 +126,7 @@ typedef union ENodeUnion {
ENodeList *args;
TypeFunc *functype;
} funccall;
ObjAccess objaccess;
//ObjAccess objaccess;
struct {
ENode *accessnode;
ENode *mfpointer;
@@ -135,7 +145,7 @@ typedef union ENodeUnion {
struct {
SInt32 size;
char *data;
SInt32 segnum;
//SInt32 segnum; ??
char ispascal;
char ispacked;
} string;
@@ -159,6 +169,10 @@ typedef union ENodeUnion {
Object *objref;
SInt32 offset;
} addr;
struct {
NameSpaceObjectList *list;
TemplArg *templargs;
} objlist;
void *inst;
MemInitializer *ctorinit;
Statement *stmt;
@@ -187,7 +201,7 @@ typedef union ENodeUnion {
HashNameNode *name;
TemplArg *args;
} qualtempl;
ObjAccess objaccess;
//ObjAccess objaccess;
struct {
ENode *expr;
TStreamElement *token;
@@ -197,7 +211,8 @@ typedef union ENodeUnion {
ENode *expr;
ENodeList *args;
} funccall;
struct {
// have my doubts about this one
/*struct {
Type *type;
UInt32 qual;
ENode *arraydim;
@@ -205,7 +220,7 @@ typedef union ENodeUnion {
ENodeList *initlist;
Boolean is_global;
Boolean has_init;
} nw;
} nw;*/
struct {
ENode *expr;
Boolean is_global;
@@ -242,7 +257,7 @@ typedef union ENodeUnion {
struct ENode {
ENodeType type;
UInt8 cost;
UInt16 flags; // &1, &2 correspond to quals
UInt16 flags;
Boolean ignored;
Boolean hascall;
// void *loc; - might not be in pro7?
@@ -254,9 +269,16 @@ struct ENode {
enum {
ENODE_FLAG_CONST = Q_CONST,
ENODE_FLAG_VOLATILE = Q_VOLATILE,
ENODE_FLAG_QUALS = Q_CONST | Q_VOLATILE
ENODE_FLAG_QUALS = Q_CONST | Q_VOLATILE,
ENODE_FLAG_10 = 0x10,
ENODE_FLAG_80 = 0x80
};
#define ENODE_IS(_enode, _etype) ( (_enode)->type == (_etype) )
#define ENODE_IS2(_enode, _etype1, _etype2) ( ENODE_IS(_enode, (_etype1)) || ENODE_IS(_enode, (_etype2)) )
#define ENODE_IS3(_enode, _etype1, _etype2, _etype3) ( ENODE_IS(_enode, (_etype1)) || ENODE_IS(_enode, (_etype2)) || ENODE_IS(_enode, (_etype3)) )
#define ENODE_IS_RANGE(_enode, _lo, _hi) ( ((_enode)->type >= (_lo)) && ((_enode)->type <= (_hi)) )
#ifdef __MWERKS__
#pragma options align=reset
#endif

View File

@@ -47,7 +47,7 @@ struct ObjType {
ObjectType otype;
AccessType access;
Type *type;
void *unk6;
UInt32 qual;
};
@@ -184,6 +184,25 @@ struct Object {
} u;
};
enum {
OBJECT_FLAGS_UNUSED = 1,
OBJECT_FLAGS_2 = 2,
OBJECT_FLAGS_4 = 4,
OBJECT_FLAGS_8 = 8,
OBJECT_FLAGS_10 = 0x10, // internal
OBJECT_FLAGS_20 = 0x20, // import
OBJECT_FLAGS_40 = 0x40, // export
OBJECT_FLAGS_60 = 0x60 // lib export
};
enum {
OBJECT_SCLASS_101 = 0x101,
OBJECT_SCLASS_102 = 0x102,
OBJECT_SCLASS_103 = 0x103,
OBJECT_SCLASS_104 = 0x104,
OBJECT_SCLASS_12B = 0x12B
};
#define OBJ_BASE(obj) ((ObjBase *) (obj))
#define OBJ_ENUM_CONST(obj) ((ObjEnumConst *) (obj))
#define OBJ_TYPE(obj) ((ObjType *) (obj))
@@ -193,8 +212,30 @@ struct Object {
#define OBJ_MEMBER_VAR_PATH(obj) ((ObjMemberVarPath *) (obj))
#define OBJECT(obj) ((Object *) (obj))
#endif
struct VarInfo { // OK!
Object *func;
SInt32 usage;
TStreamElement deftoken;
SInt16 varnumber;
Boolean noregister;
Boolean used;
UInt8 flags;
UInt8 rclass;
SInt16 reg;
SInt16 regHi;
};
enum {
VarInfoFlag1 = 1, // is parameter?
VarInfoFlag2 = 2,
VarInfoFlag4 = 4,
VarInfoFlag40 = 0x40,
VarInfoFlag80 = 0x80
};
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif

View File

@@ -143,6 +143,10 @@ struct TemplClass {
UInt8 flags;
};
enum {
TEMPLCLASS_FLAGS_2 = 2
};
struct TemplClassInst {
TypeClass theclass;
TemplClassInst *next;
@@ -150,7 +154,8 @@ struct TemplClassInst {
TemplClass *templ;
TemplArg *inst_args;
TemplArg *oargs;
void *x46;
Boolean x46;
Boolean x47;
};
#define TEMPL_CLASS(ty) ( (TemplClass *) (ty) )

View File

@@ -39,7 +39,15 @@ typedef enum EToken {
TK_UNION,
TK_ENUM,
TK_CLASS,
TK_UU_VECTOR = 283,
TK_UNK_113,
TK_UNK_114,
TK_UNK_115,
TK_UNK_116,
TK_UNK_117,
TK_UNK_118,
TK_UNK_119,
TK_UNK_11A,
TK_UU_VECTOR,
TK_UU_TYPEOF_UU,
TK_BOOL,
TK_WCHAR_T,
@@ -138,7 +146,9 @@ typedef enum EToken {
TK_AT_DEFS,
TK_SELF,
TK_SUPER,
TK_UU_ALIGNOF_UU = 388,
TK_NEW_ARRAY,
TK_DELETE_ARRAY,
TK_UU_ALIGNOF_UU,
TK_RESTRICT,
TK_UU_ATTRIBUTE_UU,
TK_UU_UUIDOF
@@ -146,7 +156,7 @@ typedef enum EToken {
typedef struct FileOffsetInfo {
CPrepFileInfo *file;
SInt32 offset;
SInt32 tokenline;
SInt32 tokenoffset;
Boolean is_inline;
} FileOffsetInfo;

View File

@@ -90,6 +90,7 @@ struct StructMember {
enum {
STRUCT_TYPE_STRUCT = 0,
STRUCT_TYPE_UNION = 1,
STRUCT_TYPE_CLASS = 2,
STRUCT_TYPE_4 = 4,
STRUCT_TYPE_5 = 5,
STRUCT_TYPE_6 = 6,
@@ -104,23 +105,23 @@ enum {
};
typedef struct ClassList { // checked via CPrec
struct ClassList *next;
struct ClassList { // checked via CPrec
ClassList *next;
TypeClass *base;
SInt32 offset;
SInt32 voffset;
AccessType access;
Boolean is_virtual;
} ClassList;
};
typedef struct VClassList { // checked via CPrec
struct VClassList *next;
struct VClassList { // checked via CPrec
VClassList *next;
TypeClass *base;
SInt32 offset;
SInt32 voffset;
Boolean has_override;
char alignsave;
} VClassList;
};
typedef struct ClassFriend { // checked via CPrec
struct ClassFriend *next;
@@ -162,14 +163,42 @@ struct TypeClass {
UInt8 eflags;
};
typedef enum {
CLASS_MODE_0 = 0,
CLASS_MODE_1 = 1,
CLASS_MODE_2 = 2
} ClassMode;
enum {
CLASS_FLAGS_1 = 1,
CLASS_FLAGS_2 = 2,
CLASS_FLAGS_ABSTRACT = 8,
CLASS_FLAGS_10 = 0x10,
CLASS_FLAGS_20 = 0x20,
CLASS_FLAGS_40 = 0x40,
CLASS_FLAGS_80 = 0x80,
CLASS_FLAGS_100 = 0x100, // is TemplClass
CLASS_FLAGS_800 = 0x800, // is TemplClassInst
CLASS_FLAGS_900 = 0x900
CLASS_FLAGS_900 = 0x900,
CLASS_FLAGS_1000 = 0x1000,
CLASS_FLAGS_2000 = 0x2000,
CLASS_FLAGS_4000 = 0x4000,
CLASS_FLAGS_8000 = 0x8000
};
/// maps to TypeClass::eflags
enum {
CLASS_EFLAGS_INTERNAL = 1,
CLASS_EFLAGS_IMPORT = 2,
CLASS_EFLAGS_EXPORT = 4
};
enum {
CLASS_ACTION_0 = 0,
CLASS_ACTION_1 = 1,
CLASS_ACTION_2 = 2,
CLASS_ACTION_3 = 3 // __javaobject
};
typedef struct ExceptSpecList {
struct ExceptSpecList *next;
@@ -199,14 +228,29 @@ struct TypeFunc {
};
enum {
FUNC_FLAGS_PASCAL = 1, // on TypeFunc::flags
FUNC_FLAGS_2 = 2,
FUNC_FLAGS_4 = 4,
FUNC_FLAGS_8 = 8, // abstract?
FUNC_FLAGS_METHOD = 0x10,
FUNC_FLAGS_40 = 0x40, // func that's like "operator SomeOtherType()"
FUNC_FLAGS_80 = 0x80,
FUNC_FLAGS_100 = 0x100,
FUNC_FLAGS_200 = 0x200,
FUNC_FLAGS_NOTHROW = 0x400,
FUNC_FLAGS_800 = 0x800,
FUNC_FLAGS_1000 = 0x1000,
FUNC_FLAGS_2000 = 0x2000,
FUNC_FLAGS_100000 = 0x100000,
FUNC_FLAGS_900000 = 0x900000
FUNC_FLAGS_CONST = 0x8000,
FUNC_FLAGS_VOLATILE = 0x10000,
FUNC_FLAGS_100000 = 0x100000, // is template?
FUNC_FLAGS_800000 = 0x800000,
FUNC_FLAGS_900000 = 0x900000,
FUNC_FLAGS_4000000 = 0x4000000,
FUNC_FLAGS_10000000 = 0x10000000,
FUNC_FLAGS_F0000000 = 0xF0000000
};
// This is actually called TypeMemberFunc...
// There seems to be a version of this which adds a class pointer at the end
struct TypeMethod {
TypeType type;
@@ -217,7 +261,7 @@ struct TypeMethod {
UInt32 qual;
UInt32 flags;
TypeClass *theclass;
void *x1E;
SInt32 x1E; // vtable offset?
void *x22;
Boolean x26;
};
@@ -227,7 +271,7 @@ struct TypeBitfield {
TypeType type;
SInt32 size;
Type *bitfieldtype;
unsigned char unkA;
char unkA;
char unkB;
};
@@ -305,7 +349,14 @@ struct TypePointer {
// ObjCID
struct TypeList {
TypeList *next;
Type *type;
};
// Not sure if these existed originally, but they'll help
#define TYPE(ty) ((Type *) (ty))
#define TYPE_INTEGRAL(ty) ((TypeIntegral *) (ty))
#define TYPE_ENUM(ty) ((TypeEnum *) (ty))
#define TYPE_STRUCT(ty) ((TypeStruct *) (ty))
@@ -317,6 +368,34 @@ struct TypePointer {
#define TYPE_MEMBER_POINTER(ty) ((TypeMemberPointer *) (ty))
#define TYPE_POINTER(ty) ((TypePointer *) (ty))
#define IS_TYPE_VOID(ty) ( (ty)->type == TYPEVOID )
#define IS_TYPE_INT(ty) ( (ty)->type == TYPEINT )
#define IS_TYPE_ENUM(ty) ( (ty)->type == TYPEENUM )
#define IS_TYPE_INT_OR_ENUM(ty) ( IS_TYPE_INT(ty) || IS_TYPE_ENUM(ty) )
#define IS_TYPE_FLOAT(ty) ( (ty)->type == TYPEFLOAT )
#define IS_TYPE_STRUCT(ty) ( (ty)->type == TYPESTRUCT )
#define IS_TYPE_CLASS(ty) ( (ty)->type == TYPECLASS )
#define IS_TYPE_FUNC(ty) ( (ty)->type == TYPEFUNC )
#define IS_TYPEFUNC_METHOD(ty) ( (ty)->flags & FUNC_FLAGS_METHOD )
#define IS_TYPE_TEMPLATE(ty) ( (ty)->type == TYPETEMPLATE )
#define IS_TYPE_POINTER(ty) ( (ty)->type == TYPEPOINTER || (ty)->type == TYPEARRAY )
#define IS_TYPE_POINTER_ONLY(ty) ( (ty)->type == TYPEPOINTER )
#define IS_TYPE_REFERENCE(ty) ( (ty)->type == TYPEPOINTER && (TYPE_POINTER(ty)->qual & Q_REFERENCE) )
#define IS_TYPEPOINTER_REFERENCE(ty) ( (ty)->qual & Q_REFERENCE )
#define IS_TYPE_ARRAY(ty) ( (ty)->type == TYPEARRAY )
#define IS_TYPE_BITFIELD(ty) ( (ty)->type == TYPEBITFIELD )
#define IS_TYPESTRUCT_VECTOR(ty) ( (ty)->stype >= STRUCT_TYPE_4 && (ty)->stype <= STRUCT_TYPE_E )
#define IS_TYPE_VECTOR(ty) ( (ty)->type == TYPESTRUCT && IS_TYPESTRUCT_VECTOR(TYPE_STRUCT(ty)) )
#define IS_TYPE_NONVECTOR_STRUCT(ty) ( (ty)->type == TYPESTRUCT && !IS_TYPESTRUCT_VECTOR(TYPE_STRUCT(ty)) )
#define IS_TYPE_MEMBERPOINTER(ty) ( (ty)->type == TYPEMEMBERPOINTER )
#define IS_TYPE_4BYTES_MEMBERPOINTER(ty) ( ((ty)->type == TYPEMEMBERPOINTER) && ((ty)->size == 4u) )
#define IS_TYPE_12BYTES_MEMBERPOINTER(ty) ( ((ty)->type == TYPEMEMBERPOINTER) && ((ty)->size == 12u) )
#define TYPE_FITS_IN_REGISTER(ty) ( ((ty)->type == TYPEINT) || ((ty)->type == TYPEENUM) || (IS_TYPE_POINTER(ty) && ((ty)->type != TYPEARRAY)) || IS_TYPE_4BYTES_MEMBERPOINTER(ty) )
#define TYPE_IS_8BYTES(ty) ( (((ty)->type == TYPEINT) || ((ty)->type == TYPEENUM)) && ((ty)->size == 8) )
#define OBJ_GET_TARGET_VOLATILE(obj) ( IS_TYPE_POINTER((obj)->type) ? (TYPE_POINTER((obj)->type)->qual & Q_VOLATILE) : ((obj)->qual & Q_VOLATILE) )
#define OBJ_GET_TARGET_CONST(obj) ( IS_TYPE_POINTER((obj)->type) ? (TYPE_POINTER((obj)->type)->qual & Q_CONST) : ((obj)->qual & Q_CONST) )
#ifdef __MWERKS__
#pragma options align=reset
#endif