From 9cb70150559b44cd471d274c2725a3f8c40449ee Mon Sep 17 00:00:00 2001 From: cuz Date: Tue, 15 Jun 2004 20:08:01 +0000 Subject: [PATCH] Inline assembly can now reference C labels with the %g format specifier git-svn-id: svn://svn.cc65.org/cc65/trunk@3128 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- doc/cc65.sgml | 1 + src/cc65/asmstmt.c | 42 +++++++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/doc/cc65.sgml b/doc/cc65.sgml index f40cf4c33..e5345b5b8 100644 --- a/doc/cc65.sgml +++ b/doc/cc65.sgml @@ -957,6 +957,7 @@ the format specifier before passing the assembly code line to the backend.

diff --git a/src/cc65/asmstmt.c b/src/cc65/asmstmt.c index 30176add9..53afc99b2 100644 --- a/src/cc65/asmstmt.c +++ b/src/cc65/asmstmt.c @@ -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 (); -- 2.39.5