]> git.sur5r.net Git - cc65/commitdiff
Add a warning for an address expression that is usually the result of a typo
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 13 May 2003 19:10:32 +0000 (19:10 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 13 May 2003 19:10:32 +0000 (19:10 +0000)
and almost never used in this form.

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

src/ca65/error.c
src/ca65/error.h
src/ca65/instr.c
src/ca65/instr.h

index fc984268bf60d373234d77d001698d4704e06d83..162080d7b8ec6d9317f66b369fd9db4daa147609 100644 (file)
@@ -75,6 +75,7 @@ void WarningMsg (const FilePos* Pos, unsigned WarnNum, va_list ap)
                {   2,  "Symbol `%s' is defined but never used"         },
         {   2,  "Symbol `%s' is imported but never used"       },
        {   1,  "Cannot track processor status byte"            },
+               {   1,  "Suspicious address expression"                 },
                {   0,  "User warning: %s"                              },
     };
 
index 6656645310d2e3f3b60a0843bf3049d6e157b722..ca7ef370e3ab3ee7b1d1b1353af397381d95062f 100644 (file)
@@ -55,6 +55,7 @@ enum Warnings {
     WARN_SYM_NOT_REFERENCED,
     WARN_IMPORT_NOT_REFERENCED,
     WARN_CANNOT_TRACK_STATUS,
+    WARN_SUSPICIOUS_ADDREXPR,
     WARN_USER,
     WARN_COUNT                         /* Warning count */
 };
index 942650816841d226222af21b2b15e6957596b14d..6cd78b62ca37c0f157d6f8fd39bf4fd1db83b939 100644 (file)
@@ -48,6 +48,7 @@
 #include "global.h"
 #include "nexttok.h"
 #include "objcode.h"
+#include "symtab.h"
 #include "instr.h"
 
 
@@ -606,21 +607,42 @@ static void PutAll (const InsDesc* Ins)
      * modes.
      */
     if (Expr && (AddrModeSet & AM_ZP) && !IsByteExpr (Expr)) {
-       AddrModeSet &= ~AM_ZP;
+               AddrModeSet &= ~AM_ZP;
     }
 
     /* Check if we have any adressing modes left */
     if (AddrModeSet == 0) {
-       Error (ERR_ILLEGAL_ADDR_MODE);
-       return;
+               Error (ERR_ILLEGAL_ADDR_MODE);
+               return;
     }
     AddrMode = BitFind (AddrModeSet);
 
+    /* If the instruction has a one byte operand and immediate addressing is
+     * allowed but not used, check for an operand expression in the form
+     * <label or >label, where label is a far or absolute label. If found,
+     * emit a warning. This warning protects against a typo, where the '#'
+     * for the immediate operand is omitted.
+     */
+    if (Expr && (Ins->AddrMode & AM_IMM)                &&
+        (AddrModeSet & (AM_DIR | AM_ABS | AM_ABS_LONG)) &&
+        ExtBytes[AddrMode] == 1) {
+
+        /* Found, check the expression */
+        ExprNode* Left = Expr->Left;
+        if ((Expr->Op == EXPR_BYTE0 || Expr->Op == EXPR_BYTE1) &&
+            Left->Op == EXPR_SYMBOL                            &&
+            !SymIsZP (Left->V.Sym)) {
+
+            /* Output a warning */
+            Warning (WARN_SUSPICIOUS_ADDREXPR);
+        }
+    }
+
     /* Build the opcode */
     OpCode = Ins->BaseCode | EATab [Ins->ExtCode][AddrMode];
 
     /* Check how many extension bytes are needed and output the instruction */
-    switch (ExtBytes [AddrMode]) {
+    switch (ExtBytes[AddrMode]) {
 
         case 0:
            Emit0 (OpCode);
@@ -637,7 +659,7 @@ static void PutAll (const InsDesc* Ins)
                 * mode, force this address into 16 bit range to allow
                 * addressing inside a 64K segment.
                 */
-               Emit2 (OpCode, ForceWordExpr (Expr));
+                       Emit2 (OpCode, ForceWordExpr (Expr));
            } else {
                Emit2 (OpCode, Expr);
            }
index 23627f29ea2b90a682c33c130328ca45125a2ccb..7d01e15ea2f1eea28969605a6b88f6913911d963 100644 (file)
 
 
 /* Description for one instruction */
-typedef struct InsDesc_ InsDesc;
-struct InsDesc_ {
-    char               Mnemonic [4];
+typedef struct InsDesc InsDesc;
+struct InsDesc {
+    char                       Mnemonic [4];
     unsigned long              AddrMode;               /* Valid adressing modes */
-    unsigned char      BaseCode;               /* Base opcode */
-    unsigned char      ExtCode;                /* Number of ext code table */
+    unsigned char      BaseCode;               /* Base opcode */
+    unsigned char      ExtCode;                /* Number of ext code table */
     void                       (*Emit) (const InsDesc*);/* Handler function */
 };
 
 /* An instruction table */
-typedef struct InsTable_ InsTable;
-struct InsTable_ {
-    unsigned           Count;                  /* Number of intstructions */
+typedef struct InsTable InsTable;
+struct InsTable {
+    unsigned                   Count;                  /* Number of intstructions */
     InsDesc                    Ins[1];                 /* Varying length */
 };
 
@@ -125,7 +125,7 @@ extern unsigned char ExtBytes [AMI_COUNT];
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                          Code                                    */
 /*****************************************************************************/