1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-26 05:29:30 +00:00

Reenable compile time evaluation of strlen for string literals.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4631 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2010-03-20 18:51:59 +00:00
parent 15f95d7623
commit 1a4e2edede
4 changed files with 16 additions and 12 deletions

View File

@ -578,7 +578,6 @@ static void Primary (ExprDesc* E)
/* This is the lowest level of the expression parser. */
{
SymEntry* Sym;
Literal* L;
/* Initialize fields in the expression stucture */
ED_Init (E);
@ -749,11 +748,11 @@ static void Primary (ExprDesc* E)
case TOK_SCONST:
case TOK_WCSCONST:
/* String literal */
L = UseLiteral (CurTok.SVal);
E->LVal = UseLiteral (CurTok.SVal);
E->Type = GetCharArrayType (GetLiteralSize (CurTok.SVal));
E->Flags = E_LOC_LITERAL | E_RTYPE_RVAL;
E->IVal = 0;
E->Name = GetLiteralLabel (CurTok.SVal);
E->Name = GetLiteralLabel (CurTok.SVal);
NextToken ();
break;

View File

@ -6,7 +6,7 @@
/* */
/* */
/* */
/* (C) 2002-2009, Ullrich von Bassewitz */
/* (C) 2002-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
@ -63,6 +63,7 @@ ExprDesc* ED_Init (ExprDesc* Expr)
Expr->Name = 0;
Expr->IVal = 0;
Expr->FVal = FP_D_Make (0.0);
Expr->LVal = 0;
Expr->BitOffs = 0;
Expr->BitWidth = 0;
return Expr;

View File

@ -6,7 +6,7 @@
/* */
/* */
/* */
/* (C) 2002-2009, Ullrich von Bassewitz */
/* (C) 2002-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
@ -89,6 +89,9 @@ enum {
};
/* Forward */
struct Literal;
/* Describe the result of an expression */
typedef struct ExprDesc ExprDesc;
struct ExprDesc {
@ -98,6 +101,7 @@ struct ExprDesc {
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 */
@ -182,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

View File

@ -933,8 +933,7 @@ static void StdFunc_strlen (FuncDesc* F attribute ((unused)), ExprDesc* Expr)
/* Do type conversion */
TypeConversion (&Arg, ArgType);
#if 0
/* If the expression is a literal, and if string literals are read
* only, we can calculate the length of the string and remove it
* from the literal pool. Otherwise we have to calculate the length
@ -943,15 +942,16 @@ static void StdFunc_strlen (FuncDesc* F attribute ((unused)), ExprDesc* Expr)
if (ED_IsLocLiteral (&Arg) && IS_Get (&WritableStrings) == 0) {
/* Constant string literal */
ED_MakeConstAbs (Expr, GetLiteralSize (GetLiteral (Arg.IVal)), type_size_t);
ED_MakeConstAbs (Expr, GetLiteralSize (Arg.LVal) - 1, type_size_t);
/* We don't need the literal any longer */
ReleaseLiteral (Arg.LVal);
/* We will inline strlen for arrays with constant addresses, if either the
* inlining was forced on the command line, or the array is smaller than
* 256, so the inlining is considered safe.
*/
} else
#endif
if (ED_IsLocConst (&Arg) && IsArray &&
} else if (ED_IsLocConst (&Arg) && IsArray &&
(IS_Get (&InlineStdFuncs) || IsByteIndex)) {
/* Generate the strlen code */