2022-11-07 03:06:21 +00:00
|
|
|
#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
|
|
|
|
};
|
|
|
|
|
2022-11-20 05:07:22 +00:00
|
|
|
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
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2022-11-07 03:06:21 +00:00
|
|
|
// 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;
|
|
|
|
char no_implicit_templates;
|
|
|
|
char absolutepath; // determines the path written to debug info
|
|
|
|
char x06; // linker/objgen related
|
|
|
|
short cpu;
|
|
|
|
char schedule_cpu;
|
2022-11-20 05:07:22 +00:00
|
|
|
char schedule_mode; // may be an enum??
|
2022-11-07 03:06:21 +00:00
|
|
|
SInt32 debuglisting;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean profile;
|
|
|
|
Boolean traceback;
|
2022-11-07 03:06:21 +00:00
|
|
|
Boolean disable_registers;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean fp_contract;
|
2022-11-07 03:06:21 +00:00
|
|
|
Boolean no_register_save_helpers;
|
|
|
|
char ppc_unroll_speculative;
|
|
|
|
short ppc_unroll_instructions_limit;
|
|
|
|
short ppc_unroll_factor_limit;
|
|
|
|
Boolean altivec_model;
|
2022-11-20 05:07:22 +00:00
|
|
|
UInt8 altivec_vrsave;
|
2022-11-07 03:06:21 +00:00
|
|
|
UInt8 code_alignment;
|
|
|
|
char x1D;
|
|
|
|
UInt8 x1E; // some register used in TOC_use_isel
|
|
|
|
UInt8 gen_fsel;
|
|
|
|
char ppc_opt_bclr_bcctr;
|
|
|
|
Boolean use_lmw_stmw;
|
|
|
|
char report_heap_info;
|
|
|
|
char misaligned_mem_access;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean switch_tables;
|
2022-11-07 03:06:21 +00:00
|
|
|
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;
|
|
|
|
char inline_bottom_up;
|
|
|
|
Boolean cplusplus;
|
|
|
|
Boolean ecplusplus;
|
|
|
|
Boolean objective_c;
|
|
|
|
char objc_strict;
|
|
|
|
Boolean ARM_conform;
|
|
|
|
char 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;
|
|
|
|
char useRTTI;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean delete_exception;
|
2022-11-07 03:06:21 +00:00
|
|
|
char _4B;
|
|
|
|
Boolean oldalignment;
|
|
|
|
Boolean unsignedchars;
|
|
|
|
Boolean multibyteaware;
|
|
|
|
char autoinline;
|
|
|
|
char defer_codegen;
|
|
|
|
Boolean direct_to_som;
|
|
|
|
char som_env_check;
|
|
|
|
char som_call_opt;
|
|
|
|
Boolean booltruefalse;
|
|
|
|
char old_enum_mangler;
|
|
|
|
Boolean longlong;
|
|
|
|
Boolean longlong_enums;
|
|
|
|
char no_tfuncinline;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean _59;
|
2022-11-07 03:06:21 +00:00
|
|
|
Boolean flat_include;
|
|
|
|
char syspath_once;
|
|
|
|
Boolean always_import;
|
|
|
|
char simple_class_byval;
|
|
|
|
Boolean wchar_type;
|
|
|
|
Boolean vbase_ctor_offset;
|
|
|
|
char vbase_abi_v2;
|
|
|
|
Boolean def_inherited;
|
|
|
|
char template_patch;
|
|
|
|
char template_friends;
|
|
|
|
char faster_pch_gen;
|
|
|
|
Boolean array_new_delete;
|
|
|
|
Boolean dollar_identifiers;
|
|
|
|
char def_inline_tfuncs;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean arg_dep_lookup;
|
2022-11-07 03:06:21 +00:00
|
|
|
Boolean simple_prepdump;
|
|
|
|
char line_prepdump;
|
|
|
|
char fullpath_prepdump;
|
|
|
|
char old_mtemplparser;
|
|
|
|
char suppress_init_code;
|
|
|
|
Boolean reverse_bitfields;
|
|
|
|
Boolean c9x;
|
|
|
|
Boolean float_constants;
|
|
|
|
Boolean no_static_dtors;
|
|
|
|
Boolean longlong_prepeval;
|
|
|
|
Boolean const_strings;
|
|
|
|
char dumpir;
|
|
|
|
char experimental;
|
|
|
|
Boolean gcc_extensions;
|
|
|
|
char stdc_fp_contract;
|
|
|
|
char stdc_fenv_access;
|
|
|
|
char stdc_cx_limitedr;
|
|
|
|
Boolean old_argmatch;
|
|
|
|
char optEH;
|
|
|
|
char optEH2;
|
|
|
|
Boolean new_mangler;
|
|
|
|
char microsoft;
|
|
|
|
Boolean warningerrors;
|
|
|
|
Boolean pedantic;
|
|
|
|
char check_header_flags;
|
|
|
|
Boolean supress_warnings;
|
|
|
|
Boolean warn_illpragma;
|
|
|
|
Boolean warn_emptydecl;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean warn_possunwant;
|
2022-11-07 03:06:21 +00:00
|
|
|
char warn_unusedvar;
|
|
|
|
char warn_unusedarg;
|
|
|
|
Boolean warn_extracomma;
|
|
|
|
char warn_hidevirtual;
|
|
|
|
Boolean warn_largeargs;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean warn_implicitconv;
|
2022-11-07 03:06:21 +00:00
|
|
|
char warn_notinlined;
|
|
|
|
Boolean warn_structclass;
|
|
|
|
Boolean warn_padding;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean warn_no_side_effect;
|
|
|
|
Boolean warn_resultnotused;
|
2022-11-07 03:06:21 +00:00
|
|
|
char 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;
|
|
|
|
char dont_inline;
|
|
|
|
char always_inline;
|
|
|
|
Boolean peephole;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean global_optimizer;
|
2022-11-07 03:06:21 +00:00
|
|
|
char side_effects;
|
|
|
|
Boolean internal;
|
|
|
|
Boolean import;
|
|
|
|
Boolean export;
|
|
|
|
Boolean lib_export;
|
|
|
|
char nosyminline;
|
|
|
|
char force_active;
|
|
|
|
char optimizationlevel;
|
|
|
|
Boolean optimize_for_size;
|
2022-11-20 05:07:22 +00:00
|
|
|
Boolean optimizewithasm;
|
2022-11-07 03:06:21 +00:00
|
|
|
Boolean crippled;
|
|
|
|
char opt_common_subs;
|
|
|
|
char opt_loop_invariants;
|
|
|
|
char opt_propagation;
|
|
|
|
char opt_dead_assignments;
|
|
|
|
char opt_strength_reduction;
|
|
|
|
char opt_strength_reduction_strict;
|
|
|
|
char opt_dead_code;
|
|
|
|
char opt_lifetimes;
|
|
|
|
char _B1; // unused?
|
|
|
|
char opt_unroll_loops;
|
|
|
|
char opt_vectorize_loops;
|
|
|
|
char _B4; // amount of IRO passes?
|
|
|
|
char opt_pointer_analysis;
|
|
|
|
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(Object *obj);
|
|
|
|
extern Boolean CParser_HasInternalLinkage2(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
|