From 5014f55c482c4c45f7bf09cb6a5a4aa37ffdb04f Mon Sep 17 00:00:00 2001 From: ISSOtm Date: Tue, 21 Jan 2020 01:05:29 +0100 Subject: [PATCH] Treat PC as a symbol as well --- include/asm/rpn.h | 4 +++- src/asm/rpn.c | 28 ++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/include/asm/rpn.h b/include/asm/rpn.h index f8bcdc63..38de7fc1 100644 --- a/include/asm/rpn.h +++ b/include/asm/rpn.h @@ -17,9 +17,10 @@ #define MAXRPNLEN 1048576 struct Expression { - bool isKnown; // Whether the expression's value is known int32_t nVal; // If the expression's value is known, it's here char *reason; // Why the expression is not known, if it isn't + bool isKnown; // Whether the expression's value is known + bool isSymbol; // Whether the expression represents a symbol uint8_t *tRPN; // Array of bytes serializing the RPN expression uint32_t nRPNCapacity; // Size of the `tRPN` buffer uint32_t nRPNLength; // Used size of the `tRPN` buffer @@ -32,6 +33,7 @@ struct Expression { extern int32_t nPCOffset; bool rpn_isKnown(const struct Expression *expr); +bool rpn_isSymbol(const struct Expression *expr); void rpn_Symbol(struct Expression *expr, char *tzSym); void rpn_Number(struct Expression *expr, uint32_t i); void rpn_LOGNOT(struct Expression *expr, const struct Expression *src); diff --git a/src/asm/rpn.c b/src/asm/rpn.c index 652b1660..14b5cf87 100644 --- a/src/asm/rpn.c +++ b/src/asm/rpn.c @@ -74,13 +74,14 @@ static uint8_t *reserveSpace(struct Expression *expr, uint32_t size) */ void rpn_Init(struct Expression *expr) { + expr->reason = NULL; + expr->isKnown = true; + expr->isSymbol = false; expr->tRPN = NULL; expr->nRPNCapacity = 0; expr->nRPNLength = 0; expr->nRPNPatchSize = 0; expr->nRPNOut = 0; - expr->isKnown = true; - expr->reason = NULL; } /* @@ -112,6 +113,14 @@ bool rpn_isKnown(const struct Expression *expr) return expr->isKnown; } +/* + * Determine if the current expression is a symbol suitable for const diffing + */ +bool rpn_isSymbol(const struct Expression *expr) +{ + return expr->isSymbol; +} + /* * Add symbols, constants and operators to expression */ @@ -127,6 +136,8 @@ void rpn_Symbol(struct Expression *expr, char *tzSym) if (!sym || !sym_IsConstant(sym)) { rpn_Init(expr); + expr->isSymbol = true; + sym_Ref(tzSym); makeUnknown(expr, "'%s' is not defined", tzSym); expr->nRPNPatchSize += 5; /* 1-byte opcode + 4-byte symbol ID */ @@ -142,6 +153,8 @@ void rpn_Symbol(struct Expression *expr, char *tzSym) rpn_Number(&offset, nPCOffset); rpn_BinaryOp(RPN_SUB, expr, &pc, &offset); + if (!rpn_isKnown(expr)) + expr->isSymbol = true; } } else { rpn_Number(expr, sym_GetConstantValue(tzSym)); @@ -217,6 +230,7 @@ void rpn_BankSection(struct Expression *expr, char *tzSectionName) void rpn_CheckHRAM(struct Expression *expr, const struct Expression *src) { *expr = *src; + expr->isSymbol = false; if (rpn_isKnown(expr)) { /* TODO */ @@ -241,6 +255,7 @@ void rpn_CheckRST(struct Expression *expr, const struct Expression *src) void rpn_LOGNOT(struct Expression *expr, const struct Expression *src) { *expr = *src; + expr->isSymbol = false; if (rpn_isKnown(expr)) { expr->nVal = !expr->nVal; @@ -291,8 +306,7 @@ static int32_t shift(int32_t shiftee, int32_t amount) static struct sSymbol const *symbolOf(struct Expression const *expr) { - /* If an expression starts with a symbol ref... */ - if (!expr->tRPN || expr->tRPN[0] != RPN_SYM || expr->nRPNPatchSize != 5) + if (!rpn_isSymbol(expr)) return NULL; return sym_FindSymbol((char *)expr->tRPN + 1); } @@ -314,6 +328,8 @@ static bool isDiffConstant(struct Expression const *src1, void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr, const struct Expression *src1, const struct Expression *src2) { + expr->isSymbol = false; + /* First, check if the expression is known */ expr->isKnown = src1->isKnown && src2->isKnown; if (expr->isKnown) { @@ -478,6 +494,7 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr, void rpn_HIGH(struct Expression *expr, const struct Expression *src) { *expr = *src; + expr->isSymbol = false; if (rpn_isKnown(expr)) { expr->nVal = (uint32_t)expr->nVal >> 8 & 0xFF; @@ -492,6 +509,7 @@ void rpn_HIGH(struct Expression *expr, const struct Expression *src) void rpn_LOW(struct Expression *expr, const struct Expression *src) { *expr = *src; + expr->isSymbol = false; if (rpn_isKnown(expr)) { expr->nVal = expr->nVal & 0xFF; @@ -506,6 +524,7 @@ void rpn_LOW(struct Expression *expr, const struct Expression *src) void rpn_UNNEG(struct Expression *expr, const struct Expression *src) { *expr = *src; + expr->isSymbol = false; if (rpn_isKnown(expr)) { expr->nVal = -(uint32_t)expr->nVal; @@ -518,6 +537,7 @@ void rpn_UNNEG(struct Expression *expr, const struct Expression *src) void rpn_UNNOT(struct Expression *expr, const struct Expression *src) { *expr = *src; + expr->isSymbol = false; if (rpn_isKnown(expr)) { expr->nVal = ~expr->nVal;