/* */
/* */
/* */
-/* (C) 2002-2004 Ullrich von Bassewitz */
-/* Römerstraße 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 2002-2009, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
#include "asmlabel.h"
#include "datatype.h"
#include "error.h"
+#include "exprdesc.h"
#include "stackptr.h"
#include "symentry.h"
#include "exprdesc.h"
ExprDesc* ED_Init (ExprDesc* Expr)
/* Initialize an ExprDesc */
{
- Expr->Sym = 0;
- Expr->Type = 0;
- Expr->Flags = 0;
- Expr->Name = 0;
- Expr->IVal = 0;
- Expr->FVal = 0.0;
+ Expr->Sym = 0;
+ Expr->Type = 0;
+ Expr->Flags = 0;
+ Expr->Name = 0;
+ Expr->IVal = 0;
+ Expr->FVal = FP_D_Make (0.0);
+ Expr->BitOffs = 0;
+ Expr->BitWidth = 0;
return Expr;
}
+void ED_MakeBitField (ExprDesc* Expr, unsigned BitOffs, unsigned BitWidth)
+/* Make this expression a bit field expression */
+{
+ Expr->Flags |= E_BITFIELD;
+ Expr->BitOffs = BitOffs;
+ Expr->BitWidth = 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
-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. */
{
Expr->Sym = 0;
Expr->Type = Type;
- Expr->Flags = E_LOC_ABS | E_RTYPE_RVAL;
+ Expr->Flags = E_LOC_ABS | E_RTYPE_RVAL | (Expr->Flags & E_HAVE_MARKS);
Expr->Name = 0;
Expr->IVal = Value;
- Expr->FVal = 0.0;
+ Expr->FVal = FP_D_Make (0.0);
return Expr;
}
{
Expr->Sym = 0;
Expr->Type = type_int;
- Expr->Flags = E_LOC_ABS | E_RTYPE_RVAL;
+ Expr->Flags = E_LOC_ABS | E_RTYPE_RVAL | (Expr->Flags & E_HAVE_MARKS);
Expr->Name = 0;
Expr->IVal = Value;
- Expr->FVal = 0.0;
+ Expr->FVal = FP_D_Make (0.0);
return Expr;
}
*/
{
Expr->Sym = 0;
- Expr->Flags &= ~(E_MASK_LOC | E_MASK_RTYPE | E_NEED_TEST | E_CC_SET);
+ Expr->Flags &= ~(E_MASK_LOC | E_MASK_RTYPE | E_BITFIELD | E_NEED_TEST | E_CC_SET);
Expr->Flags |= (E_LOC_EXPR | E_RTYPE_RVAL);
Expr->Name = 0;
Expr->IVal = 0; /* No offset */
- Expr->FVal = 0.0;
+ Expr->FVal = FP_D_Make (0.0);
return Expr;
}
*/
{
Expr->Sym = 0;
- Expr->Flags &= ~(E_MASK_LOC | E_MASK_RTYPE | E_NEED_TEST | E_CC_SET);
+ Expr->Flags &= ~(E_MASK_LOC | E_MASK_RTYPE | E_BITFIELD | E_NEED_TEST | E_CC_SET);
Expr->Flags |= (E_LOC_EXPR | E_RTYPE_LVAL);
Expr->Name = 0;
Expr->IVal = 0; /* No offset */
- Expr->FVal = 0.0;
+ Expr->FVal = FP_D_Make (0.0);
return 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_LOC_ABS|E_RTYPE_RVAL) &&
- Expr->IVal == 0 &&
+ return (Expr->Flags & (E_MASK_LOC|E_MASK_RTYPE|E_BITFIELD)) ==
+ (E_LOC_ABS|E_RTYPE_RVAL) &&
+ Expr->IVal == 0 &&
IsClassInt (Expr->Type);
}
"Raw type: (unknown)\n");
}
fprintf (F, "IVal: 0x%08lX\n", E->IVal);
- fprintf (F, "FVal: %f\n", E->FVal);
+ fprintf (F, "FVal: %f\n", FP_D_ToFloat (E->FVal));
Flags = E->Flags;
Sep = '(';
Flags &= ~E_RTYPE_LVAL;
Sep = ',';
}
+ if (Flags & E_BITFIELD) {
+ fprintf (F, "%cE_BITFIELD", Sep);
+ Flags &= ~E_BITFIELD;
+ Sep = ',';
+ }
if (Flags & E_NEED_TEST) {
fprintf (F, "%cE_NEED_TEST", Sep);
Flags &= ~E_NEED_TEST;
-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 */
{
- type* OldType = Expr->Type;
+ Type* OldType = Expr->Type;
Expr->Type = TypeDup (NewType);
return OldType;
}