]> git.sur5r.net Git - cc65/blobdiff - src/cc65/asmcode.c
When using GetQualifier, pass correct params :-)
[cc65] / src / cc65 / asmcode.c
index 079111b8716ec7ec2b9adcd200baf218b72fe9b2..83ea3b2520586d2c0e3558b567add9c6cf4cc446 100644 (file)
@@ -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       */
 
 
 
-/* b6502 */
-#include "codeseg.h"
-#include "dataseg.h"
+/* common */
+#include "check.h"
 
 /* cc65 */
 #include "asmcode.h"
+#include "codeopt.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;
+}
+
+
+
+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.
+ */
+{
+    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 */
 {
-    OutputDataSeg (F, DS);
-    MergeCodeLabels (CS);
-    OutputCodeSeg (F, CS);
+    SymTable* SymTab;
+    SymEntry* Entry;
+
+    /* 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)            &&
+                   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;
+    }
 }