]> git.sur5r.net Git - cc65/commitdiff
Inline assembly can now reference C labels with the %g format specifier
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 15 Jun 2004 20:08:01 +0000 (20:08 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 15 Jun 2004 20:08:01 +0000 (20:08 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3128 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/cc65.sgml
src/cc65/asmstmt.c

index f40cf4c33eef7a829938992573fde41d4f2033ce..e5345b5b883b0cf2205a7c8de274e26108255ec5 100644 (file)
@@ -957,6 +957,7 @@ the format specifier before passing the assembly code line to the backend.
   <item><tt/%l/ - Numerical 32 bit value
   <item><tt/%v/ - Assembler name of a (global) variable or function
   <item><tt/%o/ - Stack offset of a (local) variable
+  <item><tt/%g/ - Assembler name of a C label
   <item><tt/%s/ - The argument is converted to a string
   <item><tt/%%/ - The % sign itself
 </itemize><p>
index 30176add99b9dd3925b020a612a593bdc7f8694d..53afc99b2dd70fec9c54a55a85d17219cd2b8510 100644 (file)
@@ -39,6 +39,7 @@
 #include "xsprintf.h"
 
 /* cc65 */
+#include "asmlabel.h"
 #include "codegen.h"
 #include "datatype.h"
 #include "error.h"
@@ -275,6 +276,31 @@ static void ParseLVarArg (StrBuf* T, unsigned Arg)
 
 
 
+static void ParseLabelArg (StrBuf* T, unsigned Arg attribute ((unused)))
+/* Parse the %g format specifier */
+{
+    /* We expect an identifier separated by a comma */
+    ConsumeComma ();
+    if (CurTok.Tok != TOK_IDENT) {
+
+        Error ("Label name expected");
+
+    } else {
+
+       /* Add a new label symbol if we don't have one until now */
+               SymEntry* Entry = AddLabelSym (CurTok.Ident, SC_REF);
+
+       /* Append the label name to the buffer */
+       SB_AppendStr (T, LocalLabelName (Entry->V.Label));
+
+        /* Eat the label name */
+        NextToken ();
+
+    }
+}
+
+
+
 static void ParseStrArg (StrBuf* T, unsigned Arg attribute ((unused)))
 /* Parse the %s format specifier */
 {
@@ -340,6 +366,7 @@ static void ParseAsm (void)
      *   %l    - Numerical 32 bit value
      *   %v    - Assembler name of a (global) variable
      *   %o    - Stack offset of a (local) variable
+     *   %g    - Assembler name of a C label
      *   %s     - Any argument converted to a string (almost)
      *   %%    - The % sign
      */
@@ -359,13 +386,14 @@ static void ParseAsm (void)
                    ++Arg;
             C = SB_Get (&S);
             switch (C) {
-                case '%':   SB_AppendChar (&T, '%');        break;
-                case 'b':   ParseByteArg (&T, Arg);         break;
-                case 'l':   ParseLongArg (&T, Arg);         break;
-                case 'o':   ParseLVarArg (&T, Arg);         break;
-                case 's':   ParseStrArg (&T, Arg);          break;
-                case 'v':   ParseGVarArg (&T, Arg);         break;
-                case 'w':   ParseWordArg (&T, Arg);         break;
+                case '%':   SB_AppendChar (&T, '%');    break;
+                case 'b':   ParseByteArg (&T, Arg);     break;
+               case 'g':   ParseLabelArg (&T, Arg);    break;
+                case 'l':   ParseLongArg (&T, Arg);     break;
+                case 'o':   ParseLVarArg (&T, Arg);     break;
+                case 's':   ParseStrArg (&T, Arg);      break;
+                case 'v':   ParseGVarArg (&T, Arg);     break;
+                case 'w':   ParseWordArg (&T, Arg);     break;
                 default:
                     Error ("Error in __asm__ format specifier %u", Arg);
                     AsmErrorSkip ();