mirror of https://git.wuffs.org/MWCC
122 lines
3.2 KiB
C
122 lines
3.2 KiB
C
#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
|