dump lots more code

This commit is contained in:
Ash Wolf
2022-12-29 12:32:55 +00:00
parent bc1321735c
commit fcfbafff31
129 changed files with 41229 additions and 1511 deletions

View File

@@ -27,8 +27,7 @@ inline void Bv_SetBit(UInt32 bit, BitVector *bv) {
if ((bit / 32) < bv->size) {
bv->data[bit / 32] |= 1 << (bit & 31);
} else {
#line 56
CError_FATAL();
CError_FATAL(56);
}
}

View File

@@ -16,7 +16,7 @@ extern void CABI_ReverseBitField(TypeBitfield *tbitfield);
extern void CABI_AddVTable(TypeClass *tclass);
extern SInt32 CABI_GetVTableOffset(TypeClass *tclass);
extern void CABI_LayoutClass(DeclE *decle, TypeClass *tclass);
extern void CABI_MakeDefaultArgConstructor(Object *obj, TypeClass *tclass);
extern void CABI_MakeDefaultArgConstructor(TypeClass *tclass, Object *obj);
extern ENode *CABI_MakeThisExpr(TypeClass *tclass, SInt32 offset);
extern SInt32 CABI_GetCtorOffsetOffset(TypeClass *tclass, TypeClass *base);
extern Object *CABI_ConstructorCallsNew(TypeClass *tclass);

View File

