X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fexprdesc.h;h=16322fb09c9cebdf1dde41be84d6e441dd122cd7;hb=7aefd9b4e7b67908b7b3c38b6003c7f1a8d3ee2d;hp=06225ccb101469a224a14abffd34fc188e66fef4;hpb=5586527fccfcffe65d4ef9eba666f8c3b0d3b3cc;p=cc65 diff --git a/src/cc65/exprdesc.h b/src/cc65/exprdesc.h index 06225ccb1..16322fb09 100644 --- a/src/cc65/exprdesc.h +++ b/src/cc65/exprdesc.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2002-2004 Ullrich von Bassewitz */ -/* Römerstraße 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2002-2010, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -41,9 +41,11 @@ #include /* common */ +#include "fp.h" #include "inline.h" /* cc65 */ +#include "asmcode.h" #include "datatype.h" @@ -76,25 +78,44 @@ enum { E_RTYPE_RVAL = 0x0000, E_RTYPE_LVAL = 0x0100, + /* Bit-field? */ + E_BITFIELD = 0x0200, + /* Test */ - E_NEED_TEST = 0x0200, /* Expression needs a test to set cc */ - E_CC_SET = 0x0400 /* Condition codes are set */ + E_NEED_TEST = 0x0400, /* Expression needs a test to set cc */ + E_CC_SET = 0x0800, /* Condition codes are set */ + + E_HAVE_MARKS = 0x1000, /* Code marks are valid */ + }; +/* Forward */ +struct Literal; + /* Describe the result of an expression */ typedef struct ExprDesc ExprDesc; struct ExprDesc { - struct SymEntry* Sym; /* Symbol table entry if known */ - type* Type; /* Type array of expression */ - long Val; /* Value if expression constant */ - unsigned short Flags; - unsigned long Name; /* Name or label number */ + struct SymEntry* Sym; /* Symbol table entry if known */ + Type* Type; /* Type array of expression */ + unsigned Flags; + unsigned long Name; /* Name or label number */ + long IVal; /* Integer value if expression constant */ + Double FVal; /* Floating point value */ + struct Literal* LVal; /* Literal value */ + + /* Bit field stuff */ + unsigned BitOffs; /* Bit offset for bit fields */ + unsigned BitWidth; /* Bit width for bit fields */ + + /* Start and end of generated code */ + CodeMark Start; + CodeMark End; }; /*****************************************************************************/ -/* Code */ +/* Code */ /*****************************************************************************/ @@ -165,7 +186,7 @@ INLINE int ED_IsLocExpr (const ExprDesc* Expr) #if defined(HAVE_INLINE) INLINE int ED_IsLocLiteral (const ExprDesc* Expr) /* Return true if the expression is a string from the literal pool */ -{ +{ return (Expr->Flags & E_MASK_LOC) == E_LOC_LITERAL; } #else @@ -222,6 +243,19 @@ INLINE void ED_MakeRVal (ExprDesc* Expr) # define ED_MakeRVal(Expr) do { (Expr)->Flags &= ~E_RTYPE_LVAL; } while (0) #endif +#if defined(HAVE_INLINE) +INLINE int ED_IsBitField (const ExprDesc* Expr) +/* Return true if the expression is a bit field */ +{ + return (Expr->Flags & E_BITFIELD) != 0; +} +#else +# define ED_IsBitField(Expr) (((Expr)->Flags & E_BITFIELD) != 0) +#endif + +void ED_MakeBitField (ExprDesc* Expr, unsigned BitOffs, unsigned BitWidth); +/* Make this expression a bit field expression */ + #if defined(HAVE_INLINE) INLINE void ED_MarkForTest (ExprDesc* Expr) /* Mark the expression for a test. */ @@ -273,6 +307,12 @@ INLINE void ED_MarkAsUntested (ExprDesc* Expr) # define ED_MarkAsUntested(Expr) do { (Expr)->Flags &= ~E_CC_SET; } while (0) #endif +void ED_SetCodeRange (ExprDesc* Expr, const CodeMark* Start, const CodeMark* End); +/* Set the code range for this expression */ + +int ED_CodeRangeIsEmpty (const ExprDesc* Expr); +/* Return true if no code was output for this expression */ + const char* ED_GetLabelName (const ExprDesc* Expr, long Offs); /* Return the assembler label name of the given expression. Beware: This * function may use a static buffer, so the name may get "lost" on the second @@ -284,7 +324,7 @@ int ED_GetStackOffs (const ExprDesc* Expr, int Offs); * an additional offset in Offs. */ -ExprDesc* ED_MakeConstAbs (ExprDesc* Expr, long Value, type* Type); +ExprDesc* ED_MakeConstAbs (ExprDesc* Expr, long Value, Type* Type); /* Make Expr an absolute const with the given value and type. */ ExprDesc* ED_MakeConstAbsInt (ExprDesc* Expr, long Value); @@ -306,10 +346,18 @@ int ED_IsConst (const ExprDesc* Expr); * similar. */ -int ED_IsConstAbs (const ExprDesc* Expr); +#if defined(HAVE_INLINE) +INLINE int ED_IsConstAbs (const ExprDesc* Expr) /* Return true if the expression denotes a constant absolute value. This can be * a numeric constant, cast to any type. */ +{ + return (Expr->Flags & (E_MASK_LOC|E_MASK_RTYPE)) == (E_LOC_ABS|E_RTYPE_RVAL); +} +#else +# define ED_IsConstAbs(E) \ + (((E)->Flags & (E_MASK_LOC|E_MASK_RTYPE)) == (E_LOC_ABS|E_RTYPE_RVAL)) +#endif int ED_IsConstAbsInt (const ExprDesc* Expr); /* Return true if the expression is a constant (numeric) integer. */ @@ -325,7 +373,7 @@ int ED_IsBool (const ExprDesc* Expr); void PrintExprDesc (FILE* F, ExprDesc* Expr); /* Print an ExprDesc */ -type* ReplaceType (ExprDesc* Expr, const type* NewType); +Type* ReplaceType (ExprDesc* Expr, const Type* NewType); /* Replace the type of Expr by a copy of Newtype and return the old type string */