]> git.sur5r.net Git - cc65/commitdiff
Working
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 21 May 2001 06:43:46 +0000 (06:43 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 21 May 2001 06:43:46 +0000 (06:43 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@737 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/asmcode.c
src/cc65/asmcode.h
src/cc65/codegen.c
src/cc65/codegen.h
src/cc65/codeinfo.c
src/cc65/expr.c
src/cc65/main.c
src/cc65/pragma.c
src/cc65/stmt.c

index b139af1c8510c39a8bdbf7e4515d5ce79f32a8a6..dda8ed81b04464c2275b5d9a99b05fa437e884b6 100644 (file)
 
 
 
-void AddCodeHint (const char* Hint)
-/* Add an optimizer hint */
-{
-    /* ### AddCodeLine ("+%s", Hint); */
-}
-
-
-
 CodeMark GetCodePos (void)
 /* Get a marker pointing to the current output position */
 {
index a7845191d6ed1d4d2f8b598986d74f5d9c26d084..47ea6558628449c69fa2ccbede015f296c2b6d9a 100644 (file)
@@ -62,9 +62,6 @@ typedef unsigned CodeMark;
 
 
 
-void AddCodeHint (const char* Hint);
-/* Add an optimizer hint */
-
 CodeMark GetCodePos (void);
 /* Get a marker pointing to the current output position */
 
index 1cafa0c2858ec35810f279cb8bffb412122d8e3e..49afa5b609328bf04b4b3712364409fdfe8d2447 100644 (file)
@@ -203,8 +203,41 @@ void g_usebss (void)
 
 
 
+static void OutputDataLine (DataSeg* S, const char* Format, ...)
+/* Add a line to the current data segment */
+{
+    va_list ap;
+    va_start (ap, Format);
+    AddDataEntry (S, Format, ap);
+    va_end (ap);
+}
+
+
+
+void g_segname (segment_t Seg, const char* Name)
+/* Set the name of a segment */
+{
+    DataSeg* S;
+
+    /* Remember the new name */
+    NewSegName (Seg, Name);
+
+    /* Emit a segment directive for the data style segments */
+    switch (Seg) {
+       case SEG_RODATA: S = CS->ROData; break;
+       case SEG_DATA:   S = CS->Data;   break;
+       case SEG_BSS:    S = CS->BSS;    break;
+       default:         S = 0;          break;
+    }
+    if (S) {
+               OutputDataLine (S, ".segment\t\"%s\"", Name);
+    }
+}
+
+
+
 /*****************************************************************************/
-/*                                  Code                                    */
+/*                                          Code                                    */
 /*****************************************************************************/
 
 
@@ -3207,8 +3240,6 @@ void g_inc (unsigned flags, unsigned long val)
                    AddCodeLine ("clc");
                    if ((val & 0xFF) != 0) {
                        AddCodeLine ("adc #$%02X", (unsigned char) val);
-                       /* Tell the optimizer that the X register may be invalid */
-                       AddCodeHint ("x:!");
                    }
                    AddCodeLine ("pha");
                    AddCodeLine ("txa");
@@ -3294,8 +3325,6 @@ void g_dec (unsigned flags, unsigned long val)
                    AddCodeLine ("sec");
                    if ((val & 0xFF) != 0) {
                        AddCodeLine ("sbc #$%02X", (unsigned char) val);
-                       /* Tell the optimizer that the X register may be invalid */
-                       AddCodeHint ("x:!");
                    }
                    AddCodeLine ("pha");
                    AddCodeLine ("txa");
index 7a37c98d3f32b821ea96c40645ff4861f8197acc..a8253458066991ebd916710726512dc4e319fb1d 100644 (file)
@@ -112,10 +112,13 @@ void g_usedata (void);
 void g_usebss (void);
 /* Switch to the bss segment */
 
+void g_segname (segment_t Seg, const char* Name);
+/* Set the name of a segment */
+
 
 
 /*****************************************************************************/
-/*                     Functions handling local labels                      */
+/*                     Functions handling local labels                      */
 /*****************************************************************************/
 
 
index 0bbeffad1dbbc41be2c898d324d94fa66e0637f1..c99ee491c23de403af3ac7d6689cdb28e50b0b6d 100644 (file)
@@ -148,9 +148,10 @@ void GetFuncInfo (const char* Name, unsigned char* Use, unsigned char* Chg)
        if (E && E->Owner->PrevTab == 0 && IsTypeFunc (E->Type)) {
 
            /* A function may use the A or A/X registers if it is a fastcall
-            * function. Otherwise it does not use any registers passed by
-            * the caller. However, we assume that any function will destroy
-            * all registers.
+            * function. If it is not a fastcall function but a variadic one,
+            * it will use the Y register (the parameter size is passed here).
+            * In all other cases, no registers are used. However, we assume 
+            * that any function will destroy all registers.
             */
            FuncDesc* D = E->V.F.Func;
            if ((D->Flags & FD_FASTCALL) != 0 && D->ParamCount > 0) {
@@ -161,7 +162,9 @@ void GetFuncInfo (const char* Name, unsigned char* Use, unsigned char* Chg)
                } else {
                    *Use = REG_AX;
                }
-           } else {
+           } else if ((D->Flags & FD_VARIADIC) != 0) {
+               *Use = REG_Y;
+           } else {                          
                /* Will not use any registers */
                *Use = REG_NONE;
            }
index 5e3f1f93c288262cb119944f0dd50360863da21a..b5441dfd68173a9a6b15e62f02239a0594d5c235 100644 (file)
@@ -502,7 +502,6 @@ void exprhs (unsigned flags, int k, struct expent *lval)
     }
     if (lval->e_test & E_FORCETEST) {  /* we testing this value? */
        /* debug... */
-       AddCodeHint ("forcetest");
        flags |= TypeOf (lval->e_tptr);
                g_test (flags);                 /* yes, force a test */
                lval->e_test &= ~E_FORCETEST;
@@ -569,9 +568,6 @@ static unsigned FunctionParamList (FuncDesc* Func)
        unsigned CFlags;
        unsigned Flags;
 
-       /* Add a hint for the optimizer */
-       AddCodeHint ("param:start");
-
        /* Count arguments */
        ++ParamCount;
 
@@ -659,9 +655,6 @@ static unsigned FunctionParamList (FuncDesc* Func)
            ParamSize += ArgSize;
        }
 
-       /* Add an optimizer hint */
-       AddCodeHint ("param:end");
-
        /* Check for end of argument list */
        if (curtok != TOK_COMMA) {
            break;
index 874e9b4b17d81478fda0c8a0d26efb0491885eed..28ed29066e49d03d8518d471bb9e68529e0a115d 100644 (file)
@@ -646,9 +646,6 @@ int main (int argc, char* argv[])
        OutputFile = MakeFilename (InputFile, ".s");
     }
 
-
-
-
     /* Go! */
     Compile ();
 
index 4f51995d66b74be37ab1354154e1e6fa77757b18..ba3815d965980be603936767a470520c2504db33 100644 (file)
@@ -37,6 +37,7 @@
 #include <string.h>
 
 /* cc65 */
+#include "codegen.h"
 #include "error.h"
 #include "expr.h"
 #include "global.h"
@@ -49,7 +50,7 @@
 
 
 /*****************************************************************************/
-/*                                  data                                    */
+/*                                  data                                    */
 /*****************************************************************************/
 
 
@@ -150,7 +151,7 @@ static void SegNamePragma (segment_t Seg)
        if (ValidSegName (Name)) {
 
                    /* Set the new name */
-           NewSegName (Seg, Name);
+           g_segname (Seg, Name);
 
        } else {
 
@@ -196,19 +197,21 @@ void DoPragma (void)
        return;
     }
 
-    /* Do we know this pragma? */
+    /* Search for the name, then skip the identifier */
     Pragma = FindPragma (CurTok.Ident);
+    NextToken ();
+
+    /* Do we know this pragma? */
     if (Pragma == PR_ILLEGAL) {
-       /* According to the ANSI standard, we're not allowed to generate errors
-        * for unknown pragmas, however, we're allowed to warn - and we will
-        * do so. Otherwise one typo may give you hours of bug hunting...
-        */
-       Warning ("Unknown #pragma `%s'", CurTok.Ident);
-       return;
+               /* According to the ANSI standard, we're not allowed to generate errors
+                * for unknown pragmas, however, we're allowed to warn - and we will
+                * do so. Otherwise one typo may give you hours of bug hunting...
+                */
+               Warning ("Unknown #pragma `%s'", CurTok.Ident);
+               return;
     }
 
-    /* Skip the identifier and check for an open paren */
-    NextToken ();
+    /* Check for an open paren */
     ConsumeLParen ();
 
     /* Switch for the different pragmas */
index cad1f866d373b6e96c3dd710d88eab4491c96ca8..2e1c05b981a137be6ac63ab0af5c45e1e1ee9a0c 100644 (file)
@@ -523,7 +523,6 @@ static void tableswitch (struct expent* eval)
     g_defdata (CF_INT | CF_CONST, -((int)lcount)-1, 0);
 
     /* Create the case selector table */
-    AddCodeHint ("casetable");
     p = swtab;
     while (lcount) {
                g_case (Flags, p->sw_lab, p->sw_const); /* Create one label */
@@ -734,9 +733,7 @@ int Statement (void)
                break;
 
            default:
-               AddCodeHint ("stmt:start");
                expression (&lval);
-               AddCodeHint ("stmt:end");
                ConsumeSemi ();
        }
     }