MWCC/includes/compiler/CParser.h

416 lines
13 KiB
C

#ifndef COMPILER_CPARSER_H
#define COMPILER_CPARSER_H
#include "compiler/common.h"
#include "compiler/enode.h"
#include "compiler/tokens.h"
#include "compiler/types.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
enum {
AlignMode0_Mac68k,
AlignMode1_Mac68k4byte,
AlignMode2_PPC,
AlignMode3_1Byte,
AlignMode4_2Byte,
AlignMode5_4Byte,
AlignMode6_8Byte,
AlignMode7_16Byte,
AlignMode8_Packed
};
enum {
CPU_PPC401,
CPU_PPC403,
CPU_PPC505,
CPU_PPC509,
CPU_PPC555,
CPU_PPC601,
CPU_PPC602,
CPU_PPC603,
CPU_PPC603e,
CPU_PPC604,
CPU_PPC604e,
CPU_PPC740,
CPU_PPC750,
CPU_PPC801,
CPU_PPC821,
CPU_PPC823,
CPU_PPC850,
CPU_PPC860,
CPU_PPC8240,
CPU_PPC8260,
CPU_Generic,
CPU_PPC7400,
CPU_PPCGEKKO,
CPU_PPCELF,
CPU_PPC7450,
CPU_PPC556,
CPU_PPC565
};
typedef struct CompilerLinkerOptions {
Boolean littleendian;
Boolean codegen_dynamic;
Boolean codegen_pic;
Boolean no_common;
Boolean no_implicit_templates;
Boolean absolutepath; // determines the path written to debug info
char x06; // linker/objgen related
short processor;
char scheduling;
char schedule_factor;
SInt32 debuglisting;
Boolean profile;
Boolean traceback;
Boolean disable_registers;
Boolean fp_contract;
Boolean no_register_save_helpers;
Boolean unroll_speculative;
short unroll_instr_limit;
short unroll_factor_limit;
Boolean altivec_model;
UInt8 altivec_vrsave;
UInt8 function_align;
UInt8 x1D;
UInt8 gen_isel;
UInt8 gen_fsel;
Boolean opt_bcc_lr_ctr;
Boolean use_lmw_stmw;
char report_heap_info;
Boolean misaligned_mem_access;
Boolean switch_tables;
Boolean prepare_compress;
char min_struct_alignment; // used in CMach_AllocationAlignment
Boolean asmsemicolcomment;
Boolean asmpoundcomment;
StringPtr oldprefixname;
short inlinelevel;
int inlinemaxsize;
int inlinemaxtotalsize;
Boolean inline_bottom_up;
Boolean cplusplus;
Boolean ecplusplus;
Boolean objective_c;
Boolean objc_strict;
Boolean ARMconform;
Boolean ARMscoping;
Boolean checkprotos;
Boolean trigraphs;
Boolean onlystdkeywords;
Boolean enumsalwaysint;
Boolean ANSIstrict;
Boolean mpwc_relax;
Boolean mpwc_newline;
Boolean ignore_oldstyle;
Boolean cpp_extensions;
Boolean pointercast_lvalue;
Boolean RTTI;
Boolean delete_exception;
Boolean test_dummy;
Boolean oldalignment;
Boolean unsigned_char;
Boolean multibyteaware;
Boolean auto_inline;
Boolean defer_codegen;
Boolean direct_to_som;
Boolean som_env_check;
Boolean som_call_optimize;
Boolean booltruefalse;
Boolean old_enum_mangler;
Boolean longlong;
Boolean longlong_enums;
Boolean no_tfuncinline;
Boolean always_vdispatch;
Boolean flat_include;
Boolean syspath_once;
Boolean always_import;
Boolean simple_class_byval;
Boolean wchar_type;
Boolean vbase_ctor_offset;
Boolean vbase_abi_v2;
Boolean def_inherited;
Boolean template_patch;
Boolean template_friends;
Boolean faster_pch_gen;
Boolean array_new_delete;
Boolean dollar_identifiers;
Boolean def_inline_tfuncs;
Boolean arg_dep_lookup;
Boolean simple_prepdump;
Boolean line_prepdump;
Boolean fullpath_prepdump;
Boolean old_mtemplparser;
Boolean suppress_init_code;
Boolean reverse_bitfields;
Boolean c9x;
Boolean float_constants;
Boolean no_static_dtors;
Boolean longlong_prepeval;
Boolean const_strings;
Boolean dumpir;
Boolean experimental;
Boolean gcc_extensions;
Boolean stdc_fp_contract;
Boolean stdc_fenv_access;
Boolean stdc_cx_limitedr;
Boolean old_argmatch;
Boolean optEH;
Boolean optEH2;
Boolean new_mangler;
Boolean microsoft_EH;
Boolean warningerrors;
Boolean pedantic;
Boolean checkprecompflags;
Boolean supress_warnings;
Boolean warn_illpragma;
Boolean warn_emptydecl;
Boolean warn_possunwant;
Boolean warn_unusedvar;
Boolean warn_unusedarg;
Boolean warn_extracomma;
Boolean warn_hidevirtual;
Boolean warn_largeargs;
Boolean warn_implicitconv;
Boolean warn_notinlined;
Boolean warn_structclass;
Boolean warn_padding;
Boolean warn_no_side_effect;
Boolean warn_resultnotused;
Boolean warn_ptr_int_conv;
char structalignment;
Boolean alignarraymembers;
Boolean dont_reuse_strings;
Boolean poolstrings;
Boolean explicit_zero_data;
Boolean readonly_strings;
Boolean exceptions;
Boolean dddummy;
Boolean dontinline;
Boolean alwaysinline;
Boolean peephole;
Boolean globaloptimizer;
Boolean sideeffects;
Boolean cfm_internal;
Boolean cfm_import;
Boolean cfm_export;
Boolean cfm_lib_export;
Boolean nosyminline;
Boolean force_active;
char optimizationlevel;
Boolean optimizesize;
Boolean optimizewithasm;
Boolean crippled;
Boolean commonsubs;
Boolean loopinvariants;
Boolean propagation;
Boolean deadstore;
Boolean strengthreduction;
Boolean strengthreductionstrict;
Boolean deadcode;
Boolean lifetimes;
Boolean logopts;
Boolean unrolling;
Boolean vectorizeloops;
Boolean multiplepasses;
Boolean opt_pointer_analysis;
UInt8 opt_pointer_analysis_mode;
char unrollfactor;
char unrollinstrfactor;
Boolean filesyminfo;
CWDataType appltype;
CWDataType headtype;
CWDataType texttype;
HashNameNode *cursegmentname; // when set by #pragma segment
} CompilerLinkerOptions;
typedef struct ParserTryBlock {
struct ParserTryBlock *next;
jmp_buf jmpbuf;
NameSpace *cscope_current;
TypeClass *cscope_currentclass;
Object *cscope_currentfunc;
TemplStack *ctempl_curinstance;
TStreamElement *cerror_locktoken;
Boolean cscope_is_member_func;
} ParserTryBlock;
typedef struct CallbackAction {
struct CallbackAction *next;
Object *obj;
TypeClass *tclass;
} CallbackAction;
extern FileOffsetInfo cparser_fileoffset;
extern TStreamElement symdecltoken;
extern ParserTryBlock *trychain;
extern Boolean inassembler;
extern Boolean dont_set_references;
extern TypeStruct ptmstruct;
extern TypeStruct catchinfostruct;
extern Boolean in_assembler;
extern Boolean illegalimplicitconversion;
extern Boolean in_func_arglist;
extern NameSpaceName *newp_fobj;
extern NameSpaceName *newa_fobj;
extern NameSpaceName *delp_fobj;
extern NameSpaceName *dela_fobj;
extern Object *newh_func;
extern Object *delh_func;
extern Object *copy_func;
extern Object *clear_func;
extern Object *Rgtid_func;
extern Object *Rdync_func;
extern Object *rt_ptmf_cast;
extern Object *rt_ptmf_cmpr;
extern Object *rt_ptmf_test;
extern Object *rt_ptmf_call;
extern Object *rt_ptmf_scall;
extern Object *rt_ptmf_call4;
extern Object *rt_ptmf_scall4;
extern Object *rt_ptmf_null;
extern Object *rt_som_new;
extern Object *rt_som_newcheck;
extern Object *rt_som_check;
extern Object *rt_som_glue1;
extern Object *rt_som_glue2;
extern Object *rt_som_glue3;
extern Object *carr_func;
extern Object *cnar_func;
extern Object *darr_func;
extern Object *dnar_func;
extern Object *dnar3_func;
extern Object *Xgreg_func;
extern Object *Xthrw_func;
extern Object *Xicth_func;
extern Object *Xecth_func;
extern Object *Xunex_func;
extern CompilerLinkerOptions copts;
extern struct GList name_mangle_list;
extern HashNameNode *no_name_node;
extern HashNameNode *temp_argument_name;
extern HashNameNode *this_name_node;
extern HashNameNode *self_name_node;
extern HashNameNode *vptr_name_node;
extern CallbackAction *callbackactions;
extern Boolean fatalerrors;
extern Boolean anyerrors;
extern jmp_buf errorreturn;
extern char string[256];
extern SInt32 compilererrornum;
extern SInt32 compilererrfile;
extern SInt32 compilererrline;
extern Type sttemplexpr;
extern Type stillegal;
extern Type stvoid;
extern TypePointer void_ptr;
extern TypeFunc rt_func;
enum {
ATOM_VOID = 1,
ATOM_CHAR,
ATOM_UCHAR,
ATOM_WCHAR,
ATOM_SHORT,
ATOM_USHORT,
ATOM_INT,
ATOM_UINT,
ATOM_LONG,
ATOM_ULONG,
ATOM_LONGLONG,
ATOM_ULONGLONG,
ATOM_FLOAT,
ATOM_SHORTDOUBLE,
ATOM_DOUBLE,
ATOM_LONGDOUBLE
};
extern Object *CParser_NewRTFunc(Type *rettype, HashNameNode *name, Boolean flag, int argcount, ...);
extern Boolean CParser_IsPublicRuntimeObject(Object *obj);
extern Object *CParser_FindPublicRuntimeObject(HashNameNode *name);
extern Boolean CParser_ReInitRuntimeObjects(Boolean is_precompiler);
extern void CParser_Setup(void);
extern void CParser_Cleanup(void);
extern short GetPrec(short token);
extern Boolean CParser_ParseOperatorName(short *token, Boolean flag1, Boolean flag2);
extern SInt32 CParser_GetUniqueID(void);
extern void CParser_PrintUniqueID(char *buf);
extern void CParser_SetUniqueID(SInt32 id);
extern HashNameNode *CParser_GetUniqueName(void);
extern HashNameNode *CParser_NameConcat(const char *a, const char *b);
extern HashNameNode *CParser_AppendUniqueName(char *prefix);
extern HashNameNode *CParser_AppendUniqueNameFile(char *prefix);
extern Boolean IsTempName(HashNameNode *name);
extern void CParser_UpdateObject(Object *object, DeclInfo *declinfo);
extern Object *CParser_NewObject(DeclInfo *declinfo);
extern Object *CParser_NewLocalDataObject(DeclInfo *declinfo, Boolean add_to_locals);
extern Object *CParser_NewGlobalDataObject(DeclInfo *declinfo);
extern Object *CParser_NewCompilerDefDataObject(void);
extern Object *CParser_NewFunctionObject(DeclInfo *declinfo);
extern Object *CParser_NewCompilerDefFunctionObject(void);
extern Object *CParser_NewAliasObject(Object *object, SInt32 offset);
extern FuncArg *CParser_NewFuncArg(void);
extern Type *atomtype(void);
extern Object *CParser_FindDeallocationObject(Type *type, FuncArg *args, Boolean flag1, Boolean flag2, Boolean *outflag);
extern short is_memberpointerequal(Type *a, Type *b);
extern short is_typeequal(Type *a, Type *b);
extern short iscpp_typeequal(Type *a, Type *b);
extern short CParser_CompareArgLists(FuncArg *a, FuncArg *b);
extern Boolean is_arglistsame(FuncArg *a, FuncArg *b);
extern short is_typesame(Type *a, Type *b);
extern Type *CParser_GetBoolType(void);
extern Type *CParser_GetWCharType(void);
extern short CParser_GetOperator(ENodeType t);
extern Boolean CParser_IsMoreCVQualified(UInt32 a, UInt32 b);
extern Boolean CParser_IsSameOrMoreCVQualified(UInt32 a, UInt32 b);
extern Boolean is_unsigned(Type *type);
extern StructMember *ismember(TypeStruct *tstruct, HashNameNode *name);
extern void appendmember(TypeStruct *tstruct, StructMember *member);
extern Boolean isdeclaration(UInt8 flag1, UInt8 flag2, UInt8 flag3, short token);
extern Boolean islookaheaddeclaration(void);
extern Type *CParser_ParseTypeID(UInt32 *qual, Boolean *flag);
extern Boolean CParser_TryFuncDecl(void);
extern Boolean CParser_TryParamList(Boolean flag);
extern Type *CParser_RemoveTopMostQualifiers(Type *type, UInt32 *qual);
extern UInt32 CParser_GetTypeQualifiers(Type *type, UInt32 qual);
extern UInt32 CParser_GetCVTypeQualifiers(Type *type, UInt32 qual);
extern Boolean CParser_IsConst(Type *type, UInt32 qual);
extern Boolean CParser_IsVolatile(Type *type, UInt32 qual);
extern Boolean is_const_object(Object *obj);
extern Boolean is_volatile_object(Object *obj);
extern Boolean CParserIsConstExpr(ENode *expr);
extern Boolean CParserIsVolatileExpr(ENode *expr);
extern Boolean CParser_HasInternalLinkage(const Object *obj);
extern Boolean CParser_HasInternalLinkage2(const Object *obj);
extern Boolean CParser_IsVirtualFunction(Object *obj, TypeClass **tclass, SInt32 *index);
extern Boolean is_pascal_object(Object *obj);
extern Boolean is_cfm_type(Type *type);
extern Boolean CParser_IsVTableObject(Object *obj);
extern void TypedefDeclInfo(DeclInfo *declinfo, Type *type, UInt32 qual);
extern void CParser_ParseAttribute(Type *type, DeclInfo *declinfo);
extern void CParser_ParseDeclSpec(DeclInfo *declinfo, Boolean flag);
extern Boolean CParser_CheckTemplateClassUsage(TemplClass *tmclass, Boolean flag);
extern void CParser_GetDeclSpecs(DeclInfo *di, Boolean flag);
extern void CParser_RegisterNonGlobalClass(TypeClass *tclass);
extern void CParser_RegisterSingleExprFunction(Object *func, ENode *expr);
extern void CParser_RegisterDummyCtorFunction(Object *func, Object *obj);
extern Boolean CParser_IsAnonymousUnion(DeclInfo *di, Boolean flag);
extern void CParser_CheckAnonymousUnion(DeclInfo *di, Boolean flag);
extern void CParser_NewCallBackAction(Object *obj, TypeClass *tclass);
extern void CParser_NewClassAction(TypeClass *tclass);
extern void CParser_CallBackAction(Object *obj);
extern Object *CParser_ParseObject(void);
extern void CParser_ParseGlobalDeclaration(void);
extern void cparser(void);
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif