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
|
#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
typedef struct CI_Var {
HashNameNode *name;
Type *type;
UInt32 qual;
UInt8 sflags;
UInt8 xD;
UInt8 xE;
} CI_Var;
typedef struct CI_Switch {
int fix_me;
} 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;
// TODO: Figure out the one for Inline ASM
} u;
} CI_Statement;
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;
Boolean 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;
TStream stream;
TypeClass *tclass;
CI_ActionType actiontype;
} inlinefunc;
struct {
Type *a;
Type *b;
TemplateMember *tmemb;
} memberfunc;
struct {
TemplateFunction *func;
TemplFuncInstance *inst;
} templatefunc;
} u;
} 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 *obj);
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 Boolean CInline_CanFreeLHeap(void);
extern Boolean CInline_GenerateDeferredFuncs(void);
extern void CInline_Finish(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif
|