summaryrefslogtreecommitdiff
path: root/includes/compiler/CInline.h
blob: 576f7e15c91c0f4081deebb8c3ae9a11660d6c5c (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
#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