]> git.sur5r.net Git - cc65/commitdiff
Fix non-goto jumps (i.e. inline assembly).
authorlaubzega <mileksmyk@gmail.com>
Sat, 29 Sep 2018 19:06:33 +0000 (12:06 -0700)
committerOliver Schmidt <ol.sc@web.de>
Tue, 2 Oct 2018 16:49:53 +0000 (18:49 +0200)
src/cc65/goto.c
src/cc65/symentry.h
src/cc65/symtab.c

index 3b1d243e76d05b420c2000f800668e85ad74368c..ae9e6096d48536bce61fa44ce97b51117d224e65 100644 (file)
@@ -61,7 +61,7 @@ void GotoStatement (void)
     } else {
 
         /* Add a new label symbol if we don't have one until now */
-        SymEntry* Entry = AddLabelSym (CurTok.Ident, SC_REF);
+        SymEntry* Entry = AddLabelSym (CurTok.Ident, SC_REF | SC_GOTO);
 
         /* Jump to the label */
         g_jump (Entry->V.L.Label);
index 2dc731f35f3b4f940f903faed9d81864ef9499d8..e978274dccd77dbc32a586830c02f0e4da9fc1f5 100644 (file)
@@ -98,6 +98,8 @@ struct LiteralPool;
 
 #define SC_HAVEATTR     0x10000U        /* Symbol has attributes */
 
+#define SC_GOTO         0x20000U
+
 
 
 
index 9a34de0dc02b9f2ed1352b4c6712763b4a3353df..d76729cd8dac67014b91e6a8d0c36460bbd6e671 100644 (file)
@@ -701,7 +701,7 @@ SymEntry* AddLabelSym (const char* Name, unsigned Flags)
         for (i = 0; i < CollCount (Entry->V.L.DefsOrRefs); i++) {
             DOR = CollAt (Entry->V.L.DefsOrRefs, i);
 
-            if ((DOR->Flags & SC_DEF) && (Flags & SC_REF)) {
+            if ((DOR->Flags & SC_DEF) && (Flags & SC_REF) && (Flags & SC_GOTO)) {
                 /* We're processing a goto and here is its destination label.
                    This means the difference between SP values is already known,
                    so we simply emit the SP adjustment code. */
@@ -721,7 +721,7 @@ SymEntry* AddLabelSym (const char* Name, unsigned Flags)
             }
 
 
-            if ((DOR->Flags & SC_REF) && (Flags & SC_DEF)) {
+            if ((DOR->Flags & SC_REF) && (DOR->Flags & SC_GOTO) && (Flags & SC_DEF)) {
                 /* We're processing a label, let's update all gotos encountered
                    so far */
                 g_defdatalabel (DOR->LateSP_Label);
@@ -762,7 +762,7 @@ SymEntry* AddLabelSym (const char* Name, unsigned Flags)
     }
 
     /* We are processing a goto, but the label has not yet been defined */
-    if (!SymIsDef (Entry) && (Flags & SC_REF)) {
+    if (!SymIsDef (Entry) && (Flags & SC_REF) && (Flags & SC_GOTO)) {
         g_lateadjustSP (NewDOR->LateSP_Label);
     }