]> git.sur5r.net Git - cc65/blobdiff - src/ca65/main.c
More lineinfo usage.
[cc65] / src / ca65 / main.c
index eae7c384f1278601cc3cb42d09c1d7661928c7b0..ceadced2ed13dd3e6d47bf55391920771ba9d6c3 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/* (C) 1998-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -598,7 +598,7 @@ static void OneLine (void)
                InitListingLine ();
     }
 
-    if (Tok == TOK_COLON) {
+    if (CurTok.Tok == TOK_COLON) {
                /* An unnamed label */
                ULabDef ();
                NextTok ();
@@ -607,16 +607,16 @@ static void OneLine (void)
     /* If the first token on the line is an identifier, check for a macro or
      * an instruction.
      */
-    if (Tok == TOK_IDENT) {
+    if (CurTok.Tok == TOK_IDENT) {
         if (!UbiquitousIdents) {
             /* Macros and symbols cannot use instruction names */
-            Instr = FindInstruction (&SVal);
+            Instr = FindInstruction (&CurTok.SVal);
             if (Instr < 0) {
-                Macro = IsMacro (&SVal);
+                Macro = IsMacro (&CurTok.SVal);
             }
         } else {
             /* Macros and symbols may use the names of instructions */
-            Macro = IsMacro (&SVal);
+            Macro = IsMacro (&CurTok.SVal);
         }
     }
 
@@ -624,12 +624,12 @@ static void OneLine (void)
      * scoped identifier which may start with a namespace token (for global
      * namespace)
      */
-    if (Tok == TOK_LOCAL_IDENT ||
-        Tok == TOK_NAMESPACE   ||
-        (Tok == TOK_IDENT && Instr < 0 && !Macro)) {
+    if (CurTok.Tok == TOK_LOCAL_IDENT ||
+        CurTok.Tok == TOK_NAMESPACE   ||
+        (CurTok.Tok == TOK_IDENT && Instr < 0 && !Macro)) {
 
         /* Did we have whitespace before the ident? */
-        int HadWS = WS;
+        int HadWS = CurTok.WS;
 
         /* Generate the symbol table entry, then skip the name */
         Sym = ParseAnySymName (SYM_ALLOC_NEW);
@@ -637,10 +637,10 @@ static void OneLine (void)
         /* If a colon follows, this is a label definition. If there
          * is no colon, it's an assignment.
          */
-        if (Tok == TOK_EQ || Tok == TOK_ASSIGN) {
+        if (CurTok.Tok == TOK_EQ || CurTok.Tok == TOK_ASSIGN) {
 
             /* Determine the symbol flags from the assignment token */
-            unsigned Flags = (Tok == TOK_ASSIGN)? SF_LABEL : SF_NONE;
+            unsigned Flags = (CurTok.Tok == TOK_ASSIGN)? SF_LABEL : SF_NONE;
 
             /* Skip the '=' */
             NextTok ();
@@ -652,7 +652,7 @@ static void OneLine (void)
             ConsumeSep ();
             return;
 
-        } else if (Tok == TOK_SET) {
+        } else if (CurTok.Tok == TOK_SET) {
 
             ExprNode* Expr;
 
@@ -686,11 +686,11 @@ static void OneLine (void)
              * without a colon if there is no whitespace before the
              * identifier.
              */
-            if (Tok != TOK_COLON) {
+            if (CurTok.Tok != TOK_COLON) {
                 if (HadWS || !NoColonLabels) {
                     Error ("`:' expected");
                     /* Try some smart error recovery */
-                    if (Tok == TOK_NAMESPACE) {
+                    if (CurTok.Tok == TOK_NAMESPACE) {
                         NextTok ();
                     }
                 }
@@ -702,35 +702,35 @@ static void OneLine (void)
             /* If we come here, a new identifier may be waiting, which may
              * be a macro or instruction.
              */
-            if (Tok == TOK_IDENT) {
+            if (CurTok.Tok == TOK_IDENT) {
                 if (!UbiquitousIdents) {
                     /* Macros and symbols cannot use instruction names */
-                    Instr = FindInstruction (&SVal);
+                    Instr = FindInstruction (&CurTok.SVal);
                     if (Instr < 0) {
-                        Macro = IsMacro (&SVal);
+                        Macro = IsMacro (&CurTok.SVal);
                     }
                 } else {
                     /* Macros and symbols may use the names of instructions */
-                    Macro = IsMacro (&SVal);
+                    Macro = IsMacro (&CurTok.SVal);
                 }
             }
         }
     }
 
     /* We've handled a possible label, now handle the remainder of the line */
-    if (Tok >= TOK_FIRSTPSEUDO && Tok <= TOK_LASTPSEUDO) {
+    if (CurTok.Tok >= TOK_FIRSTPSEUDO && CurTok.Tok <= TOK_LASTPSEUDO) {
         /* A control command */
         HandlePseudo ();
     } else if (Macro) {
         /* A macro expansion */
         MacExpandStart ();
     } else if (Instr >= 0 ||
-               (UbiquitousIdents && ((Instr = FindInstruction (&SVal)) >= 0))) {
+               (UbiquitousIdents && ((Instr = FindInstruction (&CurTok.SVal)) >= 0))) {
         /* A mnemonic - assemble one instruction */
         HandleInstruction (Instr);
-    } else if (PCAssignment && (Tok == TOK_STAR || Tok == TOK_PC)) {
+    } else if (PCAssignment && (CurTok.Tok == TOK_STAR || CurTok.Tok == TOK_PC)) {
         NextTok ();
-        if (Tok != TOK_EQ) {
+        if (CurTok.Tok != TOK_EQ) {
             Error ("`=' expected");
             SkipUntilSep ();
         } else {
@@ -770,7 +770,7 @@ static void Assemble (void)
     NextTok ();
 
     /* Assemble lines until end of file */
-    while (Tok != TOK_EOF) {
+    while (CurTok.Tok != TOK_EOF) {
        OneLine ();
     }
 }
@@ -798,11 +798,14 @@ static void CreateObjFile (void)
     /* Write the export list */
     WriteExports ();
 
+    /* Write the scopes if requested */
+    WriteScopes ();
+
     /* Write debug symbols if requested */
     WriteDbgSyms ();
 
     /* Write line infos if requested */
-    WriteLineInfo ();
+    WriteLineInfos ();
 
     /* Write the string pool */
     WriteStrPool ();
@@ -859,6 +862,11 @@ int main (int argc, char* argv [])
      */
     SymEnterLevel (&GlobalNameSpace, ST_GLOBAL, ADDR_SIZE_DEFAULT);
 
+    /* Initialize the line infos. Must be done here, since we need line infos 
+     * for symbol definitions.
+     */
+    InitLineInfo ();
+
     /* Check the parameters */
     I = 1;
     while (I < ArgCount) {
@@ -899,7 +907,7 @@ int main (int argc, char* argv [])
                     break;
 
                        case 'o':
-                           OutFile = GetArg (&I, 2);
+                           OutFile = GetArg (&I, 2);
                            break;
 
                        case 's':
@@ -923,7 +931,7 @@ int main (int argc, char* argv [])
                    break;
 
                        case 'U':
-                   OptAutoImport (Arg, 0);
+                   OptAutoImport (Arg, 0);
                            break;
 
                        case 'V':