/*****************************************************************************/
/* */
-/* asmcode.c */
+/* asmcode.c */
/* */
-/* Assembler output code handling for the cc65 C compiler */
+/* Assembler output code handling for the cc65 C compiler */
/* */
/* */
/* */
-/* (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 */
-/* b6502 */
-#include "codeseg.h"
-#include "dataseg.h"
+/* common */
+#include "check.h"
/* cc65 */
-#include "symtab.h"
#include "asmcode.h"
+#include "codeseg.h"
+#include "dataseg.h"
+#include "segments.h"
+#include "stackptr.h"
+#include "symtab.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);
}
-void WriteOutput (FILE* F)
-/* Write the final output to a file */
+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 WriteAsmOutput (void)
+/* Write the final assembler output to the output file */
{
SymTable* SymTab;
SymEntry* Entry;
- /* Output the global code and data segments */
- MergeCodeLabels (CS);
- OutputDataSeg (F, DS);
- OutputCodeSeg (F, CS);
+ /* 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);
- OutputDataSeg (F, Entry->V.F.DS);
- OutputCodeSeg (F, Entry->V.F.CS);
- }
- Entry = Entry->NextSym;
+ if (SymIsOutputFunc (Entry)) {
+ /* Function which is defined and referenced or extern */
+ OutputSegments (Entry->V.F.Seg);
+ }
+ Entry = Entry->NextSym;
}
}
-
-
-