summaryrefslogtreecommitdiff
path: root/includes/compiler/CInline.h
blob: 51abd45f3e9fde36194742c35b2361fe4e3d41f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#ifndef COMPILER_CINLINE_H
#define COMPILER_CINLINE_H

#include "compiler/common.h"
#include "compiler/tokens.h"
#include "compiler/CFunc.h"

#ifdef __MWERKS__
#pragma options align=mac68k
#endif

// 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;
    UInt32 qual;
    UInt8 sflags;
    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 {
    ENode *expr;
    Type *unkSwitch8;
    short defaultlabelID;
    short numcases;
    CI_SwitchCase cases[1];
} CI_Switch;

typedef struct CI_Statement {
    StatementType type;
    UInt8 flags;
    UInt16 value;
    SInt32 sourceoffset;
    HashNameNode *sourcefilepath;
    ExceptionAction *dobjstack;
    union {
        SInt16 statementnum;
        ENode *expr;
        struct {
            ENode *expr;
            SInt16 statementnum;
        } ifgoto;
        CI_Switch *switchdata;
        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;
    short numlocals;
    CI_Var *locals;
    short numstatements;
    CI_Statement *statements;
    FileOffsetInfo fileoffset;
    SInt32 symdecloffset;
    SInt32 functionbodyoffset;
    HashNameNode *functionbodypath;
    SInt32 symdeclend;
    UInt8 can_inline;
};

typedef enum {
    CI_ActionInlineFunc = 0,
    CI_ActionMemberFunc = 1,
    CI_ActionTemplateFunc = 2,
    CI_ActionDefaultFunc = 3
} CI_ActionType;

typedef struct CI_Action {
    struct CI_Action *next;
    Object *obj;
    union {
        struct {
            FileOffsetInfo fileoffset;
            TokenStream stream;
            TypeClass *tclass;
        } inlinefunc;
        struct {
            TemplClass *templ;
            TemplClassInst *inst;
            TemplateMember *tmemb;
        } memberfunc;
        struct {
            TemplateFunction *func;
            TemplFuncInstance *inst;
        } templatefunc;
    } u;
    CI_ActionType actiontype;
} CI_Action;

typedef enum {
    CopyMode0,
    CopyMode1,
    CopyMode2,
    CopyMode3,
    CopyMode4
} CInlineCopyMode;

extern CI_Action *cinline_tactionlist;

extern void CInline_Init(void);
extern SInt32 CInline_GetLocalID(Object *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 *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, TokenStream *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);

#ifdef __MWERKS__
#pragma options align=reset
#endif

#endif