X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fcodelab.c;h=9e3b93765f64ebf69b57dd13a45433e4d7b1ec6d;hb=8dd3cc35dcbd7155812e6a7c01039573aff640cb;hp=46c43559a565fff8531d8910d211cfd77c9cba28;hpb=88792854a61000c177dc86fe414bd8bb96d76a5b;p=cc65 diff --git a/src/cc65/codelab.c b/src/cc65/codelab.c index 46c43559a..9e3b93765 100644 --- a/src/cc65/codelab.c +++ b/src/cc65/codelab.c @@ -1,15 +1,15 @@ /*****************************************************************************/ /* */ -/* label.c */ +/* codelab.c */ /* */ /* 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 */ @@ -34,10 +34,13 @@ /* common */ +#include "check.h" #include "xmalloc.h" /* cc65 */ -#include "label.h" +#include "codeent.h" +#include "codelab.h" +#include "output.h" @@ -57,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); @@ -82,11 +84,55 @@ void FreeCodeLabel (CodeLabel* L) -void OutputCodeLabel (FILE* F, const CodeLabel* L) -/* Output the code label to a file */ +void CL_AddRef (CodeLabel* L, struct CodeEntry* E) +/* Let the CodeEntry E reference the label L */ { - fprintf (F, "%s:\n", L->Name); + /* 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); } +void CL_MoveRefs (CodeLabel* OldLabel, CodeLabel* NewLabel) +/* Move all references to OldLabel to point to NewLabel. OldLabel will have no + * more references on return. + */ +{ + /* 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); + + } + + /* There are no more references to the old label */ + CollDeleteAll (&OldLabel->JumpFrom); +} + + + +void CL_Output (const CodeLabel* L) +/* Output the code label to the output file */ +{ + WriteOutput ("%s:", L->Name); + if (strlen (L->Name) > 6) { + /* Label is too long, add a linefeed */ + WriteOutput ("\n"); + } +} + + + +