/* */
/* */
/* */
-/* (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 */
/* common */
+#include "check.h"
#include "xmalloc.h"
-/* cc65 */
+/* cc65 */
#include "codeent.h"
#include "codelab.h"
+#include "output.h"
L->Next = 0;
L->Name = xstrdup (Name);
L->Hash = Hash;
- L->Flags = 0;
L->Owner = 0;
InitCollection (&L->JumpFrom);
-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 */
+void CL_MoveRefs (CodeLabel* OldLabel, CodeLabel* NewLabel)
+/* Move all references to OldLabel to point to NewLabel. OldLabel will have no
+ * more references on return.
+ */
{
- /* Delete the item */
- CollDeleteItem (&L->JumpFrom, E);
+ /* Walk through all instructions referencing the old label */
+ unsigned Count = CL_GetRefCount (OldLabel);
+ while (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);
+ CL_AddRef (NewLabel, E);
- /* Return the number of remaining references */
- return CollCount (&L->JumpFrom);
+ }
+
+ /* There are no more references to the old label */
+ CollDeleteAll (&OldLabel->JumpFrom);
}
-void OutputCodeLabel (FILE* F, const CodeLabel* L)
-/* 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");
+ }
}
+