X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fasmcode.c;h=83ea3b2520586d2c0e3558b567add9c6cf4cc446;hb=8dd3cc35dcbd7155812e6a7c01039573aff640cb;hp=e6fd47d2198b5289fd71f42c53cfefb6cc01a967;hpb=8a3bacd7f4fe699df9088cbd4c52f865b315d3d3;p=cc65 diff --git a/src/cc65/asmcode.c b/src/cc65/asmcode.c index e6fd47d21..83ea3b252 100644 --- a/src/cc65/asmcode.c +++ b/src/cc65/asmcode.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000-2001 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@cc65.org */ +/* (C) 2000-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -36,87 +36,103 @@ /* common */ #include "check.h" -/* b6502 */ +/* cc65 */ +#include "asmcode.h" +#include "codeopt.h" #include "codeseg.h" #include "dataseg.h" - -/* cc65 */ +#include "segments.h" +#include "stackptr.h" #include "symtab.h" -#include "asmcode.h" /*****************************************************************************/ -/* Code */ +/* Code */ /*****************************************************************************/ -void AddCodeHint (const char* Hint) -/* Add an optimizer hint */ +void GetCodePos (CodeMark* M) +/* Get a marker pointing to the current output position */ { - /* ### AddCodeLine ("+%s", Hint); */ + M->Pos = CS_GetEntryCount (CS->Code); + M->SP = StackPtr; } -CodeMark GetCodePos (void) -/* Get a marker pointing to the current output position */ +void RemoveCodeRange (const CodeMark* Start, const CodeMark* End) +/* Remove all code between two code markers */ { - return GetCodeSegEntries (CS); + /* Nothing to do if the range is empty */ + if (Start->Pos == End->Pos) { + return; + } + + /* Delete the range */ + CS_DelCodeRange (CS->Code, Start->Pos, End->Pos-1); } -void RemoveCode (CodeMark M) +void RemoveCode (const CodeMark* M) /* Remove all code after the given code marker */ { - DelCodeSegAfter (CS, M); + CS_DelCodeAfter (CS->Code, M->Pos); + StackPtr = M->SP; } -static void PrintFunctionHeader (FILE* F, SymEntry* Entry) +void MoveCode (const CodeMark* Start, const CodeMark* End, const CodeMark* Target) +/* Move the code between Start (inclusive) and End (exclusive) to + * (before) Target. The code marks aren't updated. + */ { - /* Print a comment with the function signature */ - fprintf (F, - "; ---------------------------------------------------------------\n" - "; "); - PrintFuncSig (F, Entry->Name, Entry->Type); - fprintf (F, - "\n" - "; ---------------------------------------------------------------\n" - "\n"); + CS_MoveEntries (CS->Code, Start->Pos, End->Pos - Start->Pos, Target->Pos); +} + + + +int CodeRangeIsEmpty (const CodeMark* Start, const CodeMark* End) +/* Return true if the given code range is empty (no code between Start and End) */ +{ + int Empty; + PRECONDITION (Start->Pos <= End->Pos); + Empty = (Start->Pos == End->Pos); + if (Empty) { + /* Safety */ + CHECK (Start->SP == End->SP); + } + return Empty; } -void WriteOutput (FILE* F) -/* Write the final output to a file */ +void WriteAsmOutput (void) +/* Write the final assembler output to the output file */ { SymTable* SymTab; SymEntry* Entry; - /* Output the data segment (the global code segment should be empty) */ - OutputDataSeg (F, DS); - CHECK (GetCodeSegEntries (CS) == 0); + /* Output the global data segment */ + CHECK (!HaveGlobalCode ()); + OutputSegments (CS); /* Output all global or referenced functions */ SymTab = GetGlobalSymTab (); Entry = SymTab->SymHead; while (Entry) { if (IsTypeFunc (Entry->Type) && - (Entry->Flags & SC_DEF) != 0 && - (Entry->Flags & (SC_REF | SC_EXTERN)) != 0) { - /* Function which is defined and referenced or extern */ - PrintFunctionHeader (F, Entry); - MergeCodeLabels (Entry->V.F.CS); - fprintf (F, "; Data segment for function %s:\n", Entry->Name); - OutputDataSeg (F, Entry->V.F.DS); - fprintf (F, "; Code segment for function %s:\n", Entry->Name); - OutputCodeSeg (F, Entry->V.F.CS); - } - Entry = Entry->NextSym; + SymIsDef (Entry) && + (Entry->Flags & (SC_REF | SC_EXTERN)) != 0) { + /* Function which is defined and referenced or extern */ + CS_MergeLabels (Entry->V.F.Seg->Code); + RunOpt (Entry->V.F.Seg->Code); + OutputSegments (Entry->V.F.Seg); + } + Entry = Entry->NextSym; } }