diff options
author | Ash Wolf <ninji@wuffs.org> | 2022-11-07 03:06:21 +0000 |
---|---|---|
committer | Ash Wolf <ninji@wuffs.org> | 2022-11-07 03:06:21 +0000 |
commit | 9a46dd0e2e80790d9848c0bbd718932a27c23269 (patch) | |
tree | e7a8e976c7138d50a69ff4778c4e8572efd94452 /includes/compiler/CExpr.h | |
parent | d0b9848c54e6f85ab713f059dcd1ddef7e57caa6 (diff) | |
download | MWCC-9a46dd0e2e80790d9848c0bbd718932a27c23269.tar.gz MWCC-9a46dd0e2e80790d9848c0bbd718932a27c23269.zip |
honk
Diffstat (limited to '')
-rw-r--r-- | includes/compiler/CExpr.h | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/includes/compiler/CExpr.h b/includes/compiler/CExpr.h new file mode 100644 index 0000000..a82e56e --- /dev/null +++ b/includes/compiler/CExpr.h @@ -0,0 +1,237 @@ +#ifndef COMPILER_CEXPR_H +#define COMPILER_CEXPR_H + +#include "compiler/common.h" +#include "compiler/enode.h" +#include "compiler/types.h" +#include "compiler/CScope.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +typedef struct ConIteratorList { + struct ConIteratorList *next; + struct ConIterator *iter; +} ConIteratorList; + +typedef struct ConIterator { + struct ConIterator *parent; + ConIteratorList *children; + TypeClass *tclass; +} ConIterator; + +typedef struct ConversionIterator { + CScopeObjectIterator objiter; + ConIterator myconiter; + ConIterator *coniter; +} ConversionIterator; + +enum { + CheckResult0, + CheckResult1, + CheckResult2, + CheckResult3, + CheckResult4 +}; + +// Rename me to StdMatch? +typedef struct Match5 { + short x0; + short x2; + short x4; + short x6; + short x8; +} Match5; + +typedef struct Match13 { + short x0; + short x2; + short x4; + short x6; + short x8; + short xA; + short xC; + short xE; + Match5 match5; +} Match13; + +// CExpr.c +extern Boolean (*name_obj_check)(void *, Object *); // TODO figure out the right type +extern Boolean disallowgreaterthan; + +// CExpr2.c +extern ENode *assign_node; +extern Boolean temp_reference_init; + +// CExpr.c +extern void CExpr_RewriteConst(); +extern void optimizecomm(ENode *expr); +extern short canadd(ENode *expr, SInt32 value); +extern ENode *checkreference(ENode *expr); +extern ENode *pointer_generation(ENode *expr); +extern void CExpr_PointerGeneration(); +extern void oldassignmentpromotion(); +extern ENode *argumentpromotion(ENode *expr, Type *type, short qual, Boolean flag); +extern ENode *classargument(ENode *expr); +extern ENodeList *CExpr_ScanExpressionList(Boolean flag); +extern void CExpr_DoExplicitConversion(); +extern void CExpr_MakeNameLookupResultExpr(); +extern void scansizeof(); +extern void scanalignof(); +extern ENode *getnodeaddress(ENode *expr, Boolean flag); +extern void getpointertomemberfunc(); +extern void CExpr_New_ELOGNOT_Node(); +extern void CExpr_New_EMONMIN_Node(); +extern void CExpr_New_EBINNOT_Node(); +extern ENode *unary_expression(void); +extern ENode *do_castnullcheck(ENode *a, ENode *b); +extern void CExpr_SafeClassPointerCast(); +extern ENode *PointerToMemberCast(ENode *expr, TypeMemberPointer *tm1, TypeMemberPointer *tm2, Boolean flag); +extern void CExpr_MemberPointerConversion(); +extern ENode *do_typecast(ENode *expr, Type *type, UInt32 qual); +extern void cast_expression(); +extern void CExpr_New_EMUL_Node(); +extern void CExpr_New_EDIV_Node(); +extern void CExpr_New_EMODULO_Node(); +extern void CExpr_New_EADD_Node(); +extern void CExpr_New_ESUB_Node(); +extern void CExpr_New_ESHL_Node(); +extern void CExpr_New_ESHR_Node(); +extern void CExpr_New_ELESS_Node(); +extern void CExpr_New_ELESSEQU_Node(); +extern void CExpr_New_EGREATER_Node(); +extern void CExpr_New_EGREATEREQU_Node(); +extern ENode *memberpointercompare(ENodeType t, ENode *left, ENode *right); +extern void CExpr_New_EEQU_Node(); +extern void CExpr_New_ENOTEQU_Node(); +extern void CExpr_New_EAND_Node(); +extern void CExpr_New_EXOR_Node(); +extern void CExpr_New_EOR_Node(); +extern void CExpr_New_ELAND_Node(); +extern void CExpr_New_ELOR_Node(); +extern void CExpr_NewDyadicNode(); +extern void CExpr_New_ECOND_Node(); +extern ENode *assignment_expression(void); +extern ENode *conv_assignment_expression(void); +extern void CExpr_CheckUnusedExpression(); +extern void s_expression(); +extern ENode *expression(void); +extern CInt64 CExpr_IntegralConstExprType(Type **tint); +extern ENode *CExpr_IntegralConstOrDepExpr(void); +extern CInt64 CExpr_IntegralConstExpr(void); +extern void CExpr_CheckUnwantedAssignment(); +extern void CExpr_ParseAsmExpr(); + +// CExpr2.c +typedef void (*CExprSearchCB)(ENode *expr); +typedef ENode *(*CExprReplaceCB)(ENode *expr); + +extern void CExpr_SearchExprTree(ENode *expr, CExprSearchCB callback, int count, ...); +extern ENode *CExpr_SearchExprTreeReplace(ENode *expr, CExprReplaceCB callback, int count, ...); +extern Boolean CExpr_HasFuncCall(ENode *expr); +extern void CExpr_AliasTransform(ENode *expr); +extern ENode *CExpr_UnaryFloatExpression(ENode *expr); +extern ENode *CExpr_BinaryFloatExpression(ENode *expr); +extern ENode *CExpr_NewENode(ENodeType ty); +extern ENode *CExpr_NewTemplDepENode(TemplDepSubType t); +extern ENode *nullnode(void); +extern ENode *intconstnode(Type *type, SInt32 value); +extern ENode *stringconstnode(char *str); +extern ENode *forceintegral(ENode *expr); +extern ENode *makemonadicnode(ENode *inner, ENodeType ty); +extern ENode *makediadicnode(ENode *left, ENode *right, ENodeType ty); +extern ENode *makecommaexpression(ENode *left, ENode *right); +extern short iszero(ENode *expr); +extern short isnotzero(ENode *expr); +extern Boolean CExpr_IsOne(ENode *expr); +extern Boolean CExpr_AllBitsSet(ENode *expr); +extern ENode *CExpr_NewETEMPNode(Type *type, Boolean assign_id); +extern ENode *CExpr_GetETEMPCopy(ENode *expr); +extern ENode *integralpromote(ENode *expr); +extern CInt64 CExpr_IntConstConvert(Type *a, Type *b, CInt64 val); +extern ENode *promote(ENode *expr, Type *type); +extern void CExpr_ArithmeticConversion(ENode **left, ENode **right); +extern ENode *CExpr_TempModifyExpr(ENode *expr); +extern Boolean CExpr_IsLValue(ENode *expr); +extern ENode *CExpr_LValue(ENode *expr, Boolean flag1, Boolean flag2); +extern ENode *CExpr_MakeObjRefNode(Object *obj, Boolean flag); +extern ENode *create_objectrefnode(Object *obj); +extern ENode *create_objectnode2(Object *obj); +extern ENode *create_objectnode(Object *obj); +extern ENode *CExpr_IsTempConstruction(ENode *expr, Type *type, ENode **resultexpr); +extern ENode *CExpr_AdjustFunctionCall(ENode *expr); +extern ENode *funccallexpr(Object *func, ENode *arg1, ENode *arg2, ENode *arg3, ENode *arg4); +extern ENode *CExpr_FuncCallSix(Object *func, ENode *arg1, ENode *arg2, ENode *arg3, ENode *arg4, ENode *arg5, ENode *arg6); +extern void CExpr_MatchCV(Type *t1, UInt32 q1, Type *t2, UInt32 q2, Match13 *match); +extern Boolean CExpr_MatchAssign(Type *type, UInt32 qual, ENode *expr, Match13 *match); +extern ENode *CExpr_ClassPointerCast(BClassList *cls, ENode *expr, Boolean nullcheckflag); +extern ENode *CExpr_GetClassAccessNode(BClassList *a, BClassList *b, ENode *expr, Object *obj, AccessType access, Boolean flag); +extern ENode *CExpr_ConvertToBool(ENode *expr, Boolean flag); +extern void CExpr_ConversionIteratorInit(ConversionIterator *iter, TypeClass *tclass); +extern Object *CExpr_ConversionIteratorNext(ConversionIterator *iter); +extern void user_assign_check(); +extern ENode *CExpr_ConvertToCondition(ENode *expr); +extern void CExpr_ConvertToIntegral(); +extern void CExpr_CheckArithmConversion(); +extern void get_address_of_temp_copy(); +extern short assign_check(ENode *expr, Type *type, UInt32 qual, Boolean flag1, Boolean flag2, Boolean flag3); +extern void CExpr_MatchCompare(); +extern void CExpr_GetFuncMatchArgs(); +extern ENode *CExpr_GetDefaultArgument(ENode *funcexpr, FuncArg *arg); +extern ENode *CExpr_VarArgPromotion(ENode *expr, Boolean flag); +extern void CExpr_GenericFuncCall(); +extern void CExpr_GenericPtmfCall(); +extern void CExpr_MakeFunctionCall(); +extern void CExpr_CheckOperatorConversion(); +extern void CExpr_CheckOperator(); +extern ENode *CExpr_ConstructObject(TypeClass *tclass, ENode *addr_expr, ENodeList *args, Boolean flag1, Boolean flag2, Boolean flag3, Boolean flag4, Boolean flag5); +extern void scannew(); +extern void scandelete(); + +// CExprConvMatch.c +// static void CExpr_GetImplictObjectParamType(); +// static void CExpr_GetParamType(); +// static void CExpr_HasNParams(); +// static void CExpr_TypeCompare(); +// static void CExpr_IsReferenceCompatible(); +// static void CExpr_IsBaseOf(); +// static void CExpr_IsBetterClassConversion(); +// static void CExpr_IsBetterStandardConv(); +// static void CExpr_IsBetterImplicitConv(); +// static void CExpr_SetupStandardConversionResult(); +// static void CExpr_SetQualConversionResult(); +// static void CExpr_OverloadFuncMatch(); +// static void CExpr_StandardConversionMatch(); +// static void CExpr_UserConversion(); +// static void CExpr_UserConversionMatch(); +// static void CExpr_ImplicitConversionMatch(); +extern Boolean CExpr_CanImplicitlyConvert(ENode *expr, Type *type, UInt32 qual); +// static void CExpr_DerivedToBase(); +// static void CExpr_ClassReferenceConversion(); +// static void CExpr_BindToReference(); +extern ENode *CExpr_Convert(ENode *expr, Type *type, UInt32 qual, Boolean flag1, Boolean flag2); +extern ENode *CExpr_AssignmentPromotion(ENode *expr, Type *type, UInt32 qual, Boolean flag); +// static void CExpr_IsBetterMatch(); +// static void CExpr_MatchArgs(); +// static void CExpr_GetMatchObject(); +// static void CExpr_FindBestMatch(); +extern void CExpr_FuncArgMatch(); +// static void CExpr_BuildConversionTypeList(); +// static void CExpr_NextPromotedIntegralType(); +// static void CExpr_NextArithmeticType(); +// static void CExpr_NextPromotedArithmeticType(); +// static void CExpr_MatchBuiltin(); +// static void CExpr_CheckIncDecBuiltin(); +// static void CExpr_CheckUnaryBuiltin(); +// static void CExpr_CheckBinaryBuiltin(); +// static void CExpr_MatchOperands(); +extern void CExpr_CondOperatorMatch(); +extern void CExpr_OperatorMatch(); +// static void CExpr_ClassCopyInit(); + +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +#endif |