]> git.sur5r.net Git - cc65/commitdiff
Allow to store start and end of generated code in the ExprDesc structure. New
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 8 Sep 2009 19:48:22 +0000 (19:48 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 8 Sep 2009 19:48:22 +0000 (19:48 +0000)
function MarkedExprWithCheck.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4135 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/expr.c
src/cc65/expr.h
src/cc65/exprdesc.c
src/cc65/exprdesc.h

index 9dd6afe8da9ef121c833176eda808325a297532c..7f30bb11bdb24f719b8f57b4899c41b107a12b29 100644 (file)
@@ -71,7 +71,7 @@ static GenDesc GenOASGN  = { TOK_OR_ASSIGN,   GEN_NOPUSH,     g_or  };
 
 
 /*****************************************************************************/
-/*                            Helper functions                              */
+/*                            Helper functions                              */
 /*****************************************************************************/
 
 
@@ -97,7 +97,7 @@ static unsigned GlobalModeFlags (const ExprDesc* Expr)
 
 
 
-void ExprWithCheck (void (*Func) (ExprDesc*), ExprDesc *Expr)
+void ExprWithCheck (void (*Func) (ExprDesc*), ExprDescExpr)
 /* Call an expression function with checks. */
 {
     /* Remember the stack pointer */
@@ -121,6 +121,20 @@ void ExprWithCheck (void (*Func) (ExprDesc*), ExprDesc *Expr)
 
 
 
+void MarkedExprWithCheck (void (*Func) (ExprDesc*), ExprDesc* Expr)
+/* Call an expression function with checks and record start and end of the
+ * generated code.
+ */
+{
+    CodeMark Start, End;
+    GetCodePos (&Start);
+    ExprWithCheck (Func, Expr);
+    GetCodePos (&End);
+    ED_SetCodeRange (Expr, &Start, &End);
+}
+
+
+
 static Type* promoteint (Type* lhst, Type* rhst)
 /* In an expression with two ints, return the type of the result */
 {
index ef57629399b461ea5d3ab741763365d40ef0174e..c98074356ef7ba55cc4c693417f6d090904e2eb4 100644 (file)
 
 
 
-void ExprWithCheck (void (*Func) (ExprDesc*), ExprDesc *Expr);
+void ExprWithCheck (void (*Func) (ExprDesc*), ExprDescExpr);
 /* Call an expression function with checks. */
 
+void MarkedExprWithCheck (void (*Func) (ExprDesc*), ExprDesc* Expr);
+/* Call an expression function with checks and record start and end of the
+ * generated code.
+ */
+
 void PushAddr (const ExprDesc* Expr);
 /* If the expression contains an address that was somehow evaluated,
  * push this address on the stack. This is a helper function for all
@@ -41,7 +46,7 @@ void Store (ExprDesc* Expr, const Type* StoreType);
 
 int evalexpr (unsigned flags, void (*Func) (ExprDesc*), ExprDesc* Expr);
 /* Will evaluate an expression via the given function. If the result is a
- * constant, 0 is returned and the value is put in the lval struct. If the
+ * constant, 0 is returned and the value is put in the Expr struct. If the
  * result is not constant, LoadExpr is called to bring the value into the
  * primary register and 1 is returned.
  */
index 6726a2cf1cb92c58299c327e88f1042540099d15..7881f352458d035b0a17b7025cf1fe1c5d995852 100644 (file)
@@ -80,6 +80,27 @@ void ED_MakeBitField (ExprDesc* Expr, unsigned BitOffs, unsigned BitWidth)
 
 
 
+void ED_SetCodeRange (ExprDesc* Expr, const CodeMark* Start, const CodeMark* End)
+/* Set the code range for this expression */
+{
+    Expr->Flags |= E_HAVE_MARKS;
+    Expr->Start = *Start;
+    Expr->End   = *End;
+}
+
+
+
+int ED_CodeRangeIsEmpty (const ExprDesc* Expr)
+/* Return true if no code was output for this expression */
+{
+    /* We must have code marks */
+    PRECONDITION (Expr->Flags & E_HAVE_MARKS);
+
+    return CodeRangeIsEmpty (&Expr->Start, &Expr->End);
+}
+
+
+
 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
@@ -229,7 +250,7 @@ int ED_IsConstAbsInt (const ExprDesc* Expr)
 int ED_IsNullPtr (const ExprDesc* Expr)
 /* Return true if the given expression is a NULL pointer constant */
 {
-    return (Expr->Flags & (E_MASK_LOC|E_MASK_RTYPE|E_BITFIELD)) == 
+    return (Expr->Flags & (E_MASK_LOC|E_MASK_RTYPE|E_BITFIELD)) ==
                                 (E_LOC_ABS|E_RTYPE_RVAL) &&
            Expr->IVal == 0                               &&
            IsClassInt (Expr->Type);
index 6091f159791a1b0ba0f20e7e5b985cfca1f73184..9de064952e20a8e1603c61f01d3274202707404a 100644 (file)
@@ -45,6 +45,7 @@
 #include "inline.h"
 
 /* cc65 */
+#include "asmcode.h"
 #include "datatype.h"
 
 
@@ -82,7 +83,10 @@ enum {
 
     /* Test */
     E_NEED_TEST         = 0x0400,       /* Expression needs a test to set cc */
-    E_CC_SET            = 0x0800        /* Condition codes are set */
+    E_CC_SET            = 0x0800,       /* Condition codes are set */
+
+    E_HAVE_MARKS        = 0x1000,       /* Code marks are valid */
+
 };
 
 /* Describe the result of an expression */
@@ -91,12 +95,17 @@ struct ExprDesc {
     struct SymEntry*   Sym;            /* Symbol table entry if known */
     Type*              Type;           /* Type array of expression */
     unsigned            Flags;
-    unsigned long      Name;           /* Name or label number */
+    unsigned long      Name;           /* Name or label number */
     long                       IVal;           /* Integer value if expression constant */
     Double              FVal;           /* Floating point 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;
 };
 
 
@@ -294,6 +303,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