]> git.sur5r.net Git - cc65/blobdiff - src/cc65/codelab.c
Add checks for risky goto statements.
[cc65] / src / cc65 / codelab.c
index 97ed7e3b8d8addcf6e0dca2aa5dcb577cac8ceeb..f36520835bef31d126ec1d0e96f9469981c7225e 100644 (file)
@@ -1,15 +1,15 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                                codelab.c                                 */
+/*                                 codelab.c                                 */
 /*                                                                           */
-/*                          Code label structure                            */
+/*                           Code label structure                            */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2001     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 2001-2009, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 /* cc65 */
 #include "codeent.h"
 #include "codelab.h"
+#include "output.h"
 
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
@@ -59,7 +60,6 @@ CodeLabel* NewCodeLabel (const char* Name, unsigned Hash)
     L->Next  = 0;
     L->Name  = xstrdup (Name);
     L->Hash  = Hash;
-    L->Flags = 0;
     L->Owner = 0;
     InitCollection (&L->JumpFrom);
 
@@ -84,45 +84,36 @@ void FreeCodeLabel (CodeLabel* L)
 
 
 
-void AddLabelRef (CodeLabel* L, struct CodeEntry* E)
+void CL_AddRef (CodeLabel* L, struct CodeEntry* E)
 /* Let the CodeEntry E reference the label L */
 {
     /* The insn at E jumps to this label */
     E->JumpTo = L;
 
+    /* Replace the code entry argument with the name of the new label */
+    CE_SetArg (E, L->Name);
+
     /* Remember that in the label */
     CollAppend (&L->JumpFrom, E);
 }
 
 
 
-unsigned RemoveLabelRef (CodeLabel* L, const struct CodeEntry* E)
-/* Remove a reference to this label, return the number of remaining references */
-{
-    /* Delete the item */
-    CollDeleteItem (&L->JumpFrom, E);
-
-    /* Return the number of remaining references */
-    return CollCount (&L->JumpFrom);
-}
-
-
-
-void MoveLabelRefs (CodeLabel* OldLabel, CodeLabel* NewLabel)
+void CL_MoveRefs (CodeLabel* OldLabel, CodeLabel* NewLabel)
 /* Move all references to OldLabel to point to NewLabel. OldLabel will have no
- * more references on return.
- */
+** more references on return.
+*/
 {
     /* Walk through all instructions referencing the old label */
-    unsigned Count = CollCount (&OldLabel->JumpFrom);
+    unsigned Count = CL_GetRefCount (OldLabel);
     while (Count--) {
 
-       /* Get the instruction that references the old label */
-       CodeEntry* E = CollAt (&OldLabel->JumpFrom, Count);
+        /* Get the instruction that references the old label */
+        CodeEntry* E = CL_GetRef (OldLabel, Count);
 
-       /* Change the reference to the new label */
-       CHECK (E->JumpTo == OldLabel);
-       AddLabelRef (NewLabel, E);
+        /* Change the reference to the new label */
+        CHECK (E->JumpTo == OldLabel);
+        CL_AddRef (NewLabel, E);
 
     }
 
@@ -132,11 +123,12 @@ void MoveLabelRefs (CodeLabel* OldLabel, CodeLabel* NewLabel)
 
 
 
-void OutputCodeLabel (const CodeLabel* L, FILE* F)
-/* Output the code label to a file */
+void CL_Output (const CodeLabel* L)
+/* Output the code label to the output file */
 {
-    fprintf (F, "%s:", L->Name);
+    WriteOutput ("%s:", L->Name);
+    if (strlen (L->Name) > 6) {
+        /* Label is too long, add a linefeed */
+        WriteOutput ("\n");
+    }
 }
-
-
-