]> git.sur5r.net Git - cc65/blobdiff - src/cc65/exprdesc.h
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / src / cc65 / exprdesc.h
index 06225ccb101469a224a14abffd34fc188e66fef4..f2d5ce3220e7e875e97d28029faeb8c71c2f6a56 100644 (file)
@@ -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       */
 #include <string.h>
 
 /* common */
+#include "fp.h"
 #include "inline.h"
 
 /* cc65 */
+#include "asmcode.h"
 #include "datatype.h"
 
 
 
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
@@ -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 */