X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fasmstmt.c;h=b54771aa9332080baa0b851b1329ca8e379dc771;hb=9b7c16ec4cbb5282642c377272224e3fc825f860;hp=774d5ffa46979b8c501d220b0d196fad8f39bfab;hpb=104ae3a54f88f79442cad292b8f57d32bdb0d87c;p=cc65 diff --git a/src/cc65/asmstmt.c b/src/cc65/asmstmt.c index 774d5ffa4..b54771aa9 100644 --- a/src/cc65/asmstmt.c +++ b/src/cc65/asmstmt.c @@ -6,8 +6,8 @@ /* */ /* */ /* */ -/* (C) 2001-2004 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ +/* (C) 2001-2008 Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@musoftware.de */ /* */ @@ -39,6 +39,7 @@ #include "xsprintf.h" /* cc65 */ +#include "asmlabel.h" #include "codegen.h" #include "datatype.h" #include "error.h" @@ -137,19 +138,19 @@ static void ParseByteArg (StrBuf* T, unsigned Arg) /* Check the range but allow negative values if the type is signed */ if (IsSignUnsigned (Expr.Type)) { - if (Expr.Val < 0 || Expr.Val > 0xFF) { + if (Expr.IVal < 0 || Expr.IVal > 0xFF) { AsmRangeError (Arg); - Expr.Val = 0; + Expr.IVal = 0; } } else { - if (Expr.Val < -128 || Expr.Val > 127) { + if (Expr.IVal < -128 || Expr.IVal > 127) { AsmRangeError (Arg); - Expr.Val = 0; + Expr.IVal = 0; } } /* Convert into a hex number */ - xsprintf (Buf, sizeof (Buf), "$%02lX", Expr.Val & 0xFF); + xsprintf (Buf, sizeof (Buf), "$%02lX", Expr.IVal & 0xFF); /* Add the number to the target buffer */ SB_AppendStr (T, Buf); @@ -171,19 +172,19 @@ static void ParseWordArg (StrBuf* T, unsigned Arg) /* Check the range but allow negative values if the type is signed */ if (IsSignUnsigned (Expr.Type)) { - if (Expr.Val < 0 || Expr.Val > 0xFFFF) { + if (Expr.IVal < 0 || Expr.IVal > 0xFFFF) { AsmRangeError (Arg); - Expr.Val = 0; + Expr.IVal = 0; } } else { - if (Expr.Val < -32768 || Expr.Val > 32767) { + if (Expr.IVal < -32768 || Expr.IVal > 32767) { AsmRangeError (Arg); - Expr.Val = 0; + Expr.IVal = 0; } } /* Convert into a hex number */ - xsprintf (Buf, sizeof (Buf), "$%04lX", Expr.Val & 0xFFFF); + xsprintf (Buf, sizeof (Buf), "$%04lX", Expr.IVal & 0xFFFF); /* Add the number to the target buffer */ SB_AppendStr (T, Buf); @@ -204,7 +205,7 @@ static void ParseLongArg (StrBuf* T, unsigned Arg attribute ((unused))) ConstAbsIntExpr (hie1, &Expr); /* Convert into a hex number */ - xsprintf (Buf, sizeof (Buf), "$%08lX", Expr.Val & 0xFFFFFFFF); + xsprintf (Buf, sizeof (Buf), "$%08lX", Expr.IVal & 0xFFFFFFFF); /* Add the number to the target buffer */ SB_AppendStr (T, Buf); @@ -223,8 +224,8 @@ static void ParseGVarArg (StrBuf* T, unsigned Arg) } /* Check for external linkage */ - if (Sym->Flags & (SC_EXTERN | SC_STORAGE)) { - /* External linkage */ + if (Sym->Flags & (SC_EXTERN | SC_STORAGE | SC_FUNC)) { + /* External linkage or a function */ /* ### FIXME: Asm name should be generated by codegen */ SB_AppendChar (T, '_'); SB_AppendStr (T, Sym->Name); @@ -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 */ { @@ -302,7 +328,7 @@ static void ParseStrArg (StrBuf* T, unsigned Arg attribute ((unused))) default: ConstAbsIntExpr (hie1, &Expr); - xsprintf (Buf, sizeof (Buf), "%ld", Expr.Val); + xsprintf (Buf, sizeof (Buf), "%ld", Expr.IVal); SB_AppendStr (T, Buf); break; } @@ -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 (); @@ -387,8 +415,8 @@ static void ParseAsm (void) Done: /* Call the string buf destructors */ - DoneStrBuf (&S); - DoneStrBuf (&T); + SB_Done (&S); + SB_Done (&T); }