@@ -3,4 +3,28 @@
#include "compiler/common.h"
extern Boolean gUseTokenStreamSource;
extern Boolean gForceSourceLoc;
extern Boolean gUseNameTable;
extern void CBrowse_Setup(CParams *params);
extern void CBrowse_Finish(CParams *params);
extern void CBrowse_Cleanup(CParams *params);
extern void CBrowse_BeginClass(DeclInfo *di, GList *gl);
extern void CBrowse_AddClassMemberVar(ObjMemberVar *ivar, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_AddClassMemberFunction(Object *object, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_AddClassMemberData(Object *object, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_EndClass(SInt32 offset, GList *gl);
extern void CBrowse_BeginStruct(DeclInfo *di, TypeStruct *tstruct, GList *gl);
extern void CBrowse_AddStructMember(StructMember *member, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_EndStruct(SInt32 offset, GList *gl);
extern void CBrowse_NewTypedef(NameSpace *nspace, HashNameNode *name, CPrepFileInfo *file1, CPrepFileInfo *file2, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_NewEnum(NameSpace *nspace, HashNameNode *name, CPrepFileInfo *file1, CPrepFileInfo *file2, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_NewEnumConstant(NameSpace *nspace, HashNameNode *name, CPrepFileInfo *file1, CPrepFileInfo *file2, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_NewFunction(Object *object, CPrepFileInfo *file1, CPrepFileInfo *file2, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_NewData(Object *object, CPrepFileInfo *file1, CPrepFileInfo *file2, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_NewMacro(Macro *macro, CPrepFileInfo *file, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_NewTemplateClass(TemplClass *tmclass, CPrepFileInfo *file, SInt32 startOffset, SInt32 endOffset);
extern void CBrowse_NewTemplateFunc(TemplateFunction *tmfunc);
#endif

View File

@@ -10,13 +10,19 @@
#endif
// named because it's 0xE bytes big (hurr)
typedef struct DeclE {
struct DeclE {
ObjBase **objlist;
void *x4;
unsigned short x8;
unsigned short x8; // lex_order_count?
unsigned short xA;
Boolean xC;
} DeclE;
};
// what the fuck am I?
struct DeclFucker {
NameSpace *nspace;
void *mystery4;
};
struct DeclInfo {
Type *thetype;
@@ -31,10 +37,10 @@ struct DeclInfo {
ENode *x24;
TemplClass *x28;
TemplArg *expltargs;
void *x30;
void *x34;
void *x38;
Boolean x3C;
TemplParam *x30;
DeclFucker *fucker34;
TemplateFunction *x38;
UInt8 x3C; // related to template nindex
Boolean x3D;
short x3E;
short storageclass;
@@ -46,7 +52,7 @@ struct DeclInfo {
Boolean x47;
Boolean x48;
Boolean x49;
Boolean x4A;
Boolean x4A; // objc related
Boolean x4B;
Boolean x4C;
Boolean x4D;
@@ -60,7 +66,11 @@ struct DeclInfo {
Boolean x55;
Boolean x56;
Boolean x57;
FileOffsetInfo fileoffsetinfo;
//FileOffsetInfo fileoffsetinfo;
CPrepFileInfo *file;
CPrepFileInfo *file2;
SInt32 x60; // file offset?
short x64;
};
typedef struct BigDeclInfo {
@@ -113,7 +123,7 @@ extern void CDecl_UnpackDeclInfo(DeclInfo *declinfo, PackedDeclInfo *packed);
extern void CDecl_AddFriend(TypeClass *tclass, Object *friendfunc, TypeClass *friendclass);
extern void CDecl_CheckCtorIntegrity(FuncArg *args, TypeClass *tclass);
extern void CDecl_MakeVBaseList(TypeClass *tclass);
extern Boolean CDecl_CheckNewBase(TypeClass *a, TypeClass *b, Boolean flag);
extern Boolean CDecl_CheckNewBase(TypeClass *tclass, TypeClass *baseclass, Boolean is_virtual);
extern TypeMethod *CDecl_MakeDefaultDtorType(TypeClass *tclass, Boolean is_virtual);
extern void CDecl_CompleteClass(DeclE *decle, TypeClass *tclass);
extern TypeClass *CDecl_DefineClass(NameSpace *nspace, HashNameNode *name, TypeClass *tclass, short mode, Boolean flag2, Boolean flag3);

View File

@@ -3,9 +3,9 @@
#include "compiler/common.h"
#define CError_ASSERT(cond) if (!(cond)) { CError_Internal(__FILE__, __LINE__); }
#define CError_FAIL(cond) if (cond) { CError_Internal(__FILE__, __LINE__); }
#define CError_FATAL() do { CError_Internal(__FILE__, __LINE__); } while (0)
#define CError_ASSERT(line, cond) if (!(cond)) { CError_Internal(__FILE__, line); }
#define CError_FAIL(line, cond) if (cond) { CError_Internal(__FILE__, line); }
#define CError_FATAL(line) do { CError_Internal(__FILE__, line); } while (0)
enum {
CErrorStr100 = 100,

View File

@@ -3,7 +3,29 @@
#include "compiler/common.h"
// TODO
extern Boolean CExcept_CanThrowException(Object *obj, Boolean flag);
extern ExceptionAction *cexcept_dobjstack;
extern Boolean cexcept_hasdobjects;
extern Boolean cexcept_magic;
extern void CExcept_Setup(void);
extern Boolean CExcept_CanThrowException(Object *object, Boolean flag);
extern void CExcept_CheckStackRefs(ExceptionAction *actions);
extern void CExcept_CompareSpecifications(ExceptSpecList *a, ExceptSpecList *b);
extern Boolean CExcept_ActionCompare(ExceptionAction *a, ExceptionAction *b);
extern int CExcept_IsSubList(ExceptionAction *a, ExceptionAction *b);
extern Boolean CExcept_ActionNeedsDestruction(ExceptionAction *action);
extern ENode *CExcept_RegisterDestructorObject(Object *local, SInt32 offset, Object *dtor, Boolean flag);
extern void CExcept_RegisterLocalArray(Statement *stmt, Object *localarray, Object *dtor, SInt32 elements, SInt32 element_size);
extern void CExcept_RegisterDeleteObject(Statement *stmt, Object *pointerobject, Object *deletefunc);
extern void CExcept_Terminate(void);
extern void CExcept_Magic(void);
extern void CExcept_ArrayInit(void);
extern void CExcept_RegisterMember(Statement *stmt, Object *objectptr, SInt32 offset, Object *dtor, Object *cond, Boolean isMember);
extern void CExcept_RegisterMemberArray(Statement *stmt, Object *objectptr, SInt32 offset, Object *dtor, SInt32 elements, SInt32 element_size);
extern Statement *CExcept_ActionCleanup(ExceptionAction *ea, Statement *stmt);
extern void CExcept_ScanExceptionSpecification(TypeFunc *tfunc);
extern ENode *CExcept_ScanThrowExpression(void);
extern void CExcept_ScanTryBlock(DeclThing *dt, Boolean flag);
extern void CExcept_ExceptionTansform(Statement *stmt);
#endif

View File

@@ -48,6 +48,7 @@ typedef enum StatementType {
enum {
StmtFlag_1 = 1,
StmtFlag_2 = 2,
StmtFlag_8 = 8,
StmtFlag_10 = 0x10
};
@@ -139,7 +140,7 @@ extern void CFunc_DestructorCleanup(Statement *stmt);
extern Statement *CFunc_GenerateLoop(Statement *stmt, Type *type, ENode *expr1, ENode *expr2, ENode *expr3, ENode *expr4, ENode (*callback)(ENode *, ENode *));
extern void CFunc_CompoundStatement(DeclThing *thing);
extern void CFunc_SetupNewFuncArgs(Object *obj, FuncArg *args);
extern NameSpace *CFunc_FuncGenSetup(Statement *stmt);
extern NameSpace *CFunc_FuncGenSetup(Statement *stmt, Object *func);
extern void CFunc_GetGlobalCompilerState(CFuncSave *state);
extern void CFunc_SetGlobalCompilerState(CFuncSave *state);
extern void CFunc_Gen(Statement *stmt, Object *obj, UInt8 unk);

View File

@@ -3,4 +3,9 @@
#include "compiler/common.h"
extern void CIRTrans_Setup(void);
extern void CIRTrans_Cleanup(void);
extern ENode *CIRTrans_TransformOpAss(ENode *expr);
extern void CIRTrans_Transform(void);
#endif

View File

@@ -14,12 +14,12 @@ typedef void (*InsertExprCB)(ENode *expr);
typedef ENode *(*RegisterObjectCB)(Type *type, Object *obj, SInt32 offset, void *);
typedef ENode *(*TempNodeCB)(Type *type, Boolean flag);
typedef struct OLinkList {
struct OLinkList *next;
Object *obj;
struct OLinkList {
OLinkList *next;
Object *obj; // the object containing a relocation
SInt32 offset;
SInt32 somevalue;
} OLinkList;
};
typedef struct PooledString {
struct PooledString *next;

View File

@@ -14,12 +14,29 @@ typedef struct CI_Var {
Type *type;
UInt32 qual;
UInt8 sflags;
UInt8 xD;
UInt8 xE;
SInt8 xD;
SInt8 xE;
} CI_Var;
enum {
CI_SFLAGS_NoClass = 0,
CI_SFLAGS_Register = 1,
CI_SFLAGS_Auto = 2,
CI_SFLAGS_HasObjectFlag2 = 0x80
};
typedef struct CI_SwitchCase {
short labelID;
CInt64 min;
CInt64 max;
} CI_SwitchCase;
typedef struct CI_Switch {
int fix_me;
ENode *expr;
void *unkSwitch8;
short defaultlabelID;
short numcases;
CI_SwitchCase cases[0];
} CI_Switch;
typedef struct CI_Statement {
@@ -37,10 +54,23 @@ typedef struct CI_Statement {
SInt16 statementnum;
} ifgoto;
CI_Switch *switchdata;
// TODO: Figure out the one for Inline ASM
struct {
void *data;
SInt32 size;
} asmdata;
} u;
} CI_Statement;
typedef enum {
CI_CanInline0,
CI_CanInline1,
CI_CanInline2,
CI_CanInline3,
CI_CanInline4,
CI_CanInline5,
CI_CanInline6
} CI_CanInline;
struct CI_FuncData {
short numarguments;
CI_Var *arguments;
@@ -53,7 +83,7 @@ struct CI_FuncData {
SInt32 functionbodyoffset;
HashNameNode *functionbodypath;
SInt32 symdeclend;
Boolean can_inline;
UInt8 can_inline;
};
typedef enum {
@@ -71,11 +101,10 @@ typedef struct CI_Action {
FileOffsetInfo fileoffset;
TStream stream;
TypeClass *tclass;
CI_ActionType actiontype;
} inlinefunc;
struct {
Type *a;
Type *b;
TemplClass *templ;
TemplClassInst *inst;
TemplateMember *tmemb;
} memberfunc;
struct {
@@ -83,6 +112,7 @@ typedef struct CI_Action {
TemplFuncInstance *inst;
} templatefunc;
} u;
CI_ActionType actiontype;
} CI_Action;
typedef enum {
@@ -96,20 +126,20 @@ typedef enum {
extern CI_Action *cinline_tactionlist;
extern void CInline_Init(void);
extern SInt32 CInline_GetLocalID(Object *obj);
extern SInt32 CInline_GetLocalID(Object *object);
extern Boolean CInline_ExpressionHasSideEffect(ENode *expr);
extern ENode *CInline_CopyExpression(ENode *expr, CInlineCopyMode mode);
extern void CInline_SerializeStatement(Statement *stmt);
extern Object *CInline_GetLocalObj(SInt32 id, Boolean flag);
extern SInt16 CInline_GetStatementNumber(Statement *first, Statement *stmt);
extern void CInline_PackIFunctionData(CI_FuncData *packed, Statement *stmt, Object *obj);
extern void CInline_UnpackIFunctionData(Object *obj, CI_FuncData *packed, Statement *stmt);
extern void CInline_AddDefaultFunctionAction(Object *obj);
extern void CInline_AddInlineFunctionAction(Object *obj, TypeClass *tclass, FileOffsetInfo *fileoffset, TStream *stream, Boolean flag);
extern void CInline_AddMemberFunctionAction(Object *obj, Type *a, Type *b, TemplateMember *tmemb);
extern void CInline_AddTemplateFunctionAction(Object *obj, TemplateFunction *func, TemplFuncInstance *inst);
extern void CInline_ObjectAddrRef(Object *obj);
extern void CInline_GenFunc(Statement *stmt, Object *obj, UInt8 unk);
extern void CInline_PackIFunctionData(CI_FuncData *packed, Statement *stmt, Object *object);
extern void CInline_UnpackIFunctionData(Object *object, CI_FuncData *packed, Statement *firstStmt);
extern void CInline_AddDefaultFunctionAction(Object *object);
extern void CInline_AddInlineFunctionAction(Object *object, TypeClass *tclass, FileOffsetInfo *fileoffset, TStream *stream, Boolean flag);
extern void CInline_AddMemberFunctionAction(Object *object, TemplClass *templ, TemplClassInst *inst, TemplateMember *tmemb);
extern void CInline_AddTemplateFunctionAction(Object *object, TemplateFunction *func, TemplFuncInstance *inst);
extern void CInline_ObjectAddrRef(Object *object);
extern void CInline_GenFunc(Statement *stmt, Object *object, UInt8 unk);
extern Boolean CInline_CanFreeLHeap(void);
extern Boolean CInline_GenerateDeferredFuncs(void);
extern void CInline_Finish(void);

View File

@@ -2,5 +2,40 @@
#define COMPILER_COBJC_H
#include "compiler/common.h"
#include "compiler/objc.h"
extern Type *cobjc_type_class;
extern Type *cobjc_type_id;
extern Type *cobjc_type_sel;
extern TypeClass *cobjc_currentclass;
extern ObjCSelector **cobjc_selhashtable;
extern BClassList *cobjc_classdefs;
extern ObjCProtocol *cobjc_protocols;
extern long cobjc_selrefcount;
extern long cobjc_classrefcount;
extern long cobjc_stringcount;
extern Boolean cobjc_encodemethod;
extern void CObjC_Setup(void);
extern void CObjC_Cleanup(void);
extern void CObjC_GenerateModule(void);
extern Type *CObjC_GetObjCType_id(Boolean flag);
extern Boolean CObjC_IsType_id(Type *type);
extern Boolean CObjC_IsCompatibleType(Type *a, Type *b);
extern void CObjC_TranslateSelectorToken(void);
extern void CObjC_ParseDefs(TypeStruct *tstruct);
extern Type *CObjC_ParseID(void);
extern Type *CObjC_ParseTypeProtocol(TypeClass *tclass);
extern void CObjC_ParseInterface(void);
extern void CObjC_ParseImplementation(void);
extern void CObjC_ParseProtocol(void);
extern void CObjC_ParseClassDeclaration(void);
extern void *CObjC_ParseIdentifier();
extern ENode *CObjC_MakeSendMsgExpr(ENode *objexpr, TypeClass *tclass, ObjCNamedArg *namedArgs, ENodeList *unnamedArgs, UInt8 calltype, Boolean isSuper);
extern ENode *CObjC_ParseMessageExpression(void);
extern ENode *CObjC_ParseEncodeExpression(void);
extern ENode *CObjC_ParseAtExpression(void);
extern ENode *CObjC_ParseProtocolExpression(void);
extern ENode *CObjC_ParseSelectorExpression(void);
#endif

View File

@@ -3,4 +3,8 @@
#include "compiler/common.h"
extern ENode *CObjC_CheckModernSendMessage(TypeClass *tclass, ENode *expr);
extern ENode *CObjC_New(TypeClass *tclass);
extern ENode *CObjC_Delete(TypeClass *tclass, ENode *objexpr);
#endif

View File

@@ -59,8 +59,8 @@ typedef struct COpts {
Boolean codegen_dynamic;
Boolean codegen_pic;
Boolean no_common;
char no_implicit_templates;
char absolutepath; // determines the path written to debug info
Boolean no_implicit_templates;
Boolean absolutepath; // determines the path written to debug info
char x06; // linker/objgen related
short cpu;
char schedule_cpu;
@@ -80,10 +80,10 @@ typedef struct COpts {
char x1D;
UInt8 x1E; // some register used in TOC_use_isel
UInt8 gen_fsel;
char ppc_opt_bclr_bcctr;
Boolean ppc_opt_bclr_bcctr;
Boolean use_lmw_stmw;
char report_heap_info;
char misaligned_mem_access;
Boolean misaligned_mem_access;
Boolean switch_tables;
char prepare_compress;
char some_alignment; // used in CMach_AllocationAlignment
@@ -93,11 +93,11 @@ typedef struct COpts {
short inlinelevel;
int inline_max_size;
int inline_max_total_size;
char inline_bottom_up;
Boolean inline_bottom_up;
Boolean cplusplus;
Boolean ecplusplus;
Boolean objective_c;
char objc_strict;
Boolean objc_strict;
Boolean ARM_conform;
char ARM_scoping;
Boolean require_prototypes;
@@ -110,17 +110,17 @@ typedef struct COpts {
Boolean ignore_oldstyle;
Boolean cpp_extensions;
Boolean pointercast_lvalue;
char useRTTI;
Boolean useRTTI;
Boolean delete_exception;
char _4B;
Boolean oldalignment;
Boolean unsignedchars;
Boolean multibyteaware;
char autoinline;
char defer_codegen;
Boolean autoinline;
Boolean defer_codegen;
Boolean direct_to_som;
char som_env_check;
char som_call_opt;
Boolean som_env_check;
Boolean som_call_opt;
Boolean booltruefalse;
char old_enum_mangler;
Boolean longlong;
@@ -135,7 +135,7 @@ typedef struct COpts {
Boolean vbase_ctor_offset;
char vbase_abi_v2;
Boolean def_inherited;
char template_patch;
Boolean template_patch;
char template_friends;
char faster_pch_gen;
Boolean array_new_delete;
@@ -143,8 +143,8 @@ typedef struct COpts {
char def_inline_tfuncs;
Boolean arg_dep_lookup;
Boolean simple_prepdump;
char line_prepdump;
char fullpath_prepdump;
Boolean line_prepdump;
Boolean fullpath_prepdump;
char old_mtemplparser;
char suppress_init_code;
Boolean reverse_bitfields;
@@ -154,14 +154,14 @@ typedef struct COpts {
Boolean longlong_prepeval;
Boolean const_strings;
char dumpir;
char experimental;
Boolean experimental;
Boolean gcc_extensions;
char stdc_fp_contract;
char stdc_fenv_access;
char stdc_cx_limitedr;
Boolean old_argmatch;
char optEH;
char optEH2;
Boolean optEH;
Boolean optEH2;
Boolean new_mangler;
char microsoft;
Boolean warningerrors;
@@ -177,7 +177,7 @@ typedef struct COpts {
char warn_hidevirtual;
Boolean warn_largeargs;
Boolean warn_implicitconv;
char warn_notinlined;
Boolean warn_notinlined;
Boolean warn_structclass;
Boolean warn_padding;
Boolean warn_no_side_effect;
@@ -191,8 +191,8 @@ typedef struct COpts {
Boolean readonly_strings;
Boolean exceptions;
char _99;
char dont_inline;
char always_inline;
Boolean dont_inline;
Boolean always_inline;
Boolean peephole;
Boolean global_optimizer;
char side_effects;
@@ -200,7 +200,7 @@ typedef struct COpts {
Boolean import;
Boolean export;
Boolean lib_export;
char nosyminline;
Boolean nosyminline;
char force_active;
char optimizationlevel;
Boolean optimize_for_size;

View File

@@ -8,15 +8,15 @@
#pragma options align=mac68k
#endif
typedef struct Macro {
struct Macro *next;
struct Macro {
Macro *next;
HashNameNode *name;
void *c;
unsigned short xC;
Boolean is_special;
Boolean xF;
void *e;
} Macro;
};
typedef struct TokenStack {
char *pos;
char *macrostart;

View File

@@ -3,4 +3,8 @@
#include "compiler/common.h"
extern void CPrep_PreprocessDumpNewLine(void);
extern void CPrep_PreprocessDumpFileInfo(Boolean flag);
extern void CPrep_Preprocess(void);
#endif

View File

@@ -3,4 +3,11 @@
#include "compiler/common.h"
extern OLinkList *CRTTI_ConstructVTableHeaders(TypeClass *tclass, void *data, OLinkList *links);
extern ENode *CRTTI_ParseTypeID(void);
extern ENode *CRTTI_Parse_dynamic_cast(void);
extern ENode *CRTTI_Parse_static_cast(void);
extern ENode *CRTTI_Parse_reinterpret_cast(void);
extern ENode *CRTTI_Parse_const_cast(void);
#endif

View File

@@ -2,5 +2,42 @@
#define COMPILER_CSOM_H
#include "compiler/common.h"
#include "compiler/som.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct CSOMStub {
struct CSOMStub *next;
Object *object;
TypeClass *tclass;
SInt32 offset;
UInt8 x10;
} CSOMStub;
#ifdef __MWERKS__
#pragma options align=reset
#endif
extern CSOMStub *csom_stubs;
extern void CSOM_Setup(Boolean flag);
extern void CSOM_Cleanup(void);
extern void CSOM_CheckFuncType(TypeFunc *tfunc);
extern void CSOM_MakeSOMClass(TypeClass *tclass);
extern void CSOM_ClassComplete(TypeClass *tclass);
extern void CSOM_GenerateClassStructures(TypeClass *tclass);
extern void CSOM_PragmaReleaseOrder(void);
extern void CSOM_PragmaClassVersion(void);
extern void CSOM_PragmaMetaClass(void);
extern void CSOM_PragmaCallStyle(void);
extern void CSOM_FixNewDeleteFunctype(TypeFunc *tfunc);
extern ENode *CSOM_New(TypeClass *tclass);
extern ENode *CSOM_Delete(TypeClass *tclass, ENode *objExpr);
extern void CSOM_InitAutoClass(Object *object);
extern ENode *CSOM_SOMSelfObjectExpr(TypeClass *tclass);
extern void CSOM_InitSOMSelf(TypeClass *tclass, Statement *stmt);
extern ENode *CSOM_EnvCheck(ENode *funccall, ENodeList *checkArg);
extern ENode *CSOM_MemberVarAccess(BClassList *path, ObjMemberVar *ivar, ENode *thisExpr);
extern ENode *CSOM_MethodAccess(BClassList *path, Object *func, Boolean flag);
#endif

View File

@@ -13,12 +13,12 @@ extern TypeClass *cscope_currentclass;
extern NameSpace *cscope_current;
extern NameSpace *cscope_root;
typedef struct CScopeSave {
struct CScopeSave {
NameSpace *current;
TypeClass *currentclass;
Object *currentfunc;
Boolean is_member_func;
} CScopeSave; // assumed name
}; // assumed name
// this might be called NameResult
typedef struct CScopeParseResult {

View File

@@ -3,4 +3,21 @@
#include "compiler/common.h"
extern TemplClass *CTemplClass_GetMasterTemplate(TemplClass *tmclass);
extern void CTemplClass_RegisterUsingDecl(TemplClass *tmclass, TypeTemplDep *type, AccessType access);
extern void CTemplClass_RegisterFriend(TemplClass *tmclass, DeclInfo *di);
extern void CTemplClass_RegisterBaseClass(TemplClass *tmclass, Type *type, AccessType access, Boolean is_virtual);
extern void CTemplClass_RegisterEnumType(TemplClass *tmclass, TypeEnum *enumtype);
extern void CTemplClass_RegisterEnumerator(TemplClass *tmclass, ObjEnumConst *objenumconst, ENode *initexpr);
extern void CTemplClass_RegisterObjectInit(TemplClass *tmclass, Object *object, ENode *initexpr);
extern void CTemplClass_RegisterObjectDef(TemplClass *tmclass, ObjBase *refobj);
extern void CTemplClass_CompleteClass(TemplClass *templ, DeclE *de);
extern TemplClassInst *CTemplClass_GetInstance(TemplClass *tmclass, TemplArg *args1, TemplArg *args2);
extern TemplateMember *CTemplClass_DefineMember(TemplClass *tmclass, Object *object, FileOffsetInfo *foi, TStream *stream);
extern void CTemplClass_ParsePartialSpecialization(DeclFucker *what_is_this, TemplParam *params, short mode, SInt32 *offset);
extern void CTemplClass_ParseClass(DeclFucker *what_is_this, TemplParam *params, short mode, SInt32 *offset);
extern Boolean CTemplClass_FindPartialTemplate(TemplArg *args, TemplClass **resultTempl, TemplArg **resultArgs);
extern TemplClass *CTemplClass_DefineNestedClass(TemplClass *parent, HashNameNode *name, short mode);
extern Boolean CTempl_InstantiateTemplateClass(TypeClass *tclass);
#endif

View File

@@ -2,5 +2,18 @@
#define COMPILER_CTEMPLATEFUNC_H
#include "compiler/common.h"
#include "compiler/CExpr.h"
extern Boolean CTempl_CanDeduceFunc(Object *object, TypeFunc *tfunc, TemplArg *args);
extern TemplFuncInstance *CTempl_CheckFuncInstance(Object *object1, TypeFunc *tfunc, TemplArg *args, Object *object2);
extern TemplFuncInstance *CTempl_DeduceFunc(Object *object1, TypeFunc *tfunc, TemplArg *args, Object *object2, Boolean flag);
extern Boolean CTempl_FuncIsMoreSpecialized(Object *object1, Object *object2);
extern Object *CTempl_PartialOrdering(Object *object, ObjectList *list, int count);
extern int CTempl_GetTemplateArgumentExpressionIndex(TemplArg *arg);
extern Boolean CTempl_DeduceType(Type *type1, UInt32 qual1, Type *type2, UInt32 qual2, TemplArg *argArray, Boolean flag1, Boolean flag2);
extern void CTempl_FuncMatch(NameSpaceObjectList *list, TemplArg *args, ENodeList *argexprs, Match13 *match13ptr, ENode *expr);
extern Object *CTempl_DeduceFromFunctionCall(Object *funcobj, TemplArg *templargs, ENodeList *argexprs);
extern Object *CTempl_DeduceFromConversion(Object *funcobj, Type *type, UInt32 qual);
extern Object *CTempl_TemplateFunctionCheck(DeclInfo *di, NameSpaceObjectList *nsol);
#endif

View File

@@ -3,4 +3,21 @@
#include "compiler/common.h"
extern TemplClass *ctempl_templates;
extern TemplateFunction *ctempl_templatefuncs;
extern TemplStack *ctempl_curinstance;
extern void CTempl_Setup(void);
extern void CTempl_Cleanup(void);
extern TemplArg *CTempl_ParseUncheckTemplArgs(TemplParam *params, Boolean is_global);
extern Type *CTempl_ParseTemplTemplParam(TypeTemplDep *type);
extern Type *CTempl_ClassGetType(TemplClass *templ);
extern Boolean CTempl_IsQualifiedMember(DeclInfo *di, Type *type, NameSpace **resultnspace);
extern void CTempl_Parse(TemplClass *templ, AccessType access);
extern void CTempl_ParseInstanceScopeFunction(Object *funcobj, TemplClassInst *inst, TypeClass *tclass);
extern Boolean CTempl_GenFuncInstance(TemplateFunction *templ, TemplFuncInstance *inst, Boolean flag);
extern void CTempl_InstantiateMember(TemplClass *templ, TemplClassInst *inst, TemplateMember *tmemb, Object *object, Boolean flag);
extern Boolean CTempl_Instantiate(void);
extern Boolean CTempl_InlineFunctionCheck(Object *funcobj);
#endif

View File

@@ -2,5 +2,45 @@
#define COMPILER_CTEMPLATETOOLS_H
#include "compiler/common.h"
#include "compiler/enode.h"
extern short ctempl_instdepth;
extern void CTemplTool_PushInstance(TemplStack *stack, TypeClass *tmclass, Object *func);
extern void CTemplTool_PopInstance(TemplStack *stack);
extern ENode *CTempTool_GetPTMTemplArgExpr(ENode *expr, Type *type);
extern Boolean CTemplTool_InitDeduceInfo(DeduceInfo *info, TemplParam *params, TemplArg *args, Boolean flag);
extern void CTemplTool_InsertTemplateParameter(NameSpace *nspace, TemplParam *param);
extern TemplArg *CTemplTool_MakeTemplArgList(DeduceInfo *info);
extern Boolean CTemplTool_IsIdenticalTemplArgList(TemplArg *args, TemplParam *params);
extern Type *CTemplTool_GetSelfRefTemplate(Type *type);
extern TemplateFunction *CTemplTool_GetFuncTempl(Object *object);
extern Boolean CTemplTool_ParamHasDefaultArg(TemplParam *param);
extern void CTemplTool_MergeDefaultArgs(TemplParam *dest, TemplParam *src);
extern void CTemplTool_MergeArgNames(TypeFunc *src, TypeFunc *dest);
extern Boolean CTemplTool_EqualParams(TemplParam *a, TemplParam *b, Boolean copyNames);
extern NameSpace *CTemplTool_SetupTemplateArgumentNameSpace(TemplParam *params, TemplArg *args, Boolean is_global);
extern void CTemplTool_SetupOuterTemplateArgumentNameSpace(NameSpace *nspace);
extern NameSpace *CTemplTool_InsertTemplateArgumentNameSpace(TemplParam *params, TemplClassInst *inst, CScopeSave *save);
extern void CTemplTool_RemoveOuterTemplateArgumentNameSpace(NameSpace *nspace);
extern void CTemplTool_RemoveTemplateArgumentNameSpace(NameSpace *nspace, TemplClassInst *inst, CScopeSave *save);
extern Boolean CTemplTool_IsTemplateArgumentDependentType(Type *type);
extern Boolean CTemplTool_IsTemplateArgumentDependentExpression(ENode *expr);
extern Boolean CTemplTool_IsSameTemplate(TemplParam *params, TemplArg *args);
extern TemplClass *CTemplTool_IsTemplate(TypeTemplDep *ttd);
extern Type *CTemplTool_IsDependentTemplate(TemplClass *tmclass, TemplArg *args);
extern Boolean CTemplTool_EqualExprTypes(ENode *a, ENode *b);
extern ENode *CTempl_MakeTemplDepExpr(ENode *left, ENodeType nt, ENode *right);
extern void CTemplTool_CheckTemplArgType(Type *type);
extern Boolean CTemplTool_EqualArgs(TemplArg *a, TemplArg *b);
extern TemplArg *CTemplTool_MakeGlobalTemplArgCopy(TemplArg *args);
extern Boolean CTemplTool_TemplDepTypeCompare(TypeTemplDep *a, TypeTemplDep *b);
extern Type *CTemplTool_DeduceArgDepType(TemplArg *args, Type *type, UInt32 qual, UInt32 *resultQual);
extern ENode *CTemplTool_DeduceExpr(TypeDeduce *deduce, ENode *expr);
extern ENode *CTemplTool_DeduceDefaultArg(Object *func, ENode *expr);
extern FuncArg *CTemplTool_DeduceArgCopy(TypeDeduce *deduce, FuncArg *args);
extern Type *CTemplTool_DeduceTypeCopy(TypeDeduce *deduce, Type *type, UInt32 *resultQual);
extern Type *CTemplTool_ResolveMemberSelfRefs(TemplClass *templ, Type *type, UInt32 *resultQual);
extern Boolean CTemplTool_IsSameTemplateType(Type *a, Type *b);
#endif

View File

@@ -49,7 +49,7 @@ typedef void (*ArgumentProcessor)(Object *obj, short reg);
extern void process_arguments(ArgumentProcessor func, Boolean flag);
extern void move_assigned_argument(Object *obj, short reg);
extern void assign_labels(Statement *stmt);
extern void CodeGen_Generator(Statement **statements, Object *func, UInt8 mysteryFlag, Boolean callOnModuleBind);
extern void CodeGen_Generator(Statement *statements, Object *func, UInt8 mysteryFlag, Boolean callOnModuleBind);
extern void CodeGen_GenVDispatchThunk(Object *thunkobj, Object *obj, SInt32 a, SInt32 b, SInt32 c);
extern void CodeGen_SetupRuntimeObjects(void);
extern Boolean CodeGen_ReInitRuntimeObjects(Boolean is_precompiler);
@@ -59,10 +59,10 @@ extern void CodeGen_ParseDeclSpec(HashNameNode *identifier, DeclInfo *declinfo);
extern void CodeGen_ParsePragma(HashNameNode *name);
extern void CodeGen_UpdateObject(Object *object);
extern void CodeGen_UpdateBackEndOptions(void);
extern void CodeGen_objc_method_self_offset();
extern void CodeGen_objc_method_sel_offset();
extern void CodeGen_objc_method_arg_offset();
extern void CodeGen_objc_method_args_size();
extern SInt32 CodeGen_objc_method_self_offset(ObjCMethod *meth);
extern SInt32 CodeGen_objc_method_sel_offset(ObjCMethod *meth);
extern SInt32 CodeGen_objc_method_arg_offset(ObjCMethod *meth, ObjCMethodArg *arg);
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);

View File

@@ -40,12 +40,12 @@ typedef struct _HeapInfo {
SInt32 largest_free_block;
} HeapInfo;
typedef struct GList {
struct GList {
char **data;
SInt32 size;
SInt32 hndlsize;
SInt32 growsize;
} GList;
};
extern long hash_name_id;
extern HashNameNode **name_hash_nodes;
@@ -119,12 +119,17 @@ extern void memclr(void *ptr, SInt32 size);
extern void memclrw(void *ptr, SInt32 size);
extern void CToLowercase(char *a, char *b);
extern short getbit(SInt32 l);
extern inline SInt32 CTool_EndianReadWord32(void *value) {
return *((SInt32 *) value);
}
extern inline UInt32 CTool_EndianConvertWord32(UInt32 value) {
return value;
}
#ifdef ENDIAN_CONVERSION
extern UInt16 CTool_EndianConvertWord16(UInt16 theword);
extern UInt32 CTool_EndianConvertWord32(UInt32 theword);
extern void CTool_EndianConvertMem(UInt8 *data, short len);
extern UInt32 CTool_EndianReadWord32(void *ptr);
#else
#define CTool_EndianConvertWord32(value) value
#define CTool_EndianConvertWord16(value) value
#define CTool_EndianConvertMem(data, len) ((void)0)
#define CTool_EndianReadWord32(ptr) (*((UInt32 *) (ptr)))
#endif
extern void CTool_EndianConvertWord64(CInt64 ci, char *result);
extern UInt16 CTool_EndianConvertInPlaceWord16Ptr(UInt16 *x);
extern UInt32 CTool_EndianConvertInPlaceWord32Ptr(UInt32 *x);

View File

@@ -62,6 +62,11 @@ struct ExceptionAction {
Object *dtor;
Object *element_size;
} destroy_partial_array;
struct { // TODO: merge me with destroy_member
Object *objectptr;
Object *dtor;
SInt32 offset;
} destroy_base;
struct {
Object *objectptr;
Object *dtor;
@@ -115,8 +120,33 @@ struct ExceptionAction {
ExceptionActionType type;
};
typedef struct EANode {
struct EANode *dagListNext;
struct EANode *prev;
ExceptionAction *action;
UInt16 count;
UInt16 xE;
} EANode;
typedef struct PCAction {
struct PCAction *next;
struct PCAction *prev;
PCode *firstInstr;
PCode *lastInstr;
ExceptionAction *actions;
EANode *node;
} PCAction;
#ifdef __MWERKS__
#pragma options align=reset
#endif
extern EANode *DAG[EAT_NACTIONS];
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

View File

@@ -4,9 +4,9 @@
#include "compiler/common.h"
extern void setup_assembly_argument(Object *obj, short i);
extern void assign_local_addresses();
extern void Assembler();
extern void SetupAssembler();
extern void CleanupAssembler();
extern void assign_local_addresses(void);
extern void Assembler(Object *func);
extern void SetupAssembler(void);
extern void CleanupAssembler(void);
#endif

View File

@@ -3,4 +3,6 @@
#include "compiler/common.h"
extern void call_function(ENode *expr, Operand *output);
#endif

View File

@@ -3,4 +3,16 @@
#include "compiler/common.h"
extern int unnamedstructs;
extern int GenStab_Type(char *name, Type *type);
extern void GenStab_Function(Object *func, UInt32 offset);
extern void GenStab_FunctionEnd(Object *func, SInt32 relocID, UInt32 offset);
extern void GenStab_Line(UInt32 line, UInt32 offset);
extern void GenStab_Parameter(Object *object);
extern void GenStab_Var(Object *object);
extern void GenStab_IncludeFile(char *path);
extern void GenStab_SourceFile(char *path);
extern void GenStab_Setup(void);
#endif

View File

@@ -3,4 +3,6 @@
#include "compiler/common.h"
extern void globallyoptimizepcode(Object *func);
#endif

View File

@@ -5,7 +5,7 @@
#include "compiler/InlineAsm.h"
extern char asm_alloc_flags[10];
extern unsigned char sm_section;
extern Section sm_section;
extern UInt32 cpu;
extern SInt32 fralloc_parameter_area_size;
extern Boolean user_responsible_for_frame;

View File

@@ -3,4 +3,329 @@
#include "compiler/common.h"
typedef enum Intrinsics {
Intrinsic_000,
Intrinsic_001,
Intrinsic_002,
Intrinsic_003,
Intrinsic_004,
Intrinsic_005,
Intrinsic_006,
Intrinsic_007,
Intrinsic_008,
Intrinsic_009,
Intrinsic_010,
Intrinsic_011,
Intrinsic_012,
Intrinsic_013,
Intrinsic_014,
Intrinsic_015,
Intrinsic_016,
Intrinsic_017,
Intrinsic_018,
Intrinsic_019,
Intrinsic_020,
Intrinsic_021,
Intrinsic_022,
Intrinsic_023,
Intrinsic_024,
Intrinsic_025,
Intrinsic_026,
Intrinsic_027,
Intrinsic_028,
Intrinsic_029,
Intrinsic_030,
Intrinsic_031,
Intrinsic_032,
Intrinsic_033,
Intrinsic_034,
Intrinsic_035,
Intrinsic_036,
Intrinsic_037,
Intrinsic_038,
Intrinsic_039,
Intrinsic_040,
Intrinsic_041,
Intrinsic_042,
Intrinsic_043,
Intrinsic_044,
Intrinsic_045,
Intrinsic_046,
Intrinsic_047,
Intrinsic_048,
Intrinsic_049,
Intrinsic_050,
Intrinsic_051,
Intrinsic_052,
Intrinsic_053,
Intrinsic_054,
Intrinsic_055,
Intrinsic_056,
Intrinsic_057,
Intrinsic_058,
Intrinsic_059,
Intrinsic_060,
Intrinsic_061,
Intrinsic_062,
Intrinsic_063,
Intrinsic_064,
Intrinsic_065,
Intrinsic_066,
Intrinsic_067,
Intrinsic_068,
Intrinsic_069,
Intrinsic_070,
Intrinsic_071,
Intrinsic_072,
Intrinsic_073,
Intrinsic_074,
Intrinsic_075,
Intrinsic_076,
Intrinsic_077,
Intrinsic_078,
Intrinsic_079,
Intrinsic_080,
Intrinsic_081,
Intrinsic_082,
Intrinsic_083,
Intrinsic_084,
Intrinsic_085,
Intrinsic_086,
Intrinsic_087,
Intrinsic_088,
Intrinsic_089,
Intrinsic_090,
Intrinsic_091,
Intrinsic_092,
Intrinsic_093,
Intrinsic_094,
Intrinsic_095,
Intrinsic_096,
Intrinsic_097,
Intrinsic_098,
Intrinsic_099,
Intrinsic_100,
Intrinsic_101,
Intrinsic_102,
Intrinsic_103,
Intrinsic_104,
Intrinsic_105,
Intrinsic_106,
Intrinsic_107,
Intrinsic_108,
Intrinsic_109,
Intrinsic_110,
Intrinsic_111,
Intrinsic_112,
Intrinsic_113,
Intrinsic_114,
Intrinsic_115,
Intrinsic_116,
Intrinsic_117,
Intrinsic_118,
Intrinsic_119,
Intrinsic_120,
Intrinsic_121,
Intrinsic_122,
Intrinsic_123,
Intrinsic_124,
Intrinsic_125,
Intrinsic_126,
Intrinsic_127,
Intrinsic_128,
Intrinsic_129,
Intrinsic_130,
Intrinsic_131,
Intrinsic_132,
Intrinsic_133,
Intrinsic_134,
Intrinsic_135,
Intrinsic_136,
Intrinsic_137,
Intrinsic_138,
Intrinsic_139,
Intrinsic_140,
Intrinsic_141,
Intrinsic_142,
Intrinsic_143,
Intrinsic_144,
Intrinsic_145,
Intrinsic_146,
Intrinsic_147,
Intrinsic_148,
Intrinsic_149,
Intrinsic_150,
Intrinsic_151,
Intrinsic_152,
Intrinsic_153,
Intrinsic_154,
Intrinsic_155,
Intrinsic_156,
Intrinsic_157,
Intrinsic_158,
Intrinsic_159,
Intrinsic_160,
Intrinsic_161,
Intrinsic_162,
Intrinsic_163,
Intrinsic_164,
Intrinsic_165,
Intrinsic_166,
Intrinsic_167,
Intrinsic_168,
Intrinsic_169,
Intrinsic_170,
Intrinsic_171,
Intrinsic_172,
Intrinsic_173,
Intrinsic_174,
Intrinsic_175,
Intrinsic_176,
Intrinsic_177,
Intrinsic_178,
Intrinsic_179,
Intrinsic_180,
Intrinsic_181,
Intrinsic_182,
Intrinsic_183,
Intrinsic_184,
Intrinsic_185,
Intrinsic_186,
Intrinsic_187,
Intrinsic_188,
Intrinsic_189,
Intrinsic_190,
Intrinsic_191,
Intrinsic_192,
Intrinsic_193,
Intrinsic_194,
Intrinsic_195,
Intrinsic_196,
Intrinsic_197,
Intrinsic_198,
Intrinsic_199,
Intrinsic_200,
Intrinsic_201,
Intrinsic_202,
Intrinsic_203,
Intrinsic_204,
Intrinsic_205,
Intrinsic_206,
Intrinsic_207,
Intrinsic_208,
Intrinsic_209,
Intrinsic_210,
Intrinsic_211,
Intrinsic_212,
Intrinsic_213,
Intrinsic_214,
Intrinsic_215,
Intrinsic_216,
Intrinsic_217,
Intrinsic_218,
Intrinsic_219,
Intrinsic_220,
Intrinsic_221,
Intrinsic_222,
Intrinsic_223,
Intrinsic_224,
Intrinsic_225,
Intrinsic_226,
Intrinsic_227,
Intrinsic_228,
Intrinsic_229,
Intrinsic_230,
Intrinsic_231,
Intrinsic_232,
Intrinsic_233,
Intrinsic_234,
Intrinsic_235,
Intrinsic_236,
Intrinsic_237,
Intrinsic_238,
Intrinsic_239,
Intrinsic_240,
Intrinsic_241,
Intrinsic_242,
Intrinsic_243,
Intrinsic_244,
Intrinsic_245,
Intrinsic_246,
Intrinsic_247,
Intrinsic_248,
Intrinsic_249,
Intrinsic_250,
Intrinsic_251,
Intrinsic_252,
Intrinsic_253,
Intrinsic_254,
Intrinsic_255,
Intrinsic_256,
Intrinsic_257,
Intrinsic_258,
Intrinsic_259,
Intrinsic_260,
Intrinsic_261,
Intrinsic_262,
Intrinsic_263,
Intrinsic_264,
Intrinsic_265,
Intrinsic_266,
Intrinsic_267,
Intrinsic_268,
Intrinsic_269,
Intrinsic_270,
Intrinsic_271,
Intrinsic_272,
Intrinsic_273,
Intrinsic_274,
Intrinsic_275,
Intrinsic_276,
Intrinsic_277,
Intrinsic_278,
Intrinsic_279,
Intrinsic_280,
Intrinsic_281,
Intrinsic_282,
Intrinsic_283,
Intrinsic_284,
Intrinsic_285,
Intrinsic_286,
Intrinsic_287,
Intrinsic_288,
Intrinsic_289,
Intrinsic_290,
Intrinsic_291,
Intrinsic_292,
Intrinsic_293,
Intrinsic_294,
Intrinsic_295,
Intrinsic_296,
Intrinsic_297,
Intrinsic_298,
Intrinsic_299,
Intrinsic_300,
Intrinsic_301,
Intrinsic_302,
Intrinsic_303,
Intrinsic_304,
Intrinsic_305,
Intrinsic_306,
Intrinsic_307,
Intrinsic_308,
Intrinsic_309,
Intrinsic_310,
MaxIntrinsics
} Intrinsics;
extern Object *__memcpy_object;
extern int VectorConditions; // unused?
extern int is_intrinsic_function_call(ENode *funccall);
extern ENode *Intrinsics_HandleIntrinsicCall(Object *func, ENodeList *args);
extern void call_intrinsic_function(ENode *funccall, short outputReg, Operand *output);
extern void Intrinsics_SetupRuntimeObjects(void);
extern Boolean Intrinsics_ReInitRuntimeObjects(Boolean flag);
extern Boolean Intrinsics_IsPublicRuntimeObject(Object *object);
#endif

View File

@@ -90,8 +90,7 @@ inline void IROFlowgraph_sub_4C3880(IRONodes *nodes, UInt16 index) {
nodes->indices[(nodes->base + nodes->num) % IRO_NumNodes] = index;
nodes->num++;
} else {
#line 93
CError_FATAL();
CError_FATAL(93);
}
}

View File

@@ -2,5 +2,285 @@
#define COMPILER_MACHO_H
#include "compiler/common.h"
#include "compiler/CompilerTools.h"
typedef struct MachOReloc MachOReloc;
typedef struct MachOSection MachOSection;
typedef struct MachOSegment MachOSegment;
typedef struct MachOSymbol MachOSymbol;
typedef struct SymbolData SymbolData;
struct SymbolData {
union {
char *name;
SInt32 strx;
} u;
UInt8 type;
SInt16 desc;
UInt32 value;
MachOSection *section;
};
typedef enum RelocType {
RT_0,
RT_1,
RT_2,
RT_3,
RT_4,
RT_5,
RT_6,
RT_7,
RT_8,
RT_9
} RelocType;
typedef struct RelocDataT {
RelocType type;
UInt8 privFlag;
UInt8 x2;
UInt8 x3;
UInt32 x4;
MachOSection *section;
UInt32 gapC;
MachOSection *sect10;
char *name;
SInt32 x18;
} RelocDataT;
#define N_GSYM 0x20
#define N_FNAME 0x22
#define N_FUN 0x24
#define N_STSYM 0x26
#define N_LCSYM 0x28
#define N_BNSYM 0x2E
#define N_OPT 0x3C
#define N_RSYM 0x40
#define N_SLINE 0x44
#define N_ENSYM 0x4E
#define N_SSYM 0x60
#define N_SO 0x64
#define N_OSO 0x66
#define N_LSYM 0x80
#define N_BINCL 0x82
#define N_SOL 0x84
#define N_PARAMS 0x86
#define N_VERSION 0x88
#define N_OLEVEL 0x8A
#define N_PSYM 0xA0
#define N_EINCL 0xA2
#define N_ENTRY 0xA4
#define N_LBRAC 0xC0
#define N_EXCL 0xC2
#define N_RBRAC 0xE0
#define N_BCOMM 0xE2
#define N_ECOMM 0xE4
#define N_ECOML 0xE8
#define N_LENG 0xFE
#define N_STAB 0xE0
#define N_PEXT 0x10
#define N_TYPE 0x0E
#define N_EXT 0x01
#define N_UNDF 0
#define N_ABS 2
#define N_SECT 0xE
#define N_PBUD 0xC
#define N_INDR 0xA
// Mach-O header
struct mach_header {
uint32_t magic;
SInt32 cputype;
SInt32 cpusubtype;
uint32_t filetype;
uint32_t ncmds;
uint32_t sizeofcmds;
uint32_t flags;
};
#define MH_MAGIC 0xfeedface
#define MH_OBJECT 1
#define CPU_TYPE_POWERPC 18
#define CPU_SUBTYPE_MC98000_ALL 0
// load commands
#define LC_SEGMENT 1
#define LC_SYMTAB 2
#define LC_DYSYMTAB 11
// segments
struct segment_command {
uint32_t cmd;
uint32_t cmdsize;
char segname[16];
uint32_t vmaddr;
uint32_t vmsize;
uint32_t fileoff;
uint32_t filesize;
SInt32 maxprot;
SInt32 initprot;
uint32_t nsects;
uint32_t flags;
};
// sections
struct section {
char sectname[16];
char segname[16];
uint32_t addr;
uint32_t size;
uint32_t offset;
uint32_t align;
uint32_t reloff;
uint32_t nreloc;
uint32_t flags;
uint32_t reserved1;
uint32_t reserved2;
};
#define S_REGULAR 0
#define S_ZEROFILL 1
#define S_CSTRING_LITERALS 2
#define S_4BYTE_LITERALS 3
#define S_8BYTE_LITERALS 4
#define S_LITERAL_POINTERS 5
#define S_NON_LAZY_SYMBOL_POINTERS 6
#define S_LAZY_SYMBOL_POINTERS 7
#define S_SYMBOL_STUBS 8
#define S_MOD_INIT_FUNC_POINTERS 9
#define S_MOD_TERM_FUNC_POINTERS 10
#define S_COALESCED 11
#define S_GB_ZEROFILL 12
#define S_INTERPOSING 13
#define S_16BYTE_LITERALS 14
#define S_ATTR_PURE_INSTRUCTIONS 0x80000000
#define S_ATTR_NO_TOC 0x40000000
#define S_ATTR_STRIP_STATIC_SYMS 0x20000000
#define S_ATTR_NO_DEAD_STRIP 0x10000000
#define S_ATTR_LIVE_SUPPORT 0x8000000
#define S_ATTR_SELF_MODIFYING_CODE 0x4000000
#define S_ATTR_DBUG 0x2000000
#define S_ATTR_SOME_INSTRUCTIONS 0x400
#define S_ATTR_EXT_RELOC 0x200
#define S_ATTR_LOC_RELOC 0x100
// symbols
struct symtab_command {
uint32_t cmd;
uint32_t cmdsize;
uint32_t symoff;
uint32_t nsyms;
uint32_t stroff;
uint32_t strsize;
};
struct dysymtab_command {
uint32_t cmd;
uint32_t cmdsize;
uint32_t ilocalsym;
uint32_t nlocalsym;
uint32_t iextdefsym;
uint32_t nextdefsym;
uint32_t iundefsym;
uint32_t nundefsym;
uint32_t tocoff;
uint32_t ntoc;
uint32_t modtaboff;
uint32_t nmodtab;
uint32_t extrefsymoff;
uint32_t nextrefsyms;
uint32_t indirectsymoff;
uint32_t nindirectsyms;
uint32_t extreloff;
uint32_t nextrel;
uint32_t locreloff;
uint32_t nlocrel;
};
struct nlist {
int32_t n_strx;
uint8_t n_type;
uint8_t n_sect;
int16_t n_desc;
uint32_t n_value;
};
// relocations
enum reloc_type_ppc {
PPC_RELOC_VANILLA,
PPC_RELOC_PAIR,
PPC_RELOC_BR14,
PPC_RELOC_BR24,
PPC_RELOC_HI16,
PPC_RELOC_LO16,
PPC_RELOC_HA16,
PPC_RELOC_LO14,
PPC_RELOC_SECTDIFF,
PPC_RELOC_PB_LA_PTR,
PPC_RELOC_HI16_SECTDIFF,
PPC_RELOC_LO16_SECTDIFF,
PPC_RELOC_HA16_SECTDIFF,
PPC_RELOC_JBSR,
PPC_RELOC_LO14_SECTDIFF,
PPC_RELOC_LOCAL_SECTDIFF
};
#define R_SCATTERED 0x80000000
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
struct MachOSection {
struct section section;
GList glist;
MachOReloc *firstReloc;
MachOReloc *lastReloc;
int x5C;
UInt32 num;
UInt32 id;
MachOSection *next;
};
struct MachOSegment {
struct segment_command cmd;
MachOSection *firstSection;
MachOSection *lastSection;
MachOSegment *next;
};
struct MachOReloc {
char length; // size of the relocation
char reltype;
char is_extern;
char is_pcrel; // was relocated pc relative already
UInt32 address; // offset to what is being relocated
UInt32 value;
MachOReloc *next;
};
struct MachOSymbol {
SymbolData data;
UInt32 index;
MachOSymbol *next;
};
#ifdef __MWERKS__
#pragma options align=reset
#endif
extern void MachO_Setup(void);
extern void MachO_Finish(void);
extern void MachO_Cleanup(void);
extern MachOSegment *MachO_CreateSegment(char *segname, int maxprot, int initprot, UInt32 flags);
extern MachOSection *MachO_CreateSection(MachOSegment *segment, char *segname, char *sectname, UInt32 align, UInt32 flags, UInt32 sectionID);
extern GList *MachO_GetGList(MachOSection *section);
extern void MachO_SetSectionSize(void);
extern void MachO_Relocate(MachOSection *section, UInt32 address, UInt32 value, char length, char is_pcrel, Boolean is_extern, int reltype);
extern UInt32 MachO_DeclareSymbol(char *name, MachOSection *section, UInt32 value, Boolean isAbsolute, short type, short desc);
extern void MachO_ReOrderSections(void);
extern void MachO_AddIndirectSymbol(SInt32 symbol);
extern UInt32 MachO_NumIndirectSym(void);
extern SInt32 MachO_OutputStab(SymbolData *data, SInt32 strIndex);
#endif

View File

@@ -2,8 +2,74 @@
#define COMPILER_OBJGENMACHO_H
#include "compiler/common.h"
#include "compiler/MachO.h"
// more stuff goes here
extern void ObjGen_DeclareSwitchTable(Object *a, Object *b);
typedef enum MWReloc {
MW_RELOC_0 = 0,
MW_RELOC_2_BR24 = 2,
MW_RELOC_3 = 3,
MW_RELOC_4 = 4,
MW_RELOC_5_LO16 = 5,
MW_RELOC_6_HI16 = 6,
MW_RELOC_7_HA16 = 7,
MW_RELOC_8 = 8,
MW_RELOC_9 = 9
} MWReloc;
extern Boolean declare_readonly;
extern SInt32 symdeclend;
extern SInt32 symdecloffset;
// this conflicts with other files
//extern SInt32 nexttypeid;
extern GList symtypemodule;
extern SInt32 last_base_offset[N_SECTIONS];
extern MachOSection *Sections[N_SECTIONS];
extern Section last_function_sect_id;
extern MachOSection *last_function_sect;
extern SInt32 pic_base_offset;
extern SInt32 ObjGen_MakeSectReloc(MachOSection *section);
extern SInt32 ObjGen_GetHashNodeRelocID(Object *object, MachOSection *section, SInt32 value);
extern void ObjGen_Setup(void);
extern void ObjGen_DeclareFloatConst(Object *object);
extern void ObjGen_DeclareVectorConst(Object *object);
extern void ObjGen_Finish(void);
extern void ObjGen_Cleanup(void);
extern void ObjGen_SetupSym(void);
extern void ObjGen_DeclareData(Object *object, char *data, OLinkList *olinklist, UInt32 size);
extern void ObjGen_DeclareReadOnlyData(Object *object, char *data, OLinkList *olinklist, UInt32 size);
extern void ObjGen_SegmentName(void);
extern void ObjGen_SymFunc(Object *function);
extern void ObjGenMach_SymFuncEnd(Object *function, UInt32 offset);
extern void ObjGen_CodeSetup(void);
extern void ObjGen_CodeCleanup(void);
extern void ObjGen_SrcBreakName(HashNameNode *name, SInt32 fileModDate, Boolean flag);
extern GList *ObjGen_GetSectionGList(MachOSection *section);
extern MachOSection *ObjGen_DeclareFunction(Object *object);
extern MachOSection *ObjGen_DeclareCode(Object *object);
extern MachOSection *ObjGen_DeclareMachSection();
extern void ObjGen_Relocate(MachOSection *section, SInt32 offset, SInt32 relocID, RelocType relocType, MWReloc mwRelType);
extern void ObjGen_RelocateObj(MachOSection *section, SInt32 offset, Object *object, MWReloc mwRelType);
extern SInt32 ObjGen_DeclareLiteralString(UInt32 len, char *data, SInt32 align);
extern UInt32 ObjGen_GetSectSize(MachOSection *section);
extern void ObjGen_GetExtName(SInt32 id, char *buf);
extern void ObjGen_PicRelocate(MachOSection *section, SInt32 offset, SInt32 relocID, SInt32 picOffset);
extern SInt32 ObjGen_GetRelocOffset(SInt32 id);
extern Boolean ObjGen_IsExternalVar(SInt32 id);
extern SInt32 ObjGen_DeclareInit(UInt32 len, char *data, SInt32 align);
extern void CodeGen_GenDynLinkStub(MachOSection *a, MachOSection *b, SInt32 relocID);
extern void ObjGen_DeclarePICBase(Object *object, SInt32 offset);
extern void ObjGen_DeclareEntry(Object *object, SInt32 offset);
extern void ObjGen_DeclareExceptionTables(Object *object, SInt32 codesize, char *data, SInt32 len, OLinkList *refs);
extern void ObjGen_DeclareCodeLabel(Object *labelobj, SInt32 offset, Object *funcobj);
extern void ObjGen_DeclareSwitchTable(Object *tableobj, Object *funcobj);
extern void ObjGen_DeclareTracebackTable(Object *tableobj, void *data, SInt32 size);
extern void ObjGen_DeclareSymInfo(void);
extern void ObjGen_Line(UInt32 line, UInt32 offset);
extern void ObjGen_OutputDebugInfo(Object *funcobj);
extern SInt32 ObjGen_OutputStab(SymbolData *symbol, SInt32 strIdx);
extern void ObjGen_SetSectName();
extern void ObjGen_DeclareInitFunction(Object *funcobj);
extern Boolean ObjGen_IsExported(Object *object);
#endif

View File

@@ -34,19 +34,19 @@ enum {
typedef enum {
RefType_0,
RefType_1,
RefType_2,
RefType_3,
RefType_1, // like D, but 32-bit?
RefType_2, // matches MW_RELOC_3?
RefType_3, // matches MW_RELOC_4?
RefType_4,
RefType_5,
RefType_6,
RefType_7,
RefType_8,
RefType_6, // LO16?
RefType_7, // HI16?
RefType_8, // HA16?
RefType_9,
RefType_A,
RefType_B,
RefType_C,
RefType_D
RefType_A, // another LO
RefType_B, // another HA
RefType_C, // another HA
RefType_D // another LO
} PCRefType;
struct PCodeArg {
@@ -94,6 +94,12 @@ struct PCodeArg {
(_op)->data.reg.reg == (_reg) && \
((_op)->data.reg.effect & EffectWrite))
#define PC_OP_IS_R_OR_W_REGISTER(_op, _rclass, _reg) \
((_op)->kind == PCOp_REGISTER && \
(_op)->arg == (_rclass) && \
(_op)->data.reg.reg == (_reg) && \
((_op)->data.reg.effect & (EffectRead | EffectWrite)))
#define PC_OP_IS_ANY_REGISTER(_op, _rclass) \
((_op)->kind == PCOp_REGISTER && \
(_op)->arg == (_rclass))
@@ -152,16 +158,16 @@ struct PCodeBlock {
/* PCode Flags */
enum {
fPCodeFlag1 = 1,
fPCodeFlag2 = 2, // some kinda load
fPCodeFlag4 = 4, // some kinda store
fPCodeFlag8 = 8,
fPCodeFlag10 = 0x10,
fPCodeFlag20 = 0x20,
fPCodeFlag1 = 1, // some kinds of branches
fPCodeFlag2 = 2, // read from memory
fPCodeFlag4 = 4, // write to memory
fPCodeFlag8 = 8, // other kinds of branches
fPCodeFlag10 = 0x10, // moves
fPCodeFlag20 = 0x20, // indexed operations
// Always valid
fIsConst = 0x40,
fIsVolatile = 0x80,
fSideEffects = 0x100,
fSideEffects = 0x100, // instructions that do weird stuff with PPC state
fPCodeFlag200 = 0x200, // ?
fPCodeFlag400 = 0x400, // ?
fPCodeFlag800 = 0x800, // ?
@@ -171,23 +177,24 @@ enum {
fPCodeFlag8000 = 0x8000,
fPCodeFlag20000 = 0x20000, // some kinda load?
fPCodeFlag40000 = 0x40000, // some kinda store?
// Set 1 only
// Set 1 (branches) only
fLink = 0x1000000,
fBranchNotTaken = 0x4000000,
fBranchTaken = 0x8000000,
fAbsolute = 0x10000000,
// Set 2 only
// Set 2 (non-branches) only
fIsPtrOp = 0x20,
fOverflow = 0x800000,
fSetsCarry = 0x10000000,
fPCodeFlag20000000 = 0x20000000, // record bit?
// ??
fPCodeFlag2000000 = 0x2000000,
fPCodeFlag4000000 = 0x4000000,
fPCodeFlag8000000 = 0x8000000,
fPCodeFlag10000000 = 0x10000000,
fPCodeFlag20000000 = 0x20000000, // record bit?
fPCodeFlag40000000 = 0x40000000,
fPCodeFlag80000000 = 0x80000000
fPCodeFlag80000000 = 0x80000000,
fPCodeFlagC0000000 = 0xC0000000
};
enum {
@@ -198,7 +205,9 @@ enum {
fPCBlockFlag10 = 0x10,
fPCBlockFlag20 = 0x20,
fPCBlockFlag2000 = 0x2000,
fPCBlockFlag4000 = 0x4000
fPCBlockFlag4000 = 0x4000,
fPCBlockFlag6000 = 0x6000,
fPCBlockFlag8000 = 0x8000
};
extern PCodeBlock *pcbasicblocks;

View File

@@ -3,8 +3,26 @@
#include "compiler/common.h"
extern UInt32 assemblepcode(PCode *instr, UInt32 offset, PCodeArg *dummyArg);
extern void optimizefinalbranches();
extern void assemblefunction();
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct WeirdOperand {
short type; // matches MWReloc
Object *x2;
UInt32 x6;
} WeirdOperand;
typedef struct EntryPoint {
struct EntryPoint *next;
Object *object;
PCodeBlock *block;
} EntryPoint;
#ifdef __MWERKS__
#pragma options align=reset
#endif
extern UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop);
extern SInt32 optimizefinalbranches(SInt32 codesize);
extern SInt32 assemblefunction(Object *func, EntryPoint *entrypoints);
#endif

View File

@@ -461,9 +461,7 @@ typedef enum Opcode {
PC_DOZI = 0x1A9,
PC_RLMI = 0x1AA,
PC_RRIB = 0x1AB,
PC_PENTRY = 0x1AC,
PC_PEXIT = 0x1AD,
OPCODE_MAX = 0x1AE
OPCODE_MAX = 0x1AC
} Opcode;
//#define PC_B 0x0
//#define PC_BL 0x1

View File

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

View File

@@ -3,4 +3,8 @@
#include "compiler/common.h"
extern void peepholeoptimizeforward(Object *func);
extern void peepholemergeblocks(Object *func, Boolean flag);
extern void peepholeoptimizepcode(Object *func);
#endif

View File

@@ -4,8 +4,11 @@
#include "compiler/common.h"
enum {
RegisterInvalid = -1,
Register0 = 0,
Register2 = 2,
Register3 = 3,
Register4 = 4,
RegisterMax = 32
};

View File

@@ -0,0 +1,8 @@
#ifndef COMPILER_SCANFLOAT_H
#define COMPILER_SCANFLOAT_H
#include "compiler/common.h"
extern char *ScanFloat(const char *str, double *result, Boolean *failed);
#endif

View File

@@ -29,7 +29,7 @@ extern void assign_locals_to_memory(ObjectList *first);
extern void compute_frame_sizes(void);
extern void generate_prologue(PCodeBlock *block, Boolean has_varargs);
extern void generate_epilogue(PCodeBlock *block, Boolean add_blr);
extern void allocate_dynamic_stack_space(Boolean flag1, int reg1, int reg2, SInt32 size);
extern void allocate_dynamic_stack_space(Boolean isConstantSize, int reg1, int reg2, SInt32 size);
extern char *generate_traceback(SInt32 funcsize, char *funcname, SInt32 *tbsize, Object *func);
extern void check_dynamic_aligned_frame(void);
extern void move_varargs_to_memory(void);
@@ -43,9 +43,9 @@ extern void update_out_param_align(SInt32 align);
extern void update_in_param_align(SInt32 align);
extern void update_frame_align(SInt32 align);
extern SInt32 local_offset_32(Object *obj);
extern SInt16 local_offset_lo(Object *obj, SInt32 offset);
extern SInt16 local_offset_ha(Object *obj, SInt32 offset);
extern SInt16 local_offset_16(Object *obj);
extern SInt32 local_offset_lo(Object *obj, SInt32 offset);
extern SInt32 local_offset_ha(Object *obj, SInt32 offset);
extern SInt32 local_offset_16(Object *obj);
extern Boolean local_is_16bit_offset(Object *obj);
extern int local_base_register(Object *obj);
extern Boolean is_large_frame(void);

View File

@@ -3,4 +3,11 @@
#include "compiler/common.h"
extern void make_addressable(Operand *opnd, SInt32 offset, int unusedArg);
extern void move_block(Operand *dst, Operand *src, SInt32 len, SInt32 align);
extern void load_small_block_into_reg(short dstReg, Operand *srcOpnd, Type *type, SInt32 align);
extern void load_small_block_into_reg_pair(short dstRegLo, short dstRegHi, Operand *srcOpnd, Type *type, SInt32 align);
extern void store_small_block_from_reg(short srcReg, Operand *dstOpnd, Type *type, SInt32 align);
extern void store_small_block_from_reg_pair(short srcRegLo, short srcRegHi, Operand *dstOpnd, Type *type, SInt32 align);
#endif

View File

@@ -3,22 +3,23 @@
#include "compiler/common.h"
typedef struct SwitchCase {
struct SwitchCase *next;
struct SwitchCase {
SwitchCase *next;
CLabel *label;
CInt64 min;
CInt64 max;
} SwitchCase;
};
typedef struct CaseRange {
CInt64 min;
CInt64 range;
PCodeLabel *label;
} CaseRange;
typedef struct SwitchInfo {
struct SwitchInfo {
SwitchCase *cases;
CLabel *defaultlabel;
} SwitchInfo;
void *x8;
};
extern ObjectList *switchtables;

View File

@@ -3,4 +3,7 @@
#include "compiler/common.h"
extern void MWUnmangleClassName(const char *input, char *output, size_t maxLen);
extern void MWUnmangle(const char *input, char *output, size_t maxLen);
#endif

View File

@@ -92,12 +92,9 @@ typedef enum Section {
SECT_MW_SWITCH = 30,
SECT_8BYTE_LITERALS = 31,
SECT_4BYTE_LITERALS = 32,
// one of these next 2 is missing in pro7
SECT_MOD_INIT_FUNC = 33,
SECT_MOD_TERM_FUNC = 34,
SECT_CONST = 34,
SECT_CONST_PTR = 35,
// everything after here is known ok
SECT_NONLAZY_PTRS = 36,
SECT_COMMON_VARS = 37,
SECT_16BYTE_LITERALS = 38,
@@ -106,8 +103,8 @@ typedef enum Section {
SECT_UDATA_COALESCE = 41,
SECT_CONST_COALESCE = 42,
SECT_CONST_PTR_COALESCE = 43,
SECT_CSTR_COALESCE = 44,
N_SECTIONS = 45
//SECT_CSTR_COALESCE = 44,
N_SECTIONS = 44
} Section;
typedef struct Alias Alias;
@@ -117,18 +114,27 @@ typedef struct CLabel CLabel;
typedef struct ClassList ClassList;
typedef struct CParams CParams;
typedef struct CPrepFileInfo CPrepFileInfo;
typedef struct CScopeSave CScopeSave;
typedef struct DeclE DeclE;
typedef struct DeclFucker DeclFucker;
typedef struct DeclInfo DeclInfo;
typedef struct DeclThing DeclThing; // rename me please
typedef struct DeduceInfo DeduceInfo;
typedef struct DefAction DefAction;
typedef struct DefArgCtorInfo DefArgCtorInfo;
typedef struct DepName DepName;
typedef struct EMemberInfo EMemberInfo;
typedef struct ENode ENode;
typedef struct ENodeList ENodeList;
typedef struct ExceptionAction ExceptionAction;
typedef struct ExceptSpecList ExceptSpecList;
typedef struct ExtendedParam ExtendedParam;
typedef struct FileOffsetInfo FileOffsetInfo;
typedef struct FuncArg FuncArg;
typedef struct GList GList;
typedef struct Initializer Initializer;
typedef struct InlineXRef InlineXRef;
typedef struct Macro Macro;
typedef struct MemInitializer MemInitializer;
typedef struct NameSpace NameSpace;
typedef struct NameSpaceName NameSpaceName;
@@ -144,8 +150,17 @@ typedef struct ObjType ObjType;
typedef struct ObjTypeTag ObjTypeTag;
typedef struct Object Object;
typedef struct ObjectList ObjectList;
typedef struct ObjectTemplated ObjectTemplated;
typedef struct ObjCCategory ObjCCategory;
typedef struct ObjCInfo ObjCInfo;
typedef struct ObjCMethod ObjCMethod;
typedef struct ObjCMethodArg ObjCMethodArg;
typedef struct ObjCMethodList ObjCMethodList;
typedef struct ObjCNamedArg ObjCNamedArg;
typedef struct ObjCProtocol ObjCProtocol;
typedef struct ObjCProtocolList ObjCProtocolList;
typedef struct ObjCSelector ObjCSelector;
typedef struct OLinkList OLinkList;
typedef struct Operand Operand;
typedef struct PackedDeclInfo PackedDeclInfo;
typedef struct PCode PCode;
@@ -157,6 +172,8 @@ typedef struct PTFList PTFList;
typedef struct SOMInfo SOMInfo;
typedef struct Statement Statement;
typedef struct StructMember StructMember;
typedef struct SwitchCase SwitchCase;
typedef struct SwitchInfo SwitchInfo;
typedef struct Template Template;
typedef struct TemplateAction TemplateAction;
typedef struct TemplateFriend TemplateFriend;
@@ -175,12 +192,14 @@ typedef struct TStreamElement TStreamElement;
typedef struct Type Type;
typedef struct TypeBitfield TypeBitfield;
typedef struct TypeClass TypeClass;
typedef struct TypeDeduce TypeDeduce;
typedef struct TypeEnum TypeEnum;
typedef struct TypeFunc TypeFunc;
typedef struct TypeIntegral TypeIntegral;
typedef struct TypeList TypeList;
typedef struct TypeMemberPointer TypeMemberPointer;
typedef struct TypeMethod TypeMethod;
typedef struct TypeObjCID TypeObjCID;
typedef struct TypePointer TypePointer;
typedef struct TypeStruct TypeStruct;
typedef struct TypeTemplDep TypeTemplDep;
@@ -203,62 +222,15 @@ typedef struct TemplParamID {
typedef enum TemplDepSubType {
TDE_PARAM,
TDE_TYPEEXPR,
TDE_unk2, // may actually be 1?
TDE_SIZEOF,
TDE_ALIGNOF,
TDE_CAST,
TDE_QUALNAME,
TDE_QUALTEMPL,
//TDE_OBJACCESS,
//TDE_SOURCEREF,
//TDE_FUNCCALL,
//TDE_LOCAL,
TDE_MONAND = 7,
TDE_MONPLUS,
TDE_MONMUL,
TDE_NEW,
TDE_DELETE,
TDE_ARRAY,
TDE_DYNAMIC_CAST,
TDE_STATIC_CAST,
TDE_REINTERPRET_CAST,
TDE_CONST_CAST,
TDE_TYPEID,
TDE_MEMBERACCESS,
TDE_THROW,
TDE_EXCEPTIONINIT,
TDE_LOCALINIT,
TDE_STATICINIT,
TDE_LOCALDESTROY,
TDE_ILLEGAL
TDE_OBJ,
TDE_SOURCEREF,
TDE_ADDRESS_OF
} TemplDepSubType;
/// Things that can be applied to a type expression
typedef enum TEFuncSel {
TEFS_SIZEOF,
TEFS_ALIGNOF,
TEFS_UUIDOF,
TEFS_BI_ALIGN,
TEFS_BI_TYPE,
TEFS_BI_VTYPE,
TEFS_BI_CTYPE
} TEFuncSel;
/// How to access an object
/// this might not actually be in Pro7 lol
typedef struct ObjAccess {
NameSpaceObjectList *list;
TypeClass *naming;
TypeClass *member;
TemplArg *targs;
HashNameNode *name;
ENode *expr;
Boolean is_qualified;
Boolean is_member;
Boolean is_ambig : 1;
Boolean is_ptm : 1;
Boolean ext_only : 1;
} ObjAccess;
/// Qualifiers
enum {
Q_CONST = 1,
@@ -281,7 +253,9 @@ enum {
Q_20000 = 0x20000,
Q_OVERLOAD = 0x40000, // weak
Q_80000 = 0x80000,
Q_100000 = 0x100000, // Objective-C ID
Q_RESTRICT = 0x200000,
Q_400000 = 0x400000, // is templated from another object?
Q_1000000 = 0x1000000,
Q_ALIGNED_1 = 0x2000000,
Q_ALIGNED_2 = 0x4000000,

View File

@@ -75,7 +75,7 @@ typedef enum ENodeType {
ESETCONST,
ENEWEXCEPTION,
ENEWEXCEPTIONARRAY,
EMYSTERY67, // no name???
EINITTRYCATCH,
EOBJLIST,
EMEMBER,
ETEMPLDEP,
@@ -184,12 +184,7 @@ typedef union ENodeUnion {
union {
TemplParamID pid;
struct {
union {
Type *type;
ENode *expr;
} u;
TEFuncSel sel;
Boolean is_expr;
Type *type;
} typeexpr;
struct {
ENodeList *args;
@@ -200,58 +195,11 @@ typedef union ENodeUnion {
TypeTemplDep *type;
HashNameNode *name;
} qual;
struct {
TypeTemplDep *type;
HashNameNode *name;
TemplArg *args;
} qualtempl;
//ObjAccess objaccess;
struct {
ENode *expr;
TStreamElement *token;
} sourceref;
ENode *monadic;
struct {
ENode *expr;
ENodeList *args;
} funccall;
// have my doubts about this one
/*struct {
Type *type;
UInt32 qual;
ENode *arraydim;
ENodeList *placement;
ENodeList *initlist;
Boolean is_global;
Boolean has_init;
} nw;*/
struct {
ENode *expr;
Boolean is_global;
Boolean is_array;
} del;
struct {
ENode *left;
ENode *right;
} dyadic;
struct {
ENode *expr;
Type *type;
UInt32 qual;
} newcast;
struct {
ENode *expr;
DepName *dname;
Boolean is_pointer;
} member;
struct {
Object *object;
Object *info;
} exinit;
struct {
Object *obj;
Initializer *init;
} varinit;
Object *obj;
} u;
TemplDepSubType subtype;
@@ -300,7 +248,7 @@ enum {
case ELOGNOT: \
case EFORCELOAD: \
case ETYPCON: \
case EBITFIELD:
case EBITFIELD
// 9 to 0x1B
#define ENODE_CASE_DIADIC_1 \
@@ -322,7 +270,7 @@ enum {
case ENOTEQU: \
case EAND: \
case EXOR: \
case EOR:
case EOR
// 0x1E to 0x28, 0x2D, 0x2F
#define ENODE_CASE_ASSIGN \
@@ -338,7 +286,48 @@ enum {
case EXORASS: \
case EORASS: \
case EBCLR: \
case EBSET:
case EBSET
#define ENODE_CASE_DIADIC_ALL \
case EMUL: \
case EMULV: \
case EDIV: \
case EMODULO: \
case EADDV: \
case ESUBV: \
case EADD: \
case ESUB: \
case ESHL: \
case ESHR: \
case ELESS: \
case EGREATER: \
case ELESSEQU: \
case EGREATEREQU: \
case EEQU: \
case ENOTEQU: \
case EAND: \
case EXOR: \
case EOR: \
case ELAND: \
case ELOR: \
case EASS: \
case EMULASS: \
case EDIVASS: \
case EMODASS: \
case EADDASS: \
case ESUBASS: \
case ESHLASS: \
case ESHRASS: \
case EANDASS: \
case EXORASS: \
case EORASS: \
case ECOMMA: \
case EPMODULO: \
case EROTL: \
case EROTR: \
case EBCLR: \
case EBTST: \
case EBSET
#ifdef __MWERKS__
#pragma options align=reset

View File

@@ -7,31 +7,31 @@
#pragma options align=mac68k
#endif
typedef struct ObjCMethodArg { // bigger in v7 (0x20 vs 0x14)
struct ObjCMethodArg *next;
struct ObjCMethodArg { // bigger in v7 (0x20 vs 0x14)
ObjCMethodArg *next;
HashNameNode *selector;
HashNameNode *name;
Type *type;
UInt32 qual;
UInt32 unk14;
UInt32 unk18;
UInt32 unk1C;
} ObjCMethodArg;
//UInt32 unk14;
//UInt32 unk18;
//UInt32 unk1C;
};
typedef struct ObjCMethodList { // verified via CPrec
struct ObjCMethodList *next;
struct ObjCMethod *method;
} ObjCMethodList;
struct ObjCMethodList { // verified via CPrec
ObjCMethodList *next;
ObjCMethod *method;
};
typedef struct ObjCSelector { // verified via CPrec
struct ObjCSelector *next;
struct ObjCSelector { // verified via CPrec
ObjCSelector *next;
Object *selobject;
HashNameNode *name;
struct ObjCMethodList *methods;
} ObjCSelector;
ObjCMethodList *methods;
};
typedef struct ObjCMethod { // verified via CPrec
struct ObjCMethod *next;
struct ObjCMethod { // verified via CPrec
ObjCMethod *next;
Object *object;
TypeFunc *functype;
ObjCSelector *selector;
@@ -41,27 +41,27 @@ typedef struct ObjCMethod { // verified via CPrec
Boolean has_valist;
Boolean is_class_method;
Boolean is_defined;
} ObjCMethod;
};
typedef struct ObjCProtocol { // verified via CPrec
struct ObjCProtocol *next;
HashNameNode *name;
struct ObjCProtocolList *protocols;
ObjCMethod *methods;
Object *object;
} ObjCProtocol;
typedef struct ObjCProtocolList { // verified via CPrec
struct ObjCProtocolList *next;
ObjCProtocol *protocol;
} ObjCProtocolList;
typedef struct ObjCCategory { // verified via CPrec
struct ObjCCategory *next;
struct ObjCProtocol { // verified via CPrec
ObjCProtocol *next;
HashNameNode *name;
ObjCProtocolList *protocols;
ObjCMethod *methods;
} ObjCCategory;
Object *object;
};
struct ObjCProtocolList { // verified via CPrec
ObjCProtocolList *next;
ObjCProtocol *protocol;
};
struct ObjCCategory { // verified via CPrec
ObjCCategory *next;
HashNameNode *name;
ObjCProtocolList *protocols;
ObjCMethod *methods;
};
struct ObjCInfo { // verified via CPrec
Object *classobject;
@@ -73,6 +73,12 @@ struct ObjCInfo { // verified via CPrec
Boolean is_implemented;
};
struct ObjCNamedArg {
ObjCNamedArg *next;
HashNameNode *name;
ENode *expr;
};
#ifdef __MWERKS__
#pragma options align=reset
#endif

View File

@@ -122,10 +122,7 @@ struct Object {
UInt8 flags;
ExtendedParam *extParam;
Object *toc;
//void *any;
//char reg; // notsure?
VarRecord *varptr; // i think?
// union starts at 0x24 in v7
VarRecord *varptr;
union {
struct {
union {
@@ -185,6 +182,11 @@ struct Object {
} u;
};
struct ObjectTemplated {
Object object;
Object *parent;
};
enum {
OBJECT_FLAGS_UNUSED = 1,
OBJECT_FLAGS_2 = 2,
@@ -212,6 +214,7 @@ enum {
#define OBJ_MEMBER_VAR(obj) ((ObjMemberVar *) (obj))
#define OBJ_MEMBER_VAR_PATH(obj) ((ObjMemberVarPath *) (obj))
#define OBJECT(obj) ((Object *) (obj))
#define OBJECT_TEMPL(obj) ((ObjectTemplated *) (obj))
struct VarInfo { // OK!

View File

@@ -9,7 +9,7 @@
#pragma options align=mac68k
#endif
typedef struct PackedDeclInfo { // ok
struct PackedDeclInfo { // ok
Type *thetype;
UInt32 qual;
NameSpace *nspace;
@@ -19,7 +19,7 @@ typedef struct PackedDeclInfo { // ok
Section section;
UInt8 exportflags;
Boolean has_expltargs;
} PackedDeclInfo;
};
struct Template {
Template *parent;
@@ -54,19 +54,6 @@ struct TemplInstance {
Boolean is_extern;
Boolean static_instantiated;
};
/*
struct __attribute__((packed)) TemplInstance
{
Template *templ;
TemplInstance *parent;
TemplArg *args;
unsigned __int8 is_instantiated;
unsigned __int8 is_specialized;
unsigned __int8 is_extern;
unsigned __int8 static_instantiated;
};
*/
struct TemplParam { // verified via CPrec
TemplParam *next;
@@ -106,6 +93,36 @@ struct TemplArg { // verified by CPrec
Boolean is_deduced;
};
struct DeduceInfo {
TemplArg *args;
TemplArg argBuffer[16];
int maxCount;
int count;
UInt8 x12C;
};
struct DefAction {
DefAction *next;
TemplateAction *action;
ObjBase *refobj;
int xC;
TypeEnum *enumtype;
};
struct TypeDeduce {
TemplClass *tmclass;
TemplClassInst *inst;
TemplParam *params;
TemplArg *args;
DefAction *defActions;
Boolean x14;
Boolean x15;
Boolean x16;
Boolean x17;
UInt8 nindex;
Boolean x19;
};
struct TemplPartialSpec { // confirmed via CPrec (but templ might be a different type?)
TemplPartialSpec *next;
TemplClass *templ;
@@ -129,38 +146,41 @@ struct TemplStack {
struct TemplClass {
TypeClass theclass;
TemplClass *next;
TemplClass *templ__parent;
Type *x3A_maybe_parentinst;
TemplClass *templ_parent; // confirmed by v8
TemplClassInst *inst_parent; // confirmed by v8
TemplParam *templ__params;
TemplateMember *members;
TemplClassInst *instances;
TemplClass *pspec_owner;
TemplPartialSpec *pspecs;
TemplateAction *actions;
// not confirmed these last 3 fields yet but there is space for them
UInt16 lex_order_count;
UInt16 lex_order_count; // confirmed by v8
SInt8 align;
UInt8 flags;
};
enum {
TEMPLCLASS_FLAGS_1 = 1,
TEMPLCLASS_FLAGS_2 = 2
};
struct TemplClassInst {
TypeClass theclass;
TemplClassInst *next;
Type *x36; // not sure what this represents
TemplClassInst *next; // confirmed by v8
TemplClassInst *parent; // confirmed by v8
TemplClass *templ;
TemplArg *inst_args;
TemplArg *oargs;
Boolean x46;
Boolean x47;
Boolean is_instantiated;
Boolean is_specialized;
Boolean is_extern;
Boolean x49;
};
#define TEMPL_CLASS(ty) ( (TemplClass *) (ty) )
#define TEMPL_CLASS_INST(ty) ( (TemplClassInst *) (ty) )
#define IS_TEMPL_CLASS(ty) ( IS_TYPE_CLASS(ty) && (TYPE_CLASS(ty)->flags & CLASS_FLAGS_100) )
#define IS_TEMPL_CLASS_INST(ty) ( IS_TYPE_CLASS(ty) && (TYPE_CLASS(ty)->flags & CLASS_FLAGS_800) )
/*************/
/* Functions */

View File

@@ -154,12 +154,12 @@ typedef enum EToken {
TK_UU_UUIDOF
} EToken;
typedef struct FileOffsetInfo {
struct FileOffsetInfo {
CPrepFileInfo *file;
SInt32 tokenline;
SInt32 tokenoffset;
Boolean is_inline;
} FileOffsetInfo;
};
typedef union TData {
HashNameNode *tkidentifier;

View File

@@ -189,14 +189,14 @@ struct TypeClass {
};
typedef enum {
CLASS_MODE_0 = 0,
CLASS_MODE_1 = 1,
CLASS_MODE_2 = 2
CLASS_MODE_0 = 0, // struct
CLASS_MODE_1 = 1, // union
CLASS_MODE_2 = 2 // class
} ClassMode;
enum {
CLASS_FLAGS_1 = 1,
CLASS_FLAGS_2 = 2,
CLASS_FLAGS_2 = 2, // completed class?
CLASS_FLAGS_ABSTRACT = 8,
CLASS_FLAGS_10 = 0x10,
CLASS_FLAGS_20 = 0x20,
@@ -225,11 +225,11 @@ enum {
CLASS_ACTION_3 = 3 // __javaobject
};
typedef struct ExceptSpecList {
struct ExceptSpecList *next;
struct ExceptSpecList {
ExceptSpecList *next;
Type *type;
UInt32 qual;
} ExceptSpecList;
};
struct FuncArg { // ok
struct FuncArg *next;
@@ -253,21 +253,24 @@ struct TypeFunc {
};
enum {
FUNC_FLAGS_PASCAL = 1, // on TypeFunc::flags
FUNC_FLAGS_2 = 2,
FUNC_FLAGS_2 = 2, // member function that has an inline definition?
FUNC_FLAGS_4 = 4,
FUNC_FLAGS_8 = 8, // abstract?
FUNC_FLAGS_8 = 8, // abstract
FUNC_FLAGS_METHOD = 0x10,
FUNC_FLAGS_20 = 0x20,
FUNC_FLAGS_40 = 0x40, // func that's like "operator SomeOtherType()"
FUNC_FLAGS_80 = 0x80,
FUNC_FLAGS_100 = 0x100,
FUNC_FLAGS_200 = 0x200, // intrinsic?
FUNC_FLAGS_NOTHROW = 0x400,
FUNC_FLAGS_800 = 0x800,
FUNC_FLAGS_1000 = 0x1000,
FUNC_FLAGS_2000 = 0x2000,
FUNC_FLAGS_800 = 0x800, // autoinlined?
FUNC_FLAGS_1000 = 0x1000, // is ctor
FUNC_FLAGS_2000 = 0x2000, // is dtor
FUNC_FLAGS_4000 = 0x4000, // objc method?
FUNC_FLAGS_CONST = 0x8000,
FUNC_FLAGS_VOLATILE = 0x10000,
FUNC_FLAGS_100000 = 0x100000, // is template?
FUNC_FLAGS_200000 = 0x200000,
FUNC_FLAGS_800000 = 0x800000,
FUNC_FLAGS_900000 = 0x900000,
FUNC_FLAGS_4000000 = 0x4000000,
@@ -287,8 +290,8 @@ struct TypeMethod {
UInt32 flags;
TypeClass *theclass;
SInt32 x1E; // vtable offset?
void *x22;
Boolean x26;
SInt32 x22; // browser index?
Boolean x26; // is static
};
@@ -296,8 +299,8 @@ struct TypeBitfield {
TypeType type;
SInt32 size;
Type *bitfieldtype;
char unkA;
char unkB;
char unkA; // offset in bits
char unkB; // size in bits
};
@@ -371,7 +374,12 @@ struct TypePointer {
};
// ObjCID
/// Always has Q_100000 set
struct TypeObjCID {
TypePointer pointer;
ObjCProtocolList *protocols;
short x12;
};
struct TypeList {
@@ -394,6 +402,7 @@ struct TypeList {
#define TYPE_POINTER(ty) ((TypePointer *) (ty))
#define TPTR_TARGET(ty) (TYPE_POINTER(ty)->target)
#define TPTR_QUAL(ty) (TYPE_POINTER(ty)->qual)
#define TYPE_OBJC_ID(ty) ((TypeObjCID *) (ty))
#define IS_TYPE_VOID(ty) ( (ty)->type == TYPEVOID )
#define IS_TYPE_INT(ty) ( (ty)->type == TYPEINT )
@@ -403,11 +412,14 @@ 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_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_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 )
#define IS_TYPEFUNC_STATIC_METHOD(ty) ( IS_TYPEFUNC_METHOD(ty) && TYPE_METHOD(ty)->x26 )
#define IS_TYPE_TEMPLATE(ty) ( (ty)->type == TYPETEMPLATE )
#define IS_TYPE_POINTER(ty) ( (ty)->type == TYPEPOINTER || (ty)->type == TYPEARRAY )
#define IS_TYPE_POINTER_ONLY(ty) ( (ty)->type == TYPEPOINTER )

14
includes/compiler/uDump.h Normal file
View File

@@ -0,0 +1,14 @@
#ifndef COMPILER_UDUMP_H
#define COMPILER_UDUMP_H
#include "compiler/common.h"
extern void SetupDumpIR(void);
extern void CleanupDumpIR(void);
extern void DumpIR(Statement *statements, Object *func);
extern void DumpExpression(ENode *expr, int indent);
extern void DumpSwitch(SwitchInfo *info);
extern void DumpType(Type *type);
extern void DumpStack(ExceptionAction *act);
#endif