summaryrefslogtreecommitdiff
path: root/includes/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'includes/compiler')
-rw-r--r--includes/compiler/CABI.h27
-rw-r--r--includes/compiler/CClass.h20
-rw-r--r--includes/compiler/CDecl.h14
-rw-r--r--includes/compiler/CException.h7
-rw-r--r--includes/compiler/CExpr.h47
-rw-r--r--includes/compiler/CFunc.h43
-rw-r--r--includes/compiler/CInit.h3
-rw-r--r--includes/compiler/CInline.h20
-rw-r--r--includes/compiler/CMangler.h8
-rw-r--r--includes/compiler/CParser.h38
-rw-r--r--includes/compiler/CPrec.h12
-rw-r--r--includes/compiler/CPrep.h5
-rw-r--r--includes/compiler/CPrepTokenizer.h8
-rw-r--r--includes/compiler/CScope.h2
-rw-r--r--includes/compiler/CodeGen.h2
-rw-r--r--includes/compiler/CompilerTools.h2
-rw-r--r--includes/compiler/Exceptions.h2
-rw-r--r--includes/compiler/GCCInlineAsm.h2
-rw-r--r--includes/compiler/InlineAsm.h9
-rw-r--r--includes/compiler/InlineAsmPPC.h16
-rw-r--r--includes/compiler/IrOptimizer.h2
-rw-r--r--includes/compiler/IroEval.h8
-rw-r--r--includes/compiler/IroLinearForm.h2
-rw-r--r--includes/compiler/IroLoop.h30
-rw-r--r--includes/compiler/IroPointerAnalysis.h2
-rw-r--r--includes/compiler/IroTransform.h8
-rw-r--r--includes/compiler/IroUnrollLoop.h29
-rw-r--r--includes/compiler/IroUtil.h19
-rw-r--r--includes/compiler/LoopDetection.h2
-rw-r--r--includes/compiler/PCode.h13
-rw-r--r--includes/compiler/StackFrame.h4
-rw-r--r--includes/compiler/Switch.h2
-rw-r--r--includes/compiler/TOC.h17
-rw-r--r--includes/compiler/common.h1
-rw-r--r--includes/compiler/enode.h2
-rw-r--r--includes/compiler/objects.h14
-rw-r--r--includes/compiler/types.h15
37 files changed, 264 insertions, 193 deletions
diff --git a/includes/compiler/CABI.h b/includes/compiler/CABI.h
index 735eeea..6e190d5 100644
--- a/includes/compiler/CABI.h
+++ b/includes/compiler/CABI.h
@@ -8,6 +8,13 @@
#pragma options align=mac68k
#endif
+typedef enum CABIDestroyMode {
+ CABIDestroy0 = 0,
+ CABIDestroy1 = 1,
+ CABIDestroy2 = 2,
+ CABIDestroy3 = 3
+} CABIDestroyMode;
+
extern short CABI_GetStructResultArgumentIndex(TypeFunc *tfunc);
extern Type *CABI_GetSizeTType(void);
extern Type *CABI_GetPtrDiffTType(void);
@@ -16,21 +23,21 @@ 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(TypeClass *tclass, Object *obj);
+extern void CABI_MakeDefaultArgConstructor(TypeClass *tclass, Object *func);
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_TransConstructor(Object *obj, Statement *stmt, TypeClass *tclass, TransConstructorCallback callback, Boolean has_try);
+extern void CABI_MakeDefaultConstructor(TypeClass *tclass, Object *func);
+extern void CABI_MakeDefaultCopyConstructor(TypeClass *tclass, Object *func);
+extern void CABI_MakeDefaultAssignmentOperator(TypeClass *tclass, Object *func);
+extern void CABI_TransDestructor(Object *obj1, Object *obj2, Statement *stmt, TypeClass *tclass, CABIDestroyMode mode);
+extern void CABI_MakeDefaultDestructor(TypeClass *tclass, Object *func);
+extern void CABI_MakeLayeredDestructor(TypeClass *tclass, Object *func);
+extern Object *CABI_GetDestructorObject(Object *obj, CABIDestroyMode mode);
extern void CABI_AddLayeredDestructors(TypeClass *tclass);
-extern ENode *CABI_DestroyObject(Object *dtor, ENode *objexpr, UInt8 mode, Boolean flag1, Boolean flag2);
+extern ENode *CABI_DestroyObject(Object *dtor, ENode *objexpr, CABIDestroyMode mode, Boolean flag1, Boolean flag2);
#ifdef __MWERKS__
#pragma options align=reset
diff --git a/includes/compiler/CClass.h b/includes/compiler/CClass.h
index 083588c..bb952de 100644
--- a/includes/compiler/CClass.h
+++ b/includes/compiler/CClass.h
@@ -7,21 +7,21 @@
#pragma options align=mac68k
#endif
-typedef struct VTableObjectLink {
+/*typedef struct VTableObjectLink {
struct VTableObjectLink *next;
Object *methodobj;
SInt32 offset;
SInt32 xC;
-} VTableObjectLink;
+} 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 Boolean CClass_IsNonStaticMemberFunc(TypeFunc *tfunc);
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 ENode *CClass_DefaultConstructorCall(TypeClass *tclass, TypeClass *b, ENode *objexpr, SInt32 varg, 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);
@@ -34,19 +34,19 @@ 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 BClassList *CClass_AppendPath(BClassList *dest, BClassList *src);
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_AccessPathCast(BClassList *path, ENode *expr, Boolean reverse);
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_ClassDominates(TypeClass *tclass, TypeClass *baseclass);
+extern SInt32 CClass_VirtualBaseOffset(TypeClass *tclass, TypeClass *baseclass);
+extern SInt32 CClass_VirtualBaseVTableOffset(TypeClass *tclass, TypeClass *baseclass);
+extern SInt32 CClass_GetMemberOffset(TypeClass *tclass, HashNameNode *name, ObjMemberVar **resultIvar);
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);
diff --git a/includes/compiler/CDecl.h b/includes/compiler/CDecl.h
index a4c28e2..331a53b 100644
--- a/includes/compiler/CDecl.h
+++ b/includes/compiler/CDecl.h
@@ -12,7 +12,7 @@
// named because it's 0xE bytes big (hurr)
struct DeclE {
ObjBase **objlist;
- void *x4;
+ ObjMemberVar *vtable_ivar;
unsigned short x8; // lex_order_count?
unsigned short xA;
Boolean xC;
@@ -31,8 +31,8 @@ struct DeclInfo {
HashNameNode *name;
Object *x10;
NameSpaceObjectList *x14;
- void *x18;
- void *x1C;
+ FuncArg *x18;
+ NameSpace *x1C;
Type *x20;
ENode *x24;
TemplClass *x28;
@@ -46,8 +46,8 @@ struct DeclInfo {
short storageclass;
UInt8 section;
UInt8 exportflags;
- Boolean x44;
- Boolean x45;
+ Boolean x44; // has args in identifier list
+ Boolean x45; // has oldstyle args
Boolean x46;
Boolean x47;
Boolean x48;
@@ -56,7 +56,7 @@ struct DeclInfo {
Boolean x4B;
Boolean x4C;
Boolean x4D;
- Boolean x4E;
+ Boolean x4E; // is_extern_c?
Boolean x4F;
Boolean x50;
Boolean x51;
@@ -70,7 +70,7 @@ struct DeclInfo {
CPrepFileInfo *file;
CPrepFileInfo *file2;
SInt32 x60; // file offset?
- short x64;
+ Boolean x64;
};
typedef struct BigDeclInfo {
diff --git a/includes/compiler/CException.h b/includes/compiler/CException.h
index 0e19380..361cddd 100644
--- a/includes/compiler/CException.h
+++ b/includes/compiler/CException.h
@@ -3,6 +3,13 @@
#include "compiler/common.h"
+typedef struct DtorTemp {
+ struct DtorTemp *next;
+ Object *object;
+ Object *dtor;
+ Object *temp;
+} DtorTemp;
+
extern ExceptionAction *cexcept_dobjstack;
extern Boolean cexcept_hasdobjects;
extern Boolean cexcept_magic;
diff --git a/includes/compiler/CExpr.h b/includes/compiler/CExpr.h
index 24f0646..bdc0789 100644
--- a/includes/compiler/CExpr.h
+++ b/includes/compiler/CExpr.h
@@ -64,7 +64,9 @@ typedef struct Conversion {
} Conversion;
// CExpr.c
-extern Boolean (*name_obj_check)(HashNameNode *, Object *);
+typedef Boolean (*NameObjCheckCB)(HashNameNode *, Object *);
+
+extern NameObjCheckCB name_obj_check;
extern Boolean disallowgreaterthan;
// CExpr2.c
@@ -174,7 +176,7 @@ extern void CExpr_MatchCV(Type *t1, UInt32 q1, Type *t2, UInt32 q2, Match13 *mat
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 ENode *CExpr_ConvertToBool(ENode *expr, Boolean isExplicit);
extern void CExpr_ConversionIteratorInit(ConversionIterator *iter, TypeClass *tclass);
extern Object *CExpr_ConversionIteratorNext(ConversionIterator *iter);
extern short user_assign_check(ENode *expr, Type *type, UInt32 qual, Boolean flag1, Boolean flag2, Boolean flag3);
@@ -197,45 +199,12 @@ extern ENode *scannew(Boolean flag);
extern ENode *scandelete(Boolean flag);
// 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(NameSpaceObjectList *nsol, TemplArg *templargs, ENodeList *argexprs, Match13 *match, ENode *expr, Boolean flag);
-// 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 Boolean CExpr_CanImplicitlyConvert(ENode *expr, Type *type2, UInt32 qual2);
+extern ENode *CExpr_Convert(ENode *expr, Type *type, UInt32 qual, Boolean isExplicit, Boolean flag2);
+extern ENode *CExpr_AssignmentPromotion(ENode *expr, Type *type2, UInt32 qual2, Boolean flag);
+extern void CExpr_FuncArgMatch(NameSpaceObjectList *list, TemplArg *templargs, ENodeList *argexprs, Match13 *match13, ENode *expr, Boolean flag);
extern Boolean CExpr_CondOperatorMatch(ENode *left, ENode *right, Conversion *conv);
extern Boolean CExpr_OperatorMatch(short token, ENode *left, ENode *right, Conversion *conv);
-// static void CExpr_ClassCopyInit();
#ifdef __MWERKS__
#pragma options align=reset
diff --git a/includes/compiler/CFunc.h b/includes/compiler/CFunc.h
index bed511f..a64cc74 100644
--- a/includes/compiler/CFunc.h
+++ b/includes/compiler/CFunc.h
@@ -49,6 +49,7 @@ typedef enum StatementType {
enum {
StmtFlag_1 = 1,
StmtFlag_2 = 2,
+ StmtFlag_4 = 4,
StmtFlag_8 = 8,
StmtFlag_10 = 0x10
};
@@ -80,9 +81,15 @@ typedef struct InitExpr {
Object *object;
} InitExpr;
+typedef enum CtorChainType {
+ CtorChain_Base = 0,
+ CtorChain_VBase = 1,
+ CtorChain_MemberVar = 2
+} CtorChainType;
+
typedef struct CtorChain {
struct CtorChain *next;
- UInt8 what;
+ CtorChainType what;
ENode *objexpr;
union {
ClassList *base; // 0
@@ -91,17 +98,19 @@ typedef struct CtorChain {
} u;
} CtorChain;
-typedef struct CFuncSave {
- CScopeSave scope;
- // lots of fields
-} CFuncSave;
+typedef struct CFuncSave CFuncSave;
struct DeclThing {
Type *thetype;
UInt32 qual;
- NameSpace *nspace;
- CLabel *xC;
- CLabel *x10;
+ SwitchInfo *switchinfo;
+ CLabel *loopContinue;
+ CLabel *loopBreak;
+};
+
+struct DefArgCtorInfo {
+ Object *default_func;
+ ENode *default_arg;
};
extern FuncArg elipsis;
@@ -122,7 +131,7 @@ 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 ENode *CFunc_DefaultArg(Type *type, UInt32 qual, FuncArg *args);
extern Boolean CFunc_ParseFakeArgList(Boolean flag);
extern FuncArg *parameter_type_list(DeclInfo *declinfo);
extern CLabel *findlabel(void);
@@ -137,19 +146,19 @@ 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 Statement *CFunc_GenerateLoop(Statement *stmt, Type *type, ENode *lowerBound, ENode *upperBound, ENode *increment1, ENode *increment2, ENode *(*callback)(ENode *, ENode *));
extern void CFunc_CompoundStatement(DeclThing *thing);
-extern void CFunc_SetupNewFuncArgs(Object *obj, FuncArg *args);
+extern void CFunc_SetupNewFuncArgs(Object *func, FuncArg *args);
extern NameSpace *CFunc_FuncGenSetup(Statement *stmt, Object *func);
-extern void CFunc_GetGlobalCompilerState(CFuncSave *state);
+extern CFuncSave *CFunc_GetGlobalCompilerState(void);
extern void CFunc_SetGlobalCompilerState(CFuncSave *state);
-extern void CFunc_Gen(Statement *stmt, Object *obj, UInt8 unk);
+extern void CFunc_Gen(Statement *stmt, Object *func, 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 CFunc_ParseFuncDef(Object *func, DeclInfo *di, 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);
+extern void CFunc_GenerateDummyFunction(Object *func);
+extern void CFunc_GenerateSingleExprFunc(Object *func, ENode *expr);
+extern void CFunc_GenerateDummyCtorFunc(Object *func, Object *real_ctor);
#ifdef __MWERKS__
#pragma options align=reset
diff --git a/includes/compiler/CInit.h b/includes/compiler/CInit.h
index e6e3d61..dc5d759 100644
--- a/includes/compiler/CInit.h
+++ b/includes/compiler/CInit.h
@@ -10,8 +10,7 @@
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 *(*RegisterObjectCB)(Type *type, Object *obj, SInt32 offset, Boolean flag);
typedef ENode *(*TempNodeCB)(Type *type, Boolean flag);
struct OLinkList {
diff --git a/includes/compiler/CInline.h b/includes/compiler/CInline.h
index 52cdf13..4fae90a 100644
--- a/includes/compiler/CInline.h
+++ b/includes/compiler/CInline.h
@@ -9,6 +9,22 @@
#pragma options align=mac68k
#endif
+// Not sure if these two are actually in CInline or not
+typedef struct XRefOffset {
+ UInt32 xrefoffset;
+ SInt32 offset;
+} XRefOffset;
+
+struct InlineXRef {
+ InlineXRef *next;
+ Object *object;
+ UInt16 xrefmode;
+ UInt16 numxrefs;
+ XRefOffset xref[1];
+};
+
+
+
typedef struct CI_Var {
HashNameNode *name;
Type *type;
@@ -33,10 +49,10 @@ typedef struct CI_SwitchCase {
typedef struct CI_Switch {
ENode *expr;
- void *unkSwitch8;
+ Type *unkSwitch8;
short defaultlabelID;
short numcases;
- CI_SwitchCase cases[0];
+ CI_SwitchCase cases[1];
} CI_Switch;
typedef struct CI_Statement {
diff --git a/includes/compiler/CMangler.h b/includes/compiler/CMangler.h
index f08ecd8..2e84032 100644
--- a/includes/compiler/CMangler.h
+++ b/includes/compiler/CMangler.h
@@ -17,15 +17,15 @@ 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 char *CMangler_GetOperator(HashNameNode *name);
extern HashNameNode *CMangler_OperatorName(short token);
-extern HashNameNode *CMangler_VTableName(TypeClass *tclass);
+extern HashNameNode *CMangler_VTableName(TypeClass *theclass);
extern HashNameNode *CMangler_RTTIObjectName(Type *type, UInt32 qual);
-extern HashNameNode *CMangler_ThunkName(Object *obj, int a, int b, int c);
+extern HashNameNode *CMangler_ThunkName(Object *vfunc, SInt32 this_delta, SInt32 return_delta, SInt32 ctoroffset);
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_GetCovariantFunctionName(Object *dobj, TypeClass *theclass);
extern HashNameNode *CMangler_GetLinkName(Object *obj);
#ifdef __MWERKS__
diff --git a/includes/compiler/CParser.h b/includes/compiler/CParser.h
index 5d9a67a..7312e33 100644
--- a/includes/compiler/CParser.h
+++ b/includes/compiler/CParser.h
@@ -77,7 +77,7 @@ typedef struct COpts {
Boolean altivec_model;
UInt8 altivec_vrsave;
UInt8 code_alignment;
- char x1D;
+ UInt8 x1D;
UInt8 x1E; // some register used in TOC_use_isel
UInt8 gen_fsel;
Boolean ppc_opt_bclr_bcctr;
@@ -99,7 +99,7 @@ typedef struct COpts {
Boolean objective_c;
Boolean objc_strict;
Boolean ARM_conform;
- char ARM_scoping;
+ Boolean ARM_scoping;
Boolean require_prototypes;
Boolean trigraphs;
Boolean only_std_keywords;
@@ -130,14 +130,14 @@ typedef struct COpts {
Boolean flat_include;
char syspath_once;
Boolean always_import;
- char simple_class_byval;
+ Boolean simple_class_byval;
Boolean wchar_type;
Boolean vbase_ctor_offset;
- char vbase_abi_v2;
+ Boolean vbase_abi_v2;
Boolean def_inherited;
Boolean template_patch;
char template_friends;
- char faster_pch_gen;
+ Boolean faster_pch_gen;
Boolean array_new_delete;
Boolean dollar_identifiers;
char def_inline_tfuncs;
@@ -146,7 +146,7 @@ typedef struct COpts {
Boolean line_prepdump;
Boolean fullpath_prepdump;
char old_mtemplparser;
- char suppress_init_code;
+ Boolean suppress_init_code;
Boolean reverse_bitfields;
Boolean c9x;
Boolean float_constants;
@@ -166,15 +166,15 @@ typedef struct COpts {
char microsoft;
Boolean warningerrors;
Boolean pedantic;
- char check_header_flags;
+ Boolean check_header_flags;
Boolean supress_warnings;
Boolean warn_illpragma;
Boolean warn_emptydecl;
Boolean warn_possunwant;
- char warn_unusedvar;
- char warn_unusedarg;
+ Boolean warn_unusedvar;
+ Boolean warn_unusedarg;
Boolean warn_extracomma;
- char warn_hidevirtual;
+ Boolean warn_hidevirtual;
Boolean warn_largeargs;
Boolean warn_implicitconv;
Boolean warn_notinlined;
@@ -182,7 +182,7 @@ typedef struct COpts {
Boolean warn_padding;
Boolean warn_no_side_effect;
Boolean warn_resultnotused;
- char warn_ptr_int_conv;
+ Boolean warn_ptr_int_conv;
char align_mode;
Boolean align_array_members;
Boolean dont_reuse_strings;
@@ -208,16 +208,16 @@ typedef struct COpts {
Boolean crippled;
Boolean opt_common_subs;
Boolean opt_loop_invariants;
- char opt_propagation;
- char opt_dead_assignments;
+ Boolean opt_propagation;
+ Boolean opt_dead_assignments;
Boolean opt_strength_reduction;
Boolean opt_strength_reduction_strict;
- char opt_dead_code;
- char opt_lifetimes;
+ Boolean opt_dead_code;
+ Boolean opt_lifetimes;
char _B1; // unused?
- char opt_unroll_loops;
+ Boolean opt_unroll_loops;
char opt_vectorize_loops;
- char _B4; // amount of IRO passes?
+ Boolean _B4; // amount of IRO passes?
Boolean opt_pointer_analysis;
unsigned char opt_pointer_analysis_mode;
char loop_unroll_count;
@@ -386,8 +386,8 @@ 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_HasInternalLinkage(const Object *obj);
+extern Boolean CParser_HasInternalLinkage2(const 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);
diff --git a/includes/compiler/CPrec.h b/includes/compiler/CPrec.h
new file mode 100644
index 0000000..a2ac87c
--- /dev/null
+++ b/includes/compiler/CPrec.h
@@ -0,0 +1,12 @@
+#ifndef COMPILER_CPREC_H
+#define COMPILER_CPREC_H
+
+#include "compiler/common.h"
+
+extern void SetupPrecompiler(void);
+extern void CleanupPrecompiler(void);
+extern void PreComp_StaticData(Object *obj, const void *data, OLinkList *links, SInt32 size);
+extern void PrecompilerWrite(void);
+extern void PrecompilerRead(short refnum, void *buffer);
+
+#endif
diff --git a/includes/compiler/CPrep.h b/includes/compiler/CPrep.h
index e9b7dcd..aeb341b 100644
--- a/includes/compiler/CPrep.h
+++ b/includes/compiler/CPrep.h
@@ -11,11 +11,11 @@
struct Macro {
Macro *next;
HashNameNode *name;
- void *c;
+ char *c;
unsigned short xC;
Boolean is_special;
Boolean xF;
- void *e;
+ HashNameNode *names[1];
};
typedef struct TokenStack {
char *pos;
@@ -71,6 +71,7 @@ extern CPrepFileInfo *prep_file;
extern short filesp;
extern SInt32 linenumber;
extern struct GList pplist;
+extern TStreamElement *ts_last;
extern TStreamElement *ts_current;
extern SInt32 ts_preread_elements;
diff --git a/includes/compiler/CPrepTokenizer.h b/includes/compiler/CPrepTokenizer.h
index f65cff6..d6ea7c3 100644
--- a/includes/compiler/CPrepTokenizer.h
+++ b/includes/compiler/CPrepTokenizer.h
@@ -10,13 +10,13 @@
extern short prepskipnextchar(void);
extern short prepnextchar(void);
-extern short prepnextstringchar(char *str, Boolean flag);
+extern short prepnextstringchar(StringPtr 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 char *ReadIdentifier(const char *p);
+extern StringPtr CPrep_SkipNewComment(StringPtr str);
+extern Boolean skipendoflinematch(StringPtr str, short token);
extern void skipendofline(void);
extern void CPrep_SkipAsmComment(void);
extern short lookahead(void);
diff --git a/includes/compiler/CScope.h b/includes/compiler/CScope.h
index a1da819..f9ba72c 100644
--- a/includes/compiler/CScope.h
+++ b/includes/compiler/CScope.h
@@ -57,7 +57,7 @@ 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_SetMethodScope(Object *function, TypeClass *cls, Boolean is_static, CScopeSave *save);
extern void CScope_RestoreScope(CScopeSave *saved);
extern Boolean CScope_IsEmptySymTable(void);
extern Boolean CScope_IsInLocalNameSpace(NameSpace *nspace);
diff --git a/includes/compiler/CodeGen.h b/includes/compiler/CodeGen.h
index 1f012ec..46fe8fc 100644
--- a/includes/compiler/CodeGen.h
+++ b/includes/compiler/CodeGen.h
@@ -65,7 +65,7 @@ extern SInt32 CodeGen_objc_method_arg_offset(ObjCMethod *meth, ObjCMethodArg *ar
extern SInt32 CodeGen_objc_method_args_size(ObjCMethod *meth);
extern ENode *CodeGen_HandleIntrinsicCall(Object *func, ENodeList *arg_exprs);
extern ENode *CodeGen_HandleTypeCast(ENode *expr, Type *type, UInt32 qual);
-extern short CodeGen_AssignCheck(ENode *expr, Type *type, Boolean flag1, Boolean flag2);
+extern short CodeGen_AssignCheck(const ENode *expr, const Type *type, Boolean flag1, Boolean flag2);
extern Boolean CodeGen_CollapseVectorExpression(ENode *expr, MWVector128 *vec, Type *type);
extern void CodeGen_InsertSpecialMacros(void);
extern char *CodeGen_ExpandSpecialMacro(Macro *macro);
diff --git a/includes/compiler/CompilerTools.h b/includes/compiler/CompilerTools.h
index d44d766..82ef228 100644
--- a/includes/compiler/CompilerTools.h
+++ b/includes/compiler/CompilerTools.h
@@ -128,7 +128,7 @@ extern UInt32 CTool_EndianReadWord32(void *ptr);
#define CTool_EndianConvertWord32(value) value
#define CTool_EndianConvertWord16(value) value
#define CTool_EndianConvertMem(data, len) ((void)0)
-#define CTool_EndianReadWord32(ptr) (*((UInt32 *) (ptr)))
+#define CTool_EndianReadWord32(ptr) (*((SInt32 *) (ptr)))
#endif
extern void CTool_EndianConvertWord64(CInt64 ci, char *result);
extern UInt16 CTool_EndianConvertInPlaceWord16Ptr(UInt16 *x);
diff --git a/includes/compiler/Exceptions.h b/includes/compiler/Exceptions.h
index cc485b0..01efcde 100644
--- a/includes/compiler/Exceptions.h
+++ b/includes/compiler/Exceptions.h
@@ -143,10 +143,10 @@ typedef struct PCAction {
extern EANode *DAG[EAT_NACTIONS];
+extern void initializeexceptiontables(void);
extern int countexceptionactionregisters(ExceptionAction *actions);
extern void noteexceptionactionregisters(ExceptionAction *actions, PCodeArg *ops);
extern void recordexceptionactions(PCode *instr, ExceptionAction *actions);
-extern void deleteexceptionaction(PCAction *pca);
extern void dumpexceptiontables(Object *function, SInt32 codesize);
#endif
diff --git a/includes/compiler/GCCInlineAsm.h b/includes/compiler/GCCInlineAsm.h
index 0b61384..18e24d0 100644
--- a/includes/compiler/GCCInlineAsm.h
+++ b/includes/compiler/GCCInlineAsm.h
@@ -3,7 +3,7 @@
#include "compiler/common.h"
-extern void InlineAsm_SkipComment();
+extern void InlineAsm_SkipComment(void);
extern void InlineAsm_gcc_parse(void);
extern Statement *first_ST_ASM;
diff --git a/includes/compiler/InlineAsm.h b/includes/compiler/InlineAsm.h
index ba92400..ca0032e 100644
--- a/includes/compiler/InlineAsm.h
+++ b/includes/compiler/InlineAsm.h
@@ -160,6 +160,11 @@ typedef struct IAEffect {
SInt32 size;
} IAEffect;
+enum {
+ IAMaxOperands = 16,
+ IAMaxLabels = 16
+};
+
typedef struct IAEffects {
Boolean x0;
Boolean x1;
@@ -169,8 +174,8 @@ typedef struct IAEffects {
Boolean x5;
SInt32 numoperands;
SInt32 numlabels;
- IAEffect operands[16];
- CLabel *labels[16];
+ IAEffect operands[IAMaxOperands];
+ CLabel *labels[IAMaxLabels];
} IAEffects;
#ifdef __MWERKS__
diff --git a/includes/compiler/InlineAsmPPC.h b/includes/compiler/InlineAsmPPC.h
index a3d8655..d20bb42 100644
--- a/includes/compiler/InlineAsmPPC.h
+++ b/includes/compiler/InlineAsmPPC.h
@@ -4,6 +4,16 @@
#include "compiler/common.h"
#include "compiler/InlineAsm.h"
+typedef enum AssemblerType {
+ AssemblerType_0,
+ AssemblerType_1
+} AssemblerType;
+
+enum {
+ NO_REG = 0,
+ INVALID_PIC_REG = -2
+};
+
extern char asm_alloc_flags[10];
extern Section sm_section;
extern UInt32 cpu;
@@ -11,7 +21,7 @@ extern SInt32 fralloc_parameter_area_size;
extern Boolean user_responsible_for_frame;
extern Boolean supports_hardware_fpu;
extern UInt32 assembledinstructions;
-extern UInt8 assembler_type;
+extern AssemblerType assembler_type;
extern char volatileasm;
extern Boolean InlineAsm_gccmode;
extern Boolean InlineAsm_labelref;
@@ -68,8 +78,8 @@ enum {
};
extern void InlineAsm_InitializePPC(void);
-extern void InlineAsm_Initialize(UInt8 assemblertype);
-extern SInt32 InlineAsm_IsDirective(UInt8 assemblertype);
+extern void InlineAsm_Initialize(AssemblerType assemblertype);
+extern SInt32 InlineAsm_IsDirective(AssemblerType assemblertype);
extern void InlineAsm_ProcessDirective(SInt32 directive);
extern void InlineAsm_ScanAssemblyDirective(void);
extern void InlineAsm_ScanAssemblyInstruction(void);
diff --git a/includes/compiler/IrOptimizer.h b/includes/compiler/IrOptimizer.h
index 2061a5d..287e279 100644
--- a/includes/compiler/IrOptimizer.h
+++ b/includes/compiler/IrOptimizer.h
@@ -22,7 +22,7 @@ extern Boolean IRO_CPFirstTime;
extern Boolean VectorPhaseCalledFromUnroll;
extern Boolean IRO_Log;
-extern Statement *IRO_Optimizer(Object *obj, Statement *stmt);
+extern Statement *IRO_Optimizer(Object *func, Statement *statements);
extern void IRO_Setup(void);
extern void IRO_Cleanup(void);
extern void CodeGen_UpdateOptimizerOptions(void);
diff --git a/includes/compiler/IroEval.h b/includes/compiler/IroEval.h
index 9a4b2bf..a011a47 100644
--- a/includes/compiler/IroEval.h
+++ b/includes/compiler/IroEval.h
@@ -3,8 +3,12 @@
#include "compiler/IrOptimizer.h"
-// TODO
-extern void IRO_TruncateBitfieldValueToType(CInt64 *val, Type *type, Type *type2);
+extern void IRO_InitializeIsAssociativeENodeTypeArray(void);
extern void IRO_TruncateValueToType(CInt64 *val, Type *type);
+extern void IRO_TruncateBitfieldValueToType(CInt64 *val, Type *type, Type *type2);
+extern void IRO_ConstantFolding(void);
+extern Boolean IRO_EvaluateConditionals(void);
+extern int IRO_SimplifyConditionals(void);
+extern Boolean IRO_EvaluateDefinitePointers(Object *func);
#endif
diff --git a/includes/compiler/IroLinearForm.h b/includes/compiler/IroLinearForm.h
index 6ba0021..1e7df4f 100644
--- a/includes/compiler/IroLinearForm.h
+++ b/includes/compiler/IroLinearForm.h
@@ -157,7 +157,9 @@ extern void IRO_RestoreLinearIR(IROLinearIRSave *save);
#define IS_LINEAR_ENODE(_linear, _nodetype) ( ((_linear)->type == IROLinearOperand) && ((_linear)->u.node->type) == (_nodetype) )
#define IS_LINEAR_MONADIC(_linear, _nodetype) ( ((_linear)->type == IROLinearOp1Arg) && ((_linear)->nodetype) == (_nodetype) )
+#define IS_LINEAR_MONADIC_2(_linear, _nodetype1, _nodetype2) ( ((_linear)->type == IROLinearOp1Arg) && (((_linear)->nodetype) == (_nodetype1) || ((_linear)->nodetype) == (_nodetype2)) )
#define IS_LINEAR_DIADIC(_linear, _nodetype) ( ((_linear)->type == IROLinearOp2Arg) && ((_linear)->nodetype) == (_nodetype) )
#define IS_LINEAR_DIADIC_2(_linear, _nodetype1, _nodetype2) ( ((_linear)->type == IROLinearOp2Arg) && (((_linear)->nodetype) == (_nodetype1) || ((_linear)->nodetype) == (_nodetype2)) )
+#define IS_LINEAR_DIADIC_3(_linear, _nodetype1, _nodetype2, _nodetype3) ( ((_linear)->type == IROLinearOp2Arg) && (((_linear)->nodetype) == (_nodetype1) || ((_linear)->nodetype) == (_nodetype2) || ((_linear)->nodetype) == (_nodetype3)) )
#endif
diff --git a/includes/compiler/IroLoop.h b/includes/compiler/IroLoop.h
index 8357830..0c60589 100644
--- a/includes/compiler/IroLoop.h
+++ b/includes/compiler/IroLoop.h
@@ -5,32 +5,32 @@
#include "compiler/BitVector.h"
typedef enum IROLoopIndFlags {
- LoopInd_1 = 1,
- LoopInd_2 = 2,
+ LoopInd_HasMod = 1,
+ LoopInd_HasDiv = 2,
LoopInd_4 = 4,
LoopInd_8 = 8
} IROLoopIndFlags;
typedef enum IROLoopFlags {
- LoopFlags_1 = 1,
+ LoopFlags_1 = 1, // LP_INDUCTION_AT_LEFT
LP_LOOP_HAS_CALLS = 2,
LP_LOOP_HAS_CNTRLFLOW = 4,
- LoopFlags_8 = 8,
+ LoopFlags_8 = 8, // LP_HAS_NONASSIGN
LP_INDUCTION_NOT_FOUND = 0x10,
LP_IFEXPR_NON_CANONICAL = 0x20,
LP_HAS_MULTIPLE_INDUCTIONS = 0x40,
LP_LOOP_HDR_HAS_SIDEEFFECTS = 0x80,
- LoopFlags_100 = 0x100,
- LoopFlags_200 = 0x200,
+ LP_LOOP_STEP_ISADD = 0x100,
+ LoopFlags_200 = 0x200, // LP_HEADER_FOLLOWS_UPDATE?
LP_LOOP_STEP_ISPOS = 0x400,
- LoopFlags_800 = 0x800,
- LoopFlags_1000 = 0x1000,
- LoopFlags_2000 = 0x2000,
+ LoopFlags_800 = 0x800, // LP_IND_USED_IN_LOOP
+ LoopFlags_1000 = 0x1000, // LP_HAS_MULTIPLE_EXITS
+ LoopFlags_2000 = 0x2000, // inverse of LP_LOOP_STEP_ISADD?
LP_LOOP_STEP_ISNEG = 0x4000,
LP_LOOP_HAS_ASM = 0x8000,
- LoopFlags_10000 = 0x10000,
- LoopFlags_20000 = 0x20000,
- LoopFlags_40000 = 0x40000
+ LoopFlags_10000 = 0x10000, // LP_WHILE_LOOP
+ LoopFlags_20000 = 0x20000, // maybe LP_RECURSIVE_LOOP?
+ LoopFlags_40000 = 0x40000 // LP_IS_REDUCTION_CAND
} IROLoopFlags;
#ifdef __MWERKS__
@@ -50,10 +50,10 @@ struct IROLoop {
SInt32 flags;
IRONode *fnode;
int x8;
- int xC;
- int x10;
+ IRONode *xC;
+ IRONode *x10;
IROLinear *nd14; // assignment expression that sets the initial value of induction
- IROLinear *nd18;
+ IROLinear *nd18; // ifexpr?
IROLoopInd *induction;
int index20;
int index24;
diff --git a/includes/compiler/IroPointerAnalysis.h b/includes/compiler/IroPointerAnalysis.h
index 3266047..a6ed2c2 100644
--- a/includes/compiler/IroPointerAnalysis.h
+++ b/includes/compiler/IroPointerAnalysis.h
@@ -13,7 +13,7 @@ extern Boolean PointerAnalysis_IsENodePointerExprDefinite(Object *proc, ENode *n
extern Boolean PointerAnalysis_IsVariableValueDefinite(Object *proc, VarRecord *var, PointsToFunction *pointsTo);
extern void PointerAnalysis_LookupLinearNodePointerExpr(Object *proc, IROLinear *indirect, IROListNode **list);
extern void PointerAnalysis_LookupENodePointerExpr(Object *proc, ENode *indirect, ENodeList **list);
-extern void PointerAnalysis_LookupVariableIntoLinearNodeExprs(Object *proc, VarRecord *var, PointsToFunction *pointsTo, IROList **list);
+extern void PointerAnalysis_LookupVariableIntoLinearNodeExprs(Object *proc, VarRecord *var, PointsToFunction *pointsTo, IROListNode **list);
extern void PointerAnalysis_LookupVariableIntoENodeExprs(Object *proc, VarRecord *var, PointsToFunction *pointsTo, ENodeList **list);
extern void PointerAnalysis_GetFunctionKills(Object *proc, IROLinear *funccall, ObjectList **list);
extern void PointerAnalysis_GetFunctionDependencies(Object *proc, IROLinear *funccall, ObjectList **list);
diff --git a/includes/compiler/IroTransform.h b/includes/compiler/IroTransform.h
index 0ec4f4c..90bcf30 100644
--- a/includes/compiler/IroTransform.h
+++ b/includes/compiler/IroTransform.h
@@ -3,7 +3,11 @@
#include "compiler/IrOptimizer.h"
-// TODO
-extern Boolean IRO_TransformSelfAssignmentToAssignment(IROLinear *linear);
+extern void IRO_InitializeAssignmentOpArray(void);
+extern void IRO_InitializeComplementaryOpArray(void);
+extern void IRO_InitializeComplementaryOpLogicalArray(void);
+extern void IRO_DoTransformations(void);
+extern Boolean IRO_TransformSelfAssignmentToAssignment(IROLinear *nd);
+extern void IRO_TransformTree(Statement *statements);
#endif
diff --git a/includes/compiler/IroUnrollLoop.h b/includes/compiler/IroUnrollLoop.h
index 9e08d03..8a51a9b 100644
--- a/includes/compiler/IroUnrollLoop.h
+++ b/includes/compiler/IroUnrollLoop.h
@@ -2,21 +2,22 @@
#define COMPILER_IROUNROLLLOOP_H
#include "compiler/IrOptimizer.h"
+#include "compiler/IroLinearForm.h"
extern void IRO_LoopUnroller(void);
-extern void IRO_IterateForLoopBody();
-extern void IRO_LinearizeForLoopPostLoop();
-extern void BuildEarlyLoopExitTest();
-extern void BuildLoopExitTest();
-extern void IsIterationCountConstant();
-extern void NoOpBlock();
-extern void IRO_TestConstantIterationCount();
-extern void BuildOrigIterationCount();
-extern void BuildNewFinalvalue();
-extern void BuildUnrolledBodyEntryTest();
-extern void ChangeInductionReference();
-extern void UpdateInductionIncrement();
-extern void GenInitialAssignment();
-extern void GenNewInduction();
+extern void IRO_IterateForLoopBody(IRONode *start, IRONode *end, IROLoop *loop, IROLinear *destnode, SInt32 addConst, CInt64 *val, Boolean funkyFlag);
+extern void IRO_LinearizeForLoopPostLoop(IRONode *fnode1, IRONode *fnode2, IROLoop *loop, IRONode *fnode3, UInt32 unrollFactor);
+extern IROLinear *BuildEarlyLoopExitTest(IROLinearType type, IROList *list);
+extern IROLinear *BuildLoopExitTest(IROLinearType type, IROList *list);
+extern int IsIterationCountConstant(IROLoop *loop, CInt64 *pval);
+extern void NoOpBlock(IRONode *fnode);
+extern void IRO_TestConstantIterationCount(IROLoop *loop, CInt64 *iterCount, SInt32 vectorStride, UInt32 *unrollFactor, SInt32 *leftOver, UInt32 *needOrigLoop, UInt32 *needUnrollBodyTest, UInt32 *resetUnrolledFinalValue);
+extern IROLinear *BuildOrigIterationCount(IROList *list, IROLoop *loop);
+extern IROLinear *BuildNewFinalvalue(IROLinear *iterCount, UInt32 unrollFactor, IROList *list, IROLoop *loop);
+extern void BuildUnrolledBodyEntryTest(IROList *list, IROLinear *iterCount, UInt32 unrollFactor, CLabel *label);
+extern void ChangeInductionReference(IROLinear *first, IROLinear *last, CInt64 val, IROLoop *loop);
+extern IROLinear *UpdateInductionIncrement(IROLoop *loop, SInt32 value, IROLinear *before);
+extern void GenInitialAssignment(IROLoop *loop, Object *var, IROList *list);
+extern void GenNewInduction(void);
#endif
diff --git a/includes/compiler/IroUtil.h b/includes/compiler/IroUtil.h
index 68d34f5..502d0cd 100644
--- a/includes/compiler/IroUtil.h
+++ b/includes/compiler/IroUtil.h
@@ -2,6 +2,7 @@
#define COMPILER_IROUTIL_H
#include "compiler/IrOptimizer.h"
+#include "compiler/CInt64.h"
#include "compiler/CParser.h"
#ifdef __MWERKS__
@@ -87,7 +88,7 @@ extern IROLinear *IRO_LocateFather_Cut_And_Paste(IROLinear *a, IROLinear *b);
extern IROLinear *IRO_LocateFather_Cut_And_Paste_Without_Nopping(IROLinear *a, IROLinear *b);
extern void IRO_ReplaceReference(IROLinear *a, Object *obj, IROLinear *b);
extern void IRO_ReplaceReferenceWithNode(IROLinear *a, IROLinear *b);
-extern void IRO_GetTemp(IROExpr *expr);
+extern VarRecord *IRO_GetTemp(IROExpr *expr);
extern IROLinear *IRO_AssignToTemp(IROExpr *expr);
extern IROLinear *IRO_FindStart(IROLinear *linear);
extern void IRO_DeleteCommaNode(IROLinear *linear, IROExpr *expr);
@@ -99,7 +100,7 @@ typedef void (*WalkObjFunc)(Object *obj);
extern void IRO_WalkExcActions(ExceptionAction *action, WalkObjFunc func);
extern Boolean IRO_FunctionCallMightThrowException(IROLinear *linear);
extern IROLinear *IRO_NewIntConst(CInt64 val, Type *type);
-extern IROLinear *IRO_NewFloatConst(Float val, Type *type);
+extern IROLinear *IRO_NewFloatConst(const Float val, Type *type);
extern Boolean IRO_IsAddressMultiply(IROLinear *linear);
extern void IRO_SetupForUserBreakChecking(void);
extern void IRO_CheckForUserBreak(void);
@@ -109,4 +110,18 @@ inline Boolean IRO_IsUnsignedType(Type *type) {
return is_unsigned(type);
}
+// 4B4D40
+inline CInt64 IRO_MakeULong(UInt32 i) {
+ CInt64 val;
+ CInt64_SetULong(&val, i);
+ return val;
+}
+
+// 4BAAA0
+inline CInt64 IRO_MakeLong(SInt32 i) {
+ CInt64 val;
+ CInt64_SetLong(&val, i);
+ return val;
+}
+
#endif
diff --git a/includes/compiler/LoopDetection.h b/includes/compiler/LoopDetection.h
index 28dbb7a..5d9a729 100644
--- a/includes/compiler/LoopDetection.h
+++ b/includes/compiler/LoopDetection.h
@@ -86,7 +86,7 @@ typedef struct InductionVar {
extern Loop *loopsinflowgraph;
extern int loopdetection_nblocks;
extern BitVector *LoopTemp;
-extern void *LoopList_First;
+extern struct LoopList *LoopList_First;
extern void addblocktoloop(Loop *loop, PCodeBlock *block);
extern void insertpreheaderblock(Loop *loop);
diff --git a/includes/compiler/PCode.h b/includes/compiler/PCode.h
index b38d9e1..9b6103b 100644
--- a/includes/compiler/PCode.h
+++ b/includes/compiler/PCode.h
@@ -198,17 +198,18 @@ enum {
};
enum {
- fPCBlockFlag1 = 1, // prologue
- fPCBlockFlag2 = 2, // epilogue
- fPCBlockFlag4 = 4,
- fPCBlockFlag8 = 8, // scheduled?
- fPCBlockFlag10 = 0x10,
- fPCBlockFlag20 = 0x20,
+ fPCBlockFlag1 = 1, // fIsProlog
+ fPCBlockFlag2 = 2, // fIsEpilogue
+ fPCBlockFlag4 = 4, // fVisited
+ fPCBlockFlag8 = 8, // fScheduled
+ fPCBlockFlag10 = 0x10, // maybe fIsSwitch based off v3?
+ fPCBlockFlag20 = 0x20, // fDeleted
fPCBlockFlag2000 = 0x2000,
fPCBlockFlag4000 = 0x4000,
fPCBlockFlag6000 = 0x6000,
fPCBlockFlag8000 = 0x8000
};
+// v3 has fCCisLiveOnExit, fUnrolled, fAlignBlock
extern PCodeBlock *pcbasicblocks;
extern PCodeBlock *pclastblock;
diff --git a/includes/compiler/StackFrame.h b/includes/compiler/StackFrame.h
index 16c5316..af81845 100644
--- a/includes/compiler/StackFrame.h
+++ b/includes/compiler/StackFrame.h
@@ -7,12 +7,12 @@
#pragma options align=mac68k
#endif
-enum ObjClass {
+typedef enum ObjClass {
ObjClass0,
ObjClass1,
ObjClass2,
ObjClassMax
-};
+} ObjClass;
extern Boolean requires_frame;
extern Boolean makes_call;
diff --git a/includes/compiler/Switch.h b/includes/compiler/Switch.h
index 15e7d51..aeac03e 100644
--- a/includes/compiler/Switch.h
+++ b/includes/compiler/Switch.h
@@ -18,7 +18,7 @@ typedef struct CaseRange {
struct SwitchInfo {
SwitchCase *cases;
CLabel *defaultlabel;
- void *x8;
+ Type *x8;
};
extern ObjectList *switchtables;
diff --git a/includes/compiler/TOC.h b/includes/compiler/TOC.h
index c5eabb0..2d6d3be 100644
--- a/includes/compiler/TOC.h
+++ b/includes/compiler/TOC.h
@@ -13,13 +13,20 @@ typedef struct CodeLabelList {
CLabel *label;
} CodeLabelList;
+typedef struct PoolEntry {
+ struct PoolEntry *next;
+ Object *object;
+ SInt32 offset;
+ void *buffer;
+} PoolEntry;
+
extern ObjectList *toclist;
extern ObjectList *exceptionlist;
extern void *descriptorlist;
-extern void *floatconstpool;
-extern void *doubleconstpool;
+extern PoolEntry *floatconstpool;
+extern PoolEntry *doubleconstpool;
extern ObjectList *floatconstlist;
-extern void *vectorconstpool;
+extern PoolEntry *vectorconstpool;
extern ObjectList *vectorconstlist;
extern Object toc0;
extern Boolean no_descriptors;
@@ -34,8 +41,8 @@ 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 DeclarePooledConstants(void);
+extern Object *CreateFloatConst(Type *type, Float *data, SInt32 *pOffset);
extern void dumpcodelabels(Object *func);
typedef struct COVCResult {
// this struct might be used in other places too???
diff --git a/includes/compiler/common.h b/includes/compiler/common.h
index b5cb718..5eefd2c 100644
--- a/includes/compiler/common.h
+++ b/includes/compiler/common.h
@@ -235,6 +235,7 @@ typedef enum TemplDepSubType {
enum {
Q_CONST = 1,
Q_VOLATILE = 2,
+ Q_CV = Q_CONST | Q_VOLATILE,
Q_ASM = 4,
Q_PASCAL = 8,
Q_INLINE = 0x10,
diff --git a/includes/compiler/enode.h b/includes/compiler/enode.h
index 3697135..f7174f0 100644
--- a/includes/compiler/enode.h
+++ b/includes/compiler/enode.h
@@ -230,6 +230,7 @@ enum {
#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_IS4(_enode, _etype1, _etype2, _etype3, _etype4) ( ENODE_IS((_enode), (_etype1)) || ENODE_IS((_enode), (_etype2)) || ENODE_IS((_enode), (_etype3)) || ENODE_IS((_enode), (_etype4)) )
+#define ENODE_IS5(_enode, _etype1, _etype2, _etype3, _etype4, _etype5) ( ENODE_IS((_enode), (_etype1)) || ENODE_IS((_enode), (_etype2)) || ENODE_IS((_enode), (_etype3)) || ENODE_IS((_enode), (_etype4)) || ENODE_IS((_enode), (_etype5)) )
#define ENODE_IS_RANGE(_enode, _lo, _hi) ( ((_enode)->type >= (_lo)) && ((_enode)->type <= (_hi)) )
#define ENODE_QUALS(_enode) ( (UInt32) ( (_enode)->flags & ENODE_FLAG_QUALS ) )
#define ENODE_IS_INDIRECT_TO(_enode, _etype) ( ENODE_IS((_enode), EINDIRECT) && ENODE_IS((_enode)->data.monadic, (_etype)) )
@@ -288,6 +289,7 @@ enum {
case EBCLR: \
case EBSET
+// 9 to 0x2F
#define ENODE_CASE_DIADIC_ALL \
case EMUL: \
case EMULV: \
diff --git a/includes/compiler/objects.h b/includes/compiler/objects.h
index a9816cf..52bbf36 100644
--- a/includes/compiler/objects.h
+++ b/includes/compiler/objects.h
@@ -156,12 +156,12 @@ struct Object {
TemplFuncInstance *inst;
PTFList *ptfList;
ObjectList *argList;
- } func;
+ } func; // Used with DFUNC and DVFUNC
struct {
char *data;
SInt32 size;
InlineXRef *xrefs;
- } ifunc;
+ } ifunc; // Used with DINLINEFUNC
struct {
VarInfo *info;
SInt32 uid;
@@ -198,14 +198,6 @@ enum {
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))
@@ -238,6 +230,8 @@ enum {
VarInfoFlag80 = 0x80
};
+#define OBJECT_OR_ALIAS(_object) ( ((_object)->datatype == DALIAS) ? ((_object)->u.alias.object) : (_object) )
+
// placing these here until further notice
// unknown name, mwcppc.exe 7.0: 484870
diff --git a/includes/compiler/types.h b/includes/compiler/types.h
index 3bbba4f..4d6e16e 100644
--- a/includes/compiler/types.h
+++ b/includes/compiler/types.h
@@ -142,8 +142,8 @@ struct ClassList { // checked via CPrec
struct VClassList { // checked via CPrec
VClassList *next;
TypeClass *base;
- SInt32 offset;
- SInt32 voffset;
+ SInt32 offset; // offset within the class instance
+ SInt32 voffset; // offset within the vtable
Boolean has_override;
char alignsave;
};
@@ -205,7 +205,7 @@ enum {
CLASS_FLAGS_100 = 0x100, // is TemplClass
CLASS_FLAGS_800 = 0x800, // is TemplClassInst
CLASS_FLAGS_900 = 0x900,
- CLASS_FLAGS_1000 = 0x1000,
+ CLASS_FLAGS_1000 = 0x1000, // is empty class
CLASS_FLAGS_2000 = 0x2000,
CLASS_FLAGS_4000 = 0x4000,
CLASS_FLAGS_8000 = 0x8000
@@ -215,7 +215,8 @@ enum {
enum {
CLASS_EFLAGS_INTERNAL = 1,
CLASS_EFLAGS_IMPORT = 2,
- CLASS_EFLAGS_EXPORT = 4
+ CLASS_EFLAGS_EXPORT = 4,
+ CLASS_EFLAGS_F0 = 0xF0
};
enum {
@@ -269,8 +270,10 @@ enum {
FUNC_FLAGS_4000 = 0x4000, // objc method?
FUNC_FLAGS_CONST = 0x8000,
FUNC_FLAGS_VOLATILE = 0x10000,
+ FUNC_FLAGS_CV = FUNC_FLAGS_CONST | FUNC_FLAGS_VOLATILE,
FUNC_FLAGS_100000 = 0x100000, // is template?
FUNC_FLAGS_200000 = 0x200000,
+ FUNC_FLAGS_400000 = 0x400000, // covariant?
FUNC_FLAGS_800000 = 0x800000,
FUNC_FLAGS_900000 = 0x900000,
FUNC_FLAGS_4000000 = 0x4000000,
@@ -412,10 +415,12 @@ struct TypeList {
#define IS_TYPE_INT_OR_FLOAT(ty) ( IS_TYPE_INT(ty) || IS_TYPE_FLOAT(ty) )
#define IS_TYPE_STRUCT(ty) ( (ty)->type == TYPESTRUCT )
#define IS_TYPE_CLASS(ty) ( (ty)->type == TYPECLASS )
+#define IS_TYPE_SOM_CLASS(ty) ( (ty)->type == TYPECLASS && TYPE_CLASS((ty))->sominfo )
#define IS_TYPE_OBJC_CLASS(ty) ( (ty)->type == TYPECLASS && TYPE_CLASS((ty))->objcinfo )
#define IS_TYPE_FUNC(ty) ( (ty)->type == TYPEFUNC )
#define IS_TYPEFUNC_METHOD(ty) ( (ty)->flags & FUNC_FLAGS_METHOD )
#define IS_TYPE_METHOD(ty) ( IS_TYPE_FUNC(ty) && IS_TYPEFUNC_METHOD(TYPE_FUNC(ty)) )
+#define IS_TYPE_NONMETHOD(ty) ( IS_TYPE_FUNC(ty) && !IS_TYPEFUNC_METHOD(TYPE_FUNC(ty)) )
#define IS_TYPE_NONSTATIC_METHOD(ty) ( IS_TYPE_FUNC(ty) && IS_TYPEFUNC_METHOD(TYPE_FUNC(ty)) && !TYPE_METHOD(ty)->x26 )
#define IS_TYPE_STATIC_METHOD(ty) ( IS_TYPE_FUNC(ty) && IS_TYPEFUNC_METHOD(TYPE_FUNC(ty)) && TYPE_METHOD(ty)->x26 )
#define IS_TYPEFUNC_NONSTATIC_METHOD(ty) ( IS_TYPEFUNC_METHOD(ty) && !TYPE_METHOD(ty)->x26 )
@@ -428,7 +433,7 @@ struct TypeList {
#define IS_TYPE_ARRAY(ty) ( (ty)->type == TYPEARRAY )
#define IS_TYPE_BITFIELD(ty) ( (ty)->type == TYPEBITFIELD )
#define IS_TYPE_TEMPLDEPEXPR(ty) ( (ty)->type == TYPETEMPLDEPEXPR )
-#define IS_TYPESTRUCT_VECTOR(ty) ( TYPE_STRUCT(ty)->stype >= STRUCT_TYPE_4 && TYPE_STRUCT(ty)->stype <= STRUCT_TYPE_E )
+#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 )