MWCC/includes/compiler/objects.h

242 lines
4.8 KiB
C

#ifndef COMPILER_OBJECTS_H
#define COMPILER_OBJECTS_H
#include "compiler/common.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef enum ObjectType {
OT_ENUMCONST,
OT_TYPE,
OT_TYPETAG,
OT_NAMESPACE,
OT_MEMBERVAR,
OT_OBJECT,
OT_ILLEGAL
} ObjectType;
struct ObjectList {
ObjectList *next;
Object *object;
};
/// General structure with all shared fields for all kinds of objects
struct ObjBase {
ObjectType otype;
AccessType access;
};
/// Type 0 (OT_ENUMCONST)
struct ObjEnumConst {
ObjectType otype;
AccessType access;
ObjEnumConst *next;
HashNameNode *name;
Type *type;
CInt64 val;
};
/// Type 1 (OT_TYPE)
struct ObjType {
ObjectType otype;
AccessType access;
Type *type;
UInt32 qual;
};
/// Type 2 (OT_TYPETAG)
struct ObjTypeTag {
ObjectType otype;
AccessType access;
Type *type;
};
/// Type 3 (OT_NAMESPACE)
struct ObjNameSpace {
ObjectType otype;
AccessType access;
NameSpace *nspace;
};
/// Type 4 (OT_MEMBERVAR)
struct ObjMemberVar {
ObjectType otype;
AccessType access;
Boolean anonunion;
Boolean has_path;
struct ObjMemberVar *next;
HashNameNode *name;
Type *type;
UInt32 qual;
UInt32 offset;
};
struct ObjMemberVarPath {
ObjectType otype;
AccessType access;
Boolean anonunion;
Boolean has_path;
struct ObjMemberVar *next;
HashNameNode *name;
Type *type;
UInt32 qual;
UInt32 offset;
BClassList *path;
};
typedef enum DataType {
DDATA,
DLOCAL,
DABSOLUTE,
DFUNC,
DVFUNC,
DINLINEFUNC,
DALIAS,
DEXPR,
DNONLAZYPTR,
DLABEL,
DUNUSED
} DataType;
/// Type 5 (OT_OBJECT)
struct Object {
ObjectType otype;
AccessType access;
DataType datatype;
Section section;
NameSpace *nspace;
HashNameNode *name;
Type *type;
UInt32 qual;
SInt16 sclass;
UInt8 flags;
ExtendedParam *extParam;
Object *toc;
void *any;
//char reg; // notsure?
//VarRecord *varptr; // notsure?
// union starts at 0x24 in v7
union {
struct {
union {
CInt64 intconst;
Float *floatconst;
MWVector128 *vector128const;
char *string;
struct {
char *data;
SInt32 size;
} switchtable;
} u;
VarInfo *info;
HashNameNode *linkname;
Boolean islocalstatic;
} data;
UInt32 address;
struct {
VarInfo *info;
HashNameNode *linkname;
Object *over_load;
} toc;
struct {
union {
TemplateFunction *templ;
CI_FuncData *ifuncdata;
SInt32 intrinsicid;
} u;
DefArgCtorInfo *defargdata;
HashNameNode *linkname;
TemplFuncInstance *inst;
PTFList *ptfList;
ObjectList *argList;
} func;
struct {
char *data;
SInt32 size;
InlineXRef *xrefs;
} ifunc;
struct {
VarInfo *info;
SInt32 uid;
SInt32 offset;
Object *realObj;
} var;
struct {
Object *object;
//TypeClass *member;
BClassList *member; // ???
SInt32 offset;
} alias;
struct {
Object *function;
HashNameNode *labelname;
} label;
ENode *expr;
} u;
};
enum {
OBJECT_FLAGS_UNUSED = 1,
OBJECT_FLAGS_2 = 2,
OBJECT_FLAGS_4 = 4,
OBJECT_FLAGS_8 = 8,
OBJECT_FLAGS_10 = 0x10, // internal
OBJECT_FLAGS_20 = 0x20, // import
OBJECT_FLAGS_40 = 0x40, // export
OBJECT_FLAGS_60 = 0x60 // lib export
};
enum {
OBJECT_SCLASS_101 = 0x101,
OBJECT_SCLASS_102 = 0x102,
OBJECT_SCLASS_103 = 0x103,
OBJECT_SCLASS_104 = 0x104,
OBJECT_SCLASS_12B = 0x12B
};
#define OBJ_BASE(obj) ((ObjBase *) (obj))
#define OBJ_ENUM_CONST(obj) ((ObjEnumConst *) (obj))
#define OBJ_TYPE(obj) ((ObjType *) (obj))
#define OBJ_TYPE_TAG(obj) ((ObjTypeTag *) (obj))
#define OBJ_NAMESPACE(obj) ((ObjNameSpace *) (obj))
#define OBJ_MEMBER_VAR(obj) ((ObjMemberVar *) (obj))
#define OBJ_MEMBER_VAR_PATH(obj) ((ObjMemberVarPath *) (obj))
#define OBJECT(obj) ((Object *) (obj))
struct VarInfo { // OK!
Object *func;
SInt32 usage;
TStreamElement deftoken;
SInt16 varnumber;
Boolean noregister;
Boolean used;
UInt8 flags;
UInt8 rclass;
SInt16 reg;
SInt16 regHi;
};
enum {
VarInfoFlag1 = 1, // is parameter?
VarInfoFlag2 = 2,
VarInfoFlag4 = 4,
VarInfoFlag40 = 0x40,
VarInfoFlag80 = 0x80
};
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif