#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 }; // not sure how many of these are char and how many are unsigned char or Boolean typedef struct COpts { Boolean little_endian; 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 cpu; char schedule_cpu; char schedule_mode; // may be an enum?? SInt32 debuglisting; Boolean profile; Boolean traceback; Boolean disable_registers; Boolean fp_contract; Boolean no_register_save_helpers; Boolean ppc_unroll_speculative; short ppc_unroll_instructions_limit; short ppc_unroll_factor_limit; Boolean altivec_model; UInt8 altivec_vrsave; UInt8 code_alignment; UInt8 x1D; UInt8 x1E; // some register used in TOC_use_isel UInt8 gen_fsel; Boolean ppc_opt_bclr_bcctr; Boolean use_lmw_stmw; char report_heap_info; Boolean misaligned_mem_access; Boolean switch_tables; char prepare_compress; char some_alignment; // used in CMach_AllocationAlignment Boolean asmsemicolcomment; Boolean asmpoundcomment; StringPtr oldprefixname; short inlinelevel; int inline_max_size; int inline_max_total_size; Boolean inline_bottom_up; Boolean cplusplus; Boolean ecplusplus; Boolean objective_c; Boolean objc_strict; Boolean ARM_conform; Boolean ARM_scoping; Boolean require_prototypes; Boolean trigraphs; Boolean only_std_keywords; Boolean enumsalwaysint; Boolean ANSI_strict; Boolean mpwc_relax; Boolean mpwc_newline; Boolean ignore_oldstyle; Boolean cpp_extensions; Boolean pointercast_lvalue; Boolean useRTTI; Boolean delete_exception; char _4B; Boolean oldalignment; Boolean unsignedchars; Boolean multibyteaware; Boolean autoinline; Boolean defer_codegen; Boolean direct_to_som; Boolean som_env_check; Boolean som_call_opt; Boolean booltruefalse; char old_enum_mangler; Boolean longlong; Boolean longlong_enums; char no_tfuncinline; Boolean _59; Boolean flat_include; char 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; char template_friends; Boolean faster_pch_gen; Boolean array_new_delete; Boolean dollar_identifiers; char def_inline_tfuncs; Boolean arg_dep_lookup; Boolean simple_prepdump; Boolean line_prepdump; Boolean fullpath_prepdump; char old_mtemplparser; Boolean suppress_init_code; Boolean reverse_bitfields; Boolean c9x; Boolean float_constants; Boolean no_static_dtors; Boolean longlong_prepeval; Boolean const_strings; char dumpir; Boolean experimental; Boolean gcc_extensions; char stdc_fp_contract; char stdc_fenv_access; char stdc_cx_limitedr; Boolean old_argmatch; Boolean optEH; Boolean optEH2; Boolean new_mangler; char microsoft; Boolean warningerrors; Boolean pedantic; Boolean check_header_flags; 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 align_mode; Boolean align_array_members; Boolean dont_reuse_strings; Boolean pool_strings; Boolean explicit_zero_data; Boolean readonly_strings; Boolean exceptions; char _99; Boolean dont_inline; Boolean always_inline; Boolean peephole; Boolean global_optimizer; char side_effects; Boolean internal; Boolean import; Boolean export; Boolean lib_export; Boolean nosyminline; char force_active; char optimizationlevel; Boolean optimize_for_size; Boolean optimizewithasm; Boolean crippled; Boolean opt_common_subs; Boolean opt_loop_invariants; Boolean opt_propagation; Boolean opt_dead_assignments; Boolean opt_strength_reduction; Boolean opt_strength_reduction_strict; Boolean opt_dead_code; Boolean opt_lifetimes; char _B1; // unused? Boolean opt_unroll_loops; char opt_vectorize_loops; Boolean _B4; // amount of IRO passes? Boolean opt_pointer_analysis; unsigned char opt_pointer_analysis_mode; char loop_unroll_count; char loop_unroll_size_threshold; Boolean isGeneratingDebugInfo; CWDataType pchCreator; CWDataType pchType; CWDataType text; HashNameNode *forcedSegment; // when set by #pragma segment } COpts; 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 COpts 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(char *a, 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