mirror of
https://git.wuffs.org/MWCC
synced 2025-12-12 06:45:17 +00:00
getting close to done
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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);
|
||||
|
||||
12
includes/compiler/CPrec.h
Normal file
12
includes/compiler/CPrec.h
Normal file
@@ -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
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -18,7 +18,7 @@ typedef struct CaseRange {
|
||||
struct SwitchInfo {
|
||||
SwitchCase *cases;
|
||||
CLabel *defaultlabel;
|
||||
void *x8;
|
||||
Type *x8;
|
||||
};
|
||||
|
||||
extern ObjectList *switchtables;
|
||||
|
||||
@@ -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???
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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: \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 )
|
||||
|
||||
Reference in New Issue
Block a user