]> git.sur5r.net Git - cc65/commitdiff
Working on the new backend
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 3 May 2001 20:16:41 +0000 (20:16 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 3 May 2001 20:16:41 +0000 (20:16 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@707 b7a2c559-68d2-44c3-8de9-860c34a00d81

13 files changed:
src/cc65/asmcode.c
src/cc65/codegen.c
src/cc65/codegen.h
src/cc65/codelab.h
src/cc65/codeseg.c
src/cc65/codeseg.h
src/cc65/expr.c
src/cc65/function.c
src/cc65/goto.c
src/cc65/litpool.c
src/cc65/locals.c
src/cc65/opcodes.c
src/cc65/stmt.c

index 40f3c0053f9ac2d1d8f8f729602003e75ff49526..e6fd47d2198b5289fd71f42c53cfefb6cc01a967 100644 (file)
@@ -33,6 +33,9 @@
 
 
 
+/* common */
+#include "check.h"
+
 /* b6502 */
 #include "codeseg.h"
 #include "dataseg.h"
@@ -94,22 +97,23 @@ void WriteOutput (FILE* F)
     SymTable* SymTab;
     SymEntry* Entry;
 
-    /* Output the global code and data segments */
-    MergeCodeLabels (CS);
+    /* Output the data segment (the global code segment should be empty) */
     OutputDataSeg (F, DS);
-    OutputCodeSeg (F, CS);
+    CHECK (GetCodeSegEntries (CS) == 0);
 
     /* Output all global or referenced functions */
     SymTab = GetGlobalSymTab ();
     Entry  = SymTab->SymHead;
     while (Entry) {
-               if (IsTypeFunc (Entry->Type)            &&
-           (Entry->Flags & SC_DEF) != 0        &&
+               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;
index 8839430b687c272d52f17baa5a1d2b0d8add1247..20478bb6feafca91a295dccb109195905479bc3a 100644 (file)
@@ -107,7 +107,7 @@ static char* GetLabelName (unsigned flags, unsigned long label, unsigned offs)
 
        case CF_STATIC:
                    /* Static memory cell */
-           sprintf (lbuf, "L%04X+%u", (unsigned)(label & 0xFFFF), offs);
+           sprintf (lbuf, "%s+%u", LocalLabelName (label), offs);
            break;
 
        case CF_EXTERNAL:
@@ -218,14 +218,6 @@ void g_popseg (void)
 
 
 
-void g_usecode (void)
-/* Switch to the code segment */
-{
-    UseSeg (SEG_CODE);
-}
-
-
-
 void g_userodata (void)
 /* Switch to the read only data segment */
 {
@@ -379,20 +371,24 @@ static unsigned MakeByteOffs (unsigned Flags, unsigned Offs)
 
 
 
-void g_defloclabel (unsigned label)
-/* Define a local label */
+void g_defcodelabel (unsigned label)
+/* Define a local code label */
 {
-    if (CurSeg == SEG_CODE) {
-       AddLocCodeLabel (CS, LocalLabelName (label));
-    } else {
-       AddDataSegLine (DS, "%s:", LocalLabelName (label));
-    }
+    AddCodeLabel (CS, LocalLabelName (label));
+}
+
+
+
+void g_defdatalabel (unsigned label)
+/* Define a local data label */
+{
+    AddDataSegLine (DS, "%s:", LocalLabelName (label));
 }
 
 
 
 /*****************************************************************************/
-/*                    Functions handling global labels                      */
+/*                            Functions handling global labels                      */
 /*****************************************************************************/
 
 
@@ -400,14 +396,8 @@ void g_defloclabel (unsigned label)
 void g_defgloblabel (const char* Name)
 /* Define a global label with the given name */
 {
-    if (CurSeg == SEG_CODE) {
-       /* ##### */
-       char Buf[64];
-       xsprintf (Buf, sizeof (Buf), "_%s", Name);
-               AddExtCodeLabel (CS, Buf);
-    } else {
-               AddDataSegLine (DS, "_%s:", Name);
-    }
+    /* Global labels are always data labels */
+    AddDataSegLine (DS, "_%s:", Name);
 }
 
 
@@ -597,12 +587,12 @@ void g_save_regvars (int RegOffs, unsigned Bytes)
        g_space (Bytes);
        ldyconst (Bytes - 1);
        ldxconst (Bytes);
-       g_defloclabel (Label);
+       g_defcodelabel (Label);
        AddCodeSegLine (CS, "lda regbank%+d,x", RegOffs-1);
        AddCodeSegLine (CS, "sta (sp),y");
        AddCodeSegLine (CS, "dey");
        AddCodeSegLine (CS, "dex");
-       AddCodeSegLine (CS, "bne L%04X", Label);
+       AddCodeSegLine (CS, "bne %s", LocalLabelName (Label));
 
     }
 
@@ -641,12 +631,12 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
        unsigned Label = GetLocalLabel ();
        ldyconst (StackOffs+Bytes-1);
        ldxconst (Bytes);
-       g_defloclabel (Label);
+       g_defcodelabel (Label);
        AddCodeSegLine (CS, "lda (sp),y");
        AddCodeSegLine (CS, "sta regbank%+d,x", RegOffs-1);
        AddCodeSegLine (CS, "dey");
        AddCodeSegLine (CS, "dex");
-       AddCodeSegLine (CS, "bne L%04X", Label);
+       AddCodeSegLine (CS, "bne %s", LocalLabelName (Label));
 
     }
 }
@@ -1706,11 +1696,11 @@ void g_addeqstatic (unsigned flags, unsigned long label, unsigned offs,
                case CF_INT:
                    if (flags & CF_CONST) {
                if (val == 1) {
-                   label = GetLocalLabel ();
+                   unsigned L = GetLocalLabel ();
                    AddCodeSegLine (CS, "inc %s", lbuf);
-                   AddCodeSegLine (CS, "bne L%04X", (int)label);
+                   AddCodeSegLine (CS, "bne %s", LocalLabelName (L));
                    AddCodeSegLine (CS, "inc %s+1", lbuf);
-                   g_defloclabel (label);
+                   g_defcodelabel (L);
                    AddCodeSegLine (CS, "lda %s", lbuf);                /* Hmmm... */
                    AddCodeSegLine (CS, "ldx %s+1", lbuf);
                } else {
@@ -1719,10 +1709,10 @@ void g_addeqstatic (unsigned flags, unsigned long label, unsigned offs,
                    AddCodeSegLine (CS, "adc %s", lbuf);
                    AddCodeSegLine (CS, "sta %s", lbuf);
                    if (val < 0x100) {
-                       label = GetLocalLabel ();
-                       AddCodeSegLine (CS, "bcc L%04X", (int)label);
+                       unsigned L = GetLocalLabel ();
+                       AddCodeSegLine (CS, "bcc %s", LocalLabelName (L));
                        AddCodeSegLine (CS, "inc %s+1", lbuf);
-                               g_defloclabel (label);
+                               g_defcodelabel (L);
                        AddCodeSegLine (CS, "ldx %s+1", lbuf);
                    } else {
                                AddCodeSegLine (CS, "lda #$%02X", (unsigned char)(val >> 8));
@@ -1967,10 +1957,10 @@ void g_subeqstatic (unsigned flags, unsigned long label, unsigned offs,
                AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)val);
                AddCodeSegLine (CS, "sta %s", lbuf);
                if (val < 0x100) {
-                   label = GetLocalLabel ();
-                   AddCodeSegLine (CS, "bcs L%04X", (unsigned)label);
+                   unsigned L = GetLocalLabel ();
+                   AddCodeSegLine (CS, "bcs %s", LocalLabelName (L));
                    AddCodeSegLine (CS, "dec %s+1", lbuf);
-                   g_defloclabel (label);
+                   g_defcodelabel (L);
                    AddCodeSegLine (CS, "ldx %s+1", lbuf);
                } else {
                    AddCodeSegLine (CS, "lda %s+1", lbuf);
@@ -2243,7 +2233,7 @@ void g_save (unsigned flags)
 
 
 void g_restore (unsigned flags)
-/* Copy hold register to P. */
+/* Copy hold register to primary. */
 {
     /* Check the size and determine operation */
     switch (flags & CF_TYPE) {
@@ -2360,7 +2350,7 @@ static void oper (unsigned flags, unsigned long val, char** subs)
 
 
 void g_test (unsigned flags)
-/* Force a test to set cond codes right */
+/* Test the value in the primary and set the condition codes */
 {
     switch (flags & CF_TYPE) {
 
@@ -2519,7 +2509,7 @@ void g_callind (unsigned Flags, unsigned ArgSize)
 void g_jump (unsigned Label)
 /* Jump to specified internal label number */
 {
-    AddCodeSegLine (CS, "jmp L%04X", Label);
+    AddCodeSegLine (CS, "jmp %s", LocalLabelName (Label));
 }
 
 
@@ -2553,14 +2543,14 @@ void g_case (unsigned flags, unsigned label, unsigned long val)
 
        case CF_CHAR:
        case CF_INT:
-           AddCodeSegLine (CS, ".word $%04X, L%04X",
+           AddCodeSegLine (CS, ".word $%04X, %s",
                         (unsigned)(val & 0xFFFF),
-                        (unsigned)(label & 0xFFFF));
+                        LocalLabelName (label));
                    break;
 
        case CF_LONG:
            AddCodeSegLine (CS, ".dword $%08lX", val);
-           AddCodeSegLine (CS, ".word L%04X", label & 0xFFFF);
+           AddCodeSegLine (CS, ".word %s", LocalLabelName (label));
            break;
 
        default:
@@ -2574,11 +2564,7 @@ void g_case (unsigned flags, unsigned label, unsigned long val)
 void g_truejump (unsigned flags, unsigned label)
 /* Jump to label if zero flag clear */
 {
-    if (flags & CF_SHORT) {
-       AddCodeSegLine (CS, "bne L%04X", label);
-    } else {
-        AddCodeSegLine (CS, "jne L%04X", label);
-    }
+    AddCodeSegLine (CS, "jne %s", LocalLabelName (label));
 }
 
 
@@ -2586,11 +2572,7 @@ void g_truejump (unsigned flags, unsigned label)
 void g_falsejump (unsigned flags, unsigned label)
 /* Jump to label if zero flag set */
 {
-    if (flags & CF_SHORT) {
-       AddCodeSegLine (CS, "beq L%04X", label);
-    } else {
-               AddCodeSegLine (CS, "jeq L%04X", label);
-    }
+    AddCodeSegLine (CS, "jeq %s", LocalLabelName (label));
 }
 
 
@@ -3970,10 +3952,10 @@ void g_strlen (unsigned flags, unsigned long val, unsigned offs)
 
        /* Generate the strlen code */
        AddCodeSegLine (CS, "ldy #$FF");
-       g_defloclabel (label);
+       g_defcodelabel (label);
        AddCodeSegLine (CS, "iny");
        AddCodeSegLine (CS, "lda %s,y", lbuf);
-       AddCodeSegLine (CS, "bne L%04X", label);
+       AddCodeSegLine (CS, "bne %s", LocalLabelName (label));
                AddCodeSegLine (CS, "tax");
        AddCodeSegLine (CS, "tya");
 
@@ -3988,10 +3970,10 @@ void g_strlen (unsigned flags, unsigned long val, unsigned offs)
            AddCodeSegLine (CS, "sta ptr1");
            AddCodeSegLine (CS, "stx ptr1+1");
            AddCodeSegLine (CS, "ldy #$FF");
-           g_defloclabel (label);
+           g_defcodelabel (label);
            AddCodeSegLine (CS, "iny");
            AddCodeSegLine (CS, "lda (ptr1),y");
-           AddCodeSegLine (CS, "bne L%04X", label);
+           AddCodeSegLine (CS, "bne %s", LocalLabelName (label));
                    AddCodeSegLine (CS, "tax");
            AddCodeSegLine (CS, "tya");
        }
index 041304d214dda518cb3b1f65de96fabe83391ba1..93a4aa4b8af3a85872805ba70dff54f2e3003c1b 100644 (file)
@@ -75,7 +75,6 @@ struct DataSeg;
 #define CF_TEST                0x0080  /* Test value */
 #define CF_FIXARGC             0x0100  /* Function has fixed arg count */
 #define CF_FORCECHAR   0x0200  /* Handle chars as chars, not ints */
-#define CF_SHORT       0x0400  /* Use short addressing */
 #define CF_REG         0x0800  /* Value is in primary register */
 
 /* Type of static address */
@@ -116,9 +115,6 @@ void g_pushseg (struct CodeSeg** CS, struct DataSeg** DS, const char* FuncName);
 void g_popseg (void);
 /* Restore the old segments */
 
-void g_usecode (void);
-/* Switch to the code segment */
-
 void g_userodata (void);
 /* Switch to the read only data segment */
 
@@ -148,8 +144,11 @@ void g_bssname (const char* Name);
 
 
 
-void g_defloclabel (unsigned label);
-/* Define a local label */
+void g_defcodelabel (unsigned label);
+/* Define a local code label */
+
+void g_defdatalabel (unsigned label);
+/* Define a local data label */
 
 
 
@@ -376,7 +375,10 @@ void g_addaddr_static (unsigned flags, unsigned long label, unsigned offs);
 
 
 void g_save (unsigned flags);
+/* Copy primary register to hold register. */
+
 void g_restore (unsigned flags);
+/* Copy hold register to primary. */
 
 void g_cmp (unsigned flags, unsigned long val);
 /* Immidiate compare. The primary register will not be changed, Z flag
@@ -384,8 +386,15 @@ void g_cmp (unsigned flags, unsigned long val);
  */
 
 void g_test (unsigned flags);
+/* Test the value in the primary and set the condition codes */
+
 void g_push (unsigned flags, unsigned long val);
+/* Push the primary register or a constant value onto the stack */
+
 void g_swap (unsigned flags);
+/* Swap the primary register and the top of the stack. flags give the type
+ * of *both* values (must have same size).
+ */
 
 void g_call (unsigned Flags, const char* Label, unsigned ArgSize);
 /* Call the specified subroutine name */
index e77873abee5d5e524e9055b17a3ceb2401a512ed..24681386a78e1289d3e44ab994691803e11c37fb 100644 (file)
@@ -53,7 +53,6 @@
 
 /* Label flags, bitmapped */
 #define LF_DEF         0x0001U         /* Label was defined */
-#define LF_EXT         0x0002U         /* Label is external */
 
 /* Label structure */
 typedef struct CodeLabel CodeLabel;
index 6eb5808002a65f75a49fbf3f42b5a6521d5f1fc4..acab2ced3d5affd5c091f7bc888a076a2f8f3965 100644 (file)
@@ -270,18 +270,25 @@ static CodeEntry* ParseInsn (CodeSeg* S, const char* L)
     }
 
     /* If the instruction is a branch, check for the label and generate it
-     * if it does not exist.
+     * if it does not exist. In case of a PC relative branch (*+x) we will
+     * not generate a label, because the target label will not be defined.
      */
     Label = 0;
-    if ((OPC->Info & CI_MASK_BRA) == CI_BRA) {
+    if ((OPC->Info & CI_MASK_BRA) == CI_BRA && Expr[0] != '*') {
 
        unsigned Hash;
 
-       /* ### Check for local labels here */
+       /* Addressing mode must be alsobute or something is really wrong */
        CHECK (AM == AM_ABS);
+
+       /* Addressing mode is a branch/jump */
        AM = AM_BRA;
+
+       /* Generate the hash over the label, then search for the label */
        Hash = HashStr (Expr) % CS_LABEL_HASH_SIZE;
        Label = FindCodeLabel (S, Expr, Hash);
+
+       /* If we don't have the label, it's a forward ref - create it */
        if (Label == 0) {
            /* Generate a new label */
            Label = NewCodeSegLabel (S, Expr, Hash);
@@ -461,7 +468,7 @@ void AddCodeSegLine (CodeSeg* S, const char* Format, ...)
 
 
 
-CodeLabel* AddCodeLabel (CodeSeg* S, const char* Name)
+void AddCodeLabel (CodeSeg* S, const char* Name)
 /* Add a code label for the next instruction to follow */
 {
     /* Calculate the hash from the name */
@@ -481,30 +488,6 @@ CodeLabel* AddCodeLabel (CodeSeg* S, const char* Name)
 
     /* We do now have a valid label. Remember it for later */
     CollAppend (&S->Labels, L);
-
-    /* Return the label */
-    return L;
-}
-
-
-
-void AddExtCodeLabel (CodeSeg* S, const char* Name)
-/* Add an external code label for the next instruction to follow */
-{
-    /* Add the code label */
-    CodeLabel* L = AddCodeLabel (S, Name);
-
-    /* Mark it as external label */
-    L->Flags |= LF_EXT;
-}
-
-
-
-void AddLocCodeLabel (CodeSeg* S, const char* Name)
-/* Add a local code label for the next instruction to follow */
-{
-    /* Add the code label */
-    AddCodeLabel (S, Name);
 }
 
 
@@ -630,11 +613,7 @@ void MergeCodeLabels (CodeSeg* S)
            continue;
        }
 
-       /* We have at least one label. Use the first one as reference label.
-        * We don't have a notification for global labels for now, and using
-        * the first one will also keep the global function labels, since these
-        * are inserted at position 0.
-        */
+       /* We have at least one label. Use the first one as reference label. */
        RefLab = CollAt (&E->Labels, 0);
 
        /* Walk through the remaining labels and change references to these
@@ -663,29 +642,21 @@ void MergeCodeLabels (CodeSeg* S)
 
            }
 
-           /* If the label is not an external label, we may remove the
-            * label completely.
-            */
-#if 0
-           if ((L->Flags & LF_EXT) == 0) {
-               FreeCodeLabel (L);
-               CollDelete (&E->Labels, J);
-           }
-#endif
+                   /* Remove the label completely. */
+           FreeCodeLabel (L);
+           CollDelete (&E->Labels, J);
        }
 
-       /* The reference label is the only remaining label. If it is not an
-        * external label, check if there are any references to this label,
-        * and delete it if this is not the case.
+       /* The reference label is the only remaining label. Check if there
+        * are any references to this label, and delete it if this is not
+        * the case.
         */
-#if 0
-       if ((RefLab->Flags & LF_EXT) == 0 && CollCount (&RefLab->JumpFrom) == 0) {
+               if (CollCount (&RefLab->JumpFrom) == 0) {
            /* Delete the label */
            FreeCodeLabel (RefLab);
            /* Remove it from the list */
            CollDelete (&E->Labels, 0);
        }
-#endif
     }
 }
 
index 671521b5e3829c4136ad209e5c709282b78e9a57..37b7820bcf1ed15e368f81c59b27dfaadd1e56fe 100644 (file)
@@ -95,11 +95,8 @@ CodeSeg* PopCodeSeg (void);
 void AddCodeSegLine (CodeSeg* S, const char* Format, ...) attribute ((format(printf,2,3)));
 /* Add a line to the given code segment */
 
-void AddExtCodeLabel (CodeSeg* S, const char* Name);
-/* Add an external code label for the next instruction to follow */
-
-void AddLocCodeLabel (CodeSeg* S, const char* Name);
-/* Add a local code label for the next instruction to follow */
+void AddCodeLabel (CodeSeg* S, const char* Name);
+/* Add a code label for the next instruction to follow */
 
 void AddCodeSegHint (CodeSeg* S, unsigned Hint);
 /* Add a hint for the preceeding instruction */
index f909fcbe9a87a0b1f095bf5a7b0024f1f20b0841..2e739d7833a258756b5334136cc8ebe479f027ff 100644 (file)
@@ -2450,7 +2450,7 @@ static int hieAnd (struct expent* lval, unsigned TrueLab, int* BoolOp)
                }
 
                /* Define the false jump label here */
-               g_defloclabel (lab);
+               g_defcodelabel (lab);
 
                /* Define the label */
                lval->e_flags = E_MEXPR;
@@ -2536,9 +2536,9 @@ static int hieOr (struct expent *lval)
        DoneLab = GetLocalLabel ();
        g_getimmed (CF_INT | CF_CONST, 0, 0);   /* Load FALSE */
                g_falsejump (CF_NONE, DoneLab);
-       g_defloclabel (TrueLab);
+       g_defcodelabel (TrueLab);
        g_getimmed (CF_INT | CF_CONST, 1, 0);   /* Load TRUE */
-       g_defloclabel (DoneLab);
+       g_defcodelabel (DoneLab);
     }
     return k;
 }
@@ -2577,7 +2577,7 @@ static int hieQuest (struct expent *lval)
        labt = GetLocalLabel ();
        ConsumeColon ();
        g_jump (labt);
-       g_defloclabel (labf);
+       g_defcodelabel (labf);
        expression1 (&lval3);
 
        /* Check if any conversions are needed, if so, do them.
@@ -2609,7 +2609,7 @@ static int hieQuest (struct expent *lval)
            g_jump (labf);              /* Jump around code */
 
            /* The jump for expr2 goes here */
-           g_defloclabel (labt);
+           g_defcodelabel (labt);
 
            /* Create the typecast code for expr2 */
            Mark2 = GetCodePos ();      /* Remember position */
@@ -2622,7 +2622,7 @@ static int hieQuest (struct expent *lval)
                RemoveCode (Mark1);     /* Remove code */
            } else {
                /* We have typecast code, output label */
-               g_defloclabel (labf);
+               g_defcodelabel (labf);
                labt = 0;               /* Mark other label as invalid */
            }
 
@@ -2646,7 +2646,7 @@ static int hieQuest (struct expent *lval)
 
        /* If we don't have the label defined until now, do it */
        if (labt) {
-           g_defloclabel (labt);
+           g_defcodelabel (labt);
        }
 
        /* Setup the target expression */
index 3ed80600f2d4fa729ecfbb3afa9767cf6d760d8e..39f9b5bb6e146ded863aa888eb88fec9d3c3c796 100644 (file)
@@ -190,9 +190,6 @@ void AllocLocalSpace (Function* F)
 {
     if (F->Reserved > 0) {
 
-       /* Switch to the code segment */
-       g_usecode ();
-
        /* Create space on the stack */
        g_space (F->Reserved);
 
@@ -317,7 +314,7 @@ void NewFunc (SymEntry* Func)
 #endif
 
     /* Output the function exit code label */
-    g_defloclabel (GetRetLab (CurrentFunc));
+    g_defcodelabel (GetRetLab (CurrentFunc));
 
     /* Restore the register variables */
     RestoreRegVars (!IsVoidFunc);
index 9d29ede34e16723607aa50e7a3719ea6df33c9f8..404d42e7372e04340b6e8e3686cc7d39eb464d65 100644 (file)
@@ -80,7 +80,7 @@ void DoLabel (void)
     SymEntry* Entry = AddLabelSym (CurTok.Ident, SC_DEF);
 
     /* Emit the jump label */
-    g_defloclabel (Entry->V.Label);
+    g_defcodelabel (Entry->V.Label);
 
     /* Eat the ident and colon */
     NextToken ();
index 2ba2d745658693bdb4b29fd6a4d80df6f1f2c18e..f57e9441330e4b4ca5d7891fb70ebd5ce2d57bc9 100644 (file)
@@ -103,16 +103,13 @@ void DumpLiteralPool (void)
     }
 
     /* Define the label */
-    g_defloclabel (LiteralPoolLabel);
+    g_defdatalabel (LiteralPoolLabel);
 
     /* Translate the buffer contents into the target charset */
     TranslateLiteralPool (0);
 
     /* Output the buffer data */
     g_defbytes (LiteralPoolBuf, LiteralPoolOffs);
-
-    /* Switch back to the code segment */
-    g_usecode ();
 }
 
 
index 02841b9dfd35cd297c497efb2fa5df346dd7943f..888972707060a5a78d856eb0f02a06f4f671a937 100644 (file)
@@ -185,9 +185,6 @@ static void ParseOneDecl (const DeclSpec* Spec)
                    /* Allocate previously reserved local space */
                    AllocLocalSpace (CurrentFunc);
 
-                   /* Switch to the code segment. */
-                   g_usecode ();
-
                    /* Skip the '=' */
                    NextToken ();
 
@@ -230,7 +227,7 @@ static void ParseOneDecl (const DeclSpec* Spec)
 
                /* Define the variable label */
                SymData = GetLocalLabel ();
-               g_defloclabel (SymData);
+               g_defdatalabel (SymData);
 
                /* Reserve space for the data */
                g_res (Size);
@@ -240,9 +237,6 @@ static void ParseOneDecl (const DeclSpec* Spec)
 
                    struct expent lval;
 
-                   /* Switch to the code segment. */
-                   g_usecode ();
-
                    /* Skip the '=' */
                    NextToken ();
 
@@ -280,7 +274,7 @@ static void ParseOneDecl (const DeclSpec* Spec)
 
                /* Define the variable label */
                SymData = GetLocalLabel ();
-               g_defloclabel (SymData);
+               g_defdatalabel (SymData);
 
                /* Skip the '=' */
                NextToken ();
@@ -298,7 +292,7 @@ static void ParseOneDecl (const DeclSpec* Spec)
 
                /* Define the variable label */
                SymData = GetLocalLabel ();
-               g_defloclabel (SymData);
+               g_defdatalabel (SymData);
 
                /* Reserve space for the data */
                g_res (Size);
@@ -371,9 +365,6 @@ void DeclareLocals (void)
     /* Be sure to allocate any reserved space for locals */
     AllocLocalSpace (CurrentFunc);
 
-    /* In case we switched away from code segment, switch back now */
-    g_usecode ();
-
     /* In case we've allocated local variables in this block, emit a call to
      * the stack checking routine if stack checks are enabled.
      */
index 33af86d48f6406fef936f52218ddffa6934f42e9..7660b52072824ab77a11ffa9dc539b4ec9ec0227 100644 (file)
@@ -91,7 +91,7 @@ static const OPCDesc OPCTable[OPC_COUNT] = {
     { "jmp", OPC_JMP, 3, CI_BRA                        },
     { "jne", OPC_JNE, 5, CI_BRA                        },
     { "jpl", OPC_JPL, 5, CI_BRA                        },
-    { "jsr", OPC_JSR, 3, CI_BRA                        },
+    { "jsr", OPC_JSR, 3, CI_NONE               },
     { "jvc", OPC_JVC, 5, CI_BRA                        },
     { "jvs", OPC_JVS, 5, CI_BRA                        },
     { "lda", OPC_LDA, 0, CI_CHG_A                      },
index 64ab2aa2beea06fd9c0d754954bb35f96b49adf2..cad1f866d373b6e96c3dd710d88eab4491c96ca8 100644 (file)
@@ -71,7 +71,7 @@ static int doif (void)
     /* Else clause present? */
     if (curtok != TOK_ELSE) {
 
-       g_defloclabel (flab1);
+       g_defcodelabel (flab1);
        /* Since there's no else clause, we're not sure, if the a break
         * statement is really executed.
         */
@@ -93,12 +93,12 @@ static int doif (void)
            /* Mark the label as unused */
            flab2 = 0;
        }
-       g_defloclabel (flab1);
+       g_defcodelabel (flab1);
        gotbreak &= Statement ();
 
        /* Generate the label for the else clause */
        if (flab2) {
-           g_defloclabel (flab2);
+           g_defcodelabel (flab2);
        }
 
        /* Done */
@@ -118,7 +118,7 @@ static void dowhile (char wtype)
     loop = GetLocalLabel ();
     lab = GetLocalLabel ();
     AddLoop (oursp, loop, lab, 0, 0);
-    g_defloclabel (loop);
+    g_defcodelabel (loop);
     if (wtype == 'w') {
 
        /* While loop */
@@ -139,7 +139,7 @@ static void dowhile (char wtype)
            /* There is code inside the while loop */
            Statement ();
            g_jump (loop);
-           g_defloclabel (lab);
+           g_defcodelabel (lab);
        }
 
     } else {
@@ -149,7 +149,7 @@ static void dowhile (char wtype)
        Consume (TOK_WHILE, "`while' expected");
        test (loop, 1);
        ConsumeSemi ();
-       g_defloclabel (lab);
+       g_defcodelabel (lab);
 
     }
     DelLoop ();
@@ -297,7 +297,7 @@ static void cascadeswitch (struct expent* eval)
 
            /* If we have a cascade label, emit it */
            if (NextLab) {
-               g_defloclabel (NextLab);
+               g_defcodelabel (NextLab);
                NextLab = 0;
            }
 
@@ -400,7 +400,7 @@ static void cascadeswitch (struct expent* eval)
 
        /* Emit a code label if we have one */
        if (CodeLab) {
-           g_defloclabel (CodeLab);
+           g_defcodelabel (CodeLab);
            CodeLab = 0;
        }
 
@@ -422,9 +422,9 @@ static void cascadeswitch (struct expent* eval)
      * one, too.
      */
     if (NextLab) {
-       g_defloclabel (NextLab);
+       g_defcodelabel (NextLab);
     }
-    g_defloclabel (ExitLab);
+    g_defcodelabel (ExitLab);
 
     /* End the loop */
     DelLoop ();
@@ -491,7 +491,7 @@ static void tableswitch (struct expent* eval)
                }
                ConsumeColon ();
            } while (curtok == TOK_CASE || curtok == TOK_DEFAULT);
-           g_defloclabel (label);
+           g_defcodelabel (label);
            HaveBreak = 0;
        }
        if (curtok != TOK_RCURLY) {
@@ -513,7 +513,7 @@ static void tableswitch (struct expent* eval)
     }
 
     /* Actual selector code goes here */
-    g_defloclabel (lcase);
+    g_defcodelabel (lcase);
 
     /* Create the call to the switch subroutine */
     Flags = TypeOf (eval->e_tptr);
@@ -534,7 +534,7 @@ static void tableswitch (struct expent* eval)
     if (dlabel) {
                g_jump (dlabel);
     }
-    g_defloclabel (lab);
+    g_defcodelabel (lab);
     DelLoop ();
 
     /* Free the allocated space for the labels */
@@ -591,7 +591,7 @@ static void dofor (void)
        expression (&lval1);
     }
     ConsumeSemi ();
-    g_defloclabel (loop);
+    g_defcodelabel (loop);
     if (curtok != TOK_SEMI) {  /* exp2 */
        boolexpr (&lval2);
        g_truejump (CF_NONE, lstat);
@@ -600,16 +600,16 @@ static void dofor (void)
        g_jump (lstat);
     }
     ConsumeSemi ();
-    g_defloclabel (linc);
+    g_defcodelabel (linc);
     if (curtok != TOK_RPAREN) {        /* exp3 */
        expression (&lval3);
     }
     ConsumeRParen ();
     g_jump (loop);
-    g_defloclabel (lstat);
+    g_defcodelabel (lstat);
     Statement ();
     g_jump (linc);
-    g_defloclabel (lab);
+    g_defcodelabel (lab);
     DelLoop ();
 }