From ebaf17d843a1176b259dc99b3777f87ecac39b9d Mon Sep 17 00:00:00 2001 From: borutr Date: Tue, 3 Jul 2007 19:51:04 +0000 Subject: [PATCH] * src/mcs51/gen.c, src/avr/gen.c, src/pic/gen.c, src/z80/gen.c, src/pic16/gen.c, src/hc08/gen.c, src/ds390/gen.c: fixed RFE #1746528: SDCC should ignore ':' in inline assembler comments git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4874 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 6 ++ src/avr/gen.c | 75 ++++++++++++-------- src/ds390/gen.c | 31 +++++--- src/hc08/gen.c | 61 +++++++++------- src/mcs51/gen.c | 31 +++++--- src/pic/gen.c | 61 +++++++++------- src/pic16/gen.c | 185 +++++++++++++++++++++++++----------------------- src/z80/gen.c | 32 ++++++--- 8 files changed, 281 insertions(+), 201 deletions(-) diff --git a/ChangeLog b/ChangeLog index e7410a89..56333864 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-07-03 Borut Razem + + * src/mcs51/gen.c, src/avr/gen.c, src/pic/gen.c, src/z80/gen.c, + src/pic16/gen.c, src/hc08/gen.c, src/ds390/gen.c: fixed RFE + #1746528: SDCC should ignore ':' in inline assembler comments + 2007-07-02 Maarten Brock * device/include/mcs51/C8051F360.h: fixed bug #1746410, thanks Chris Jones diff --git a/src/avr/gen.c b/src/avr/gen.c index 7c175015..7079f1ce 100644 --- a/src/avr/gen.c +++ b/src/avr/gen.c @@ -2948,36 +2948,51 @@ genXor (iCode * ic, iCode * ifx) static void genInline (iCode * ic) { - char *buffer, *bp, *bp1; - - _G.inLine += (!options.asmpeep); - - buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1); - strcpy (buffer, IC_INLINE (ic)); - - /* emit each line as a code */ - while (*bp) { - if (*bp == '\n') { - *bp++ = '\0'; - emitcode (bp1, ""); - bp1 = bp; - } - else { - if (*bp == ':') { - bp++; - *bp = '\0'; - bp++; - emitcode (bp1, ""); - bp1 = bp; - } - else - bp++; - } - } - if (bp1 != bp) - emitcode (bp1, ""); - /* emitcode("",buffer); */ - _G.inLine -= (!options.asmpeep); + char *buffer, *bp, *bp1; + bool inComment = FALSE; + + _G.inLine += (!options.asmpeep); + + buffer = bp = bp1 = Safe_strdup (IC_INLINE (ic)); + + /* emit each line as a code */ + while (*bp) + { + switch (*bp) + { + case ';': + inComment = TRUE; + ++bp; + break; + + case '\n': + inComment = FALSE; + *bp++ = '\0'; + emitcode (bp1, ""); + bp1 = bp; + break; + + default: + /* Add \n for labels, not dirs such as c:\mydir */ + if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1]))) + { + ++bp; + *bp = '\0'; + ++bp; + emitcode (bp1, ""); + bp1 = bp; + } + else + ++bp; + break; + } + } + if (bp1 != bp) + emitcode (bp1, ""); + + Safe_free (buffer); + + _G.inLine -= (!options.asmpeep); } /*-----------------------------------------------------------------*/ diff --git a/src/ds390/gen.c b/src/ds390/gen.c index aa9a8983..24385894 100644 --- a/src/ds390/gen.c +++ b/src/ds390/gen.c @@ -8299,40 +8299,51 @@ static void genInline (iCode * ic) { char *buffer, *bp, *bp1; + bool inComment = FALSE; D (emitcode (";", "genInline")); _G.inLine += (!options.asmpeep); - buffer = bp = bp1 = Safe_strdup(IC_INLINE(ic)); + buffer = bp = bp1 = Safe_strdup (IC_INLINE(ic)); /* emit each line as a code */ while (*bp) { - if (*bp == '\n') + switch (*bp) { + case ';': + inComment = TRUE; + ++bp; + break; + + case '\n': + inComment = FALSE; *bp++ = '\0'; emitcode (bp1, ""); bp1 = bp; - } - else - { + break; + + default: /* Add \n for labels, not dirs such as c:\mydir */ - if ( (*bp == ':') && (isspace((unsigned char)bp[1])) ) + if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1]))) { - bp++; + ++bp; *bp = '\0'; - bp++; + ++bp; emitcode (bp1, ""); bp1 = bp; } else - bp++; + ++bp; + break; } } if (bp1 != bp) emitcode (bp1, ""); - /* emitcode("",buffer); */ + + Safe_free (buffer); + _G.inLine -= (!options.asmpeep); } diff --git a/src/hc08/gen.c b/src/hc08/gen.c index 388d2ab9..d4cfc644 100644 --- a/src/hc08/gen.c +++ b/src/hc08/gen.c @@ -5454,44 +5454,51 @@ static void genInline (iCode * ic) { char *buffer, *bp, *bp1; + bool inComment = FALSE; D(emitcode ("; genInline","")); _G.inLine += (!options.asmpeep); - buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1); - strcpy (buffer, IC_INLINE (ic)); + buffer = bp = bp1 = Safe_strdup (IC_INLINE(ic)); /* emit each line as a code */ while (*bp) { - if (*bp == '\n') - { - *bp++ = '\0'; - /* emitcode (bp1, ""); */ - emitinline (ic, bp1); - bp1 = bp; - } - else - { - if (*bp == ':') - { - bp++; - *bp = '\0'; - bp++; - emitcode (bp1, ""); - bp1 = bp; - } - else - bp++; - } + switch (*bp) + { + case ';': + inComment = TRUE; + ++bp; + break; + + case '\n': + inComment = FALSE; + *bp++ = '\0'; + emitinline (ic, bp1); + bp1 = bp; + break; + + default: + /* Add \n for labels, not dirs such as c:\mydir */ + if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1]))) + { + ++bp; + *bp = '\0'; + ++bp; + emitcode (bp1, ""); + bp1 = bp; + } + else + ++bp; + break; + } } if (bp1 != bp) - { - /* emitcode (bp1, ""); */ - emitinline (ic, bp1); - } - /* emitcode("",buffer); */ + emitinline (ic, bp1); + + Safe_free (buffer); + _G.inLine -= (!options.asmpeep); } diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index 957d58dc..dbff5f9a 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -7681,40 +7681,51 @@ static void genInline (iCode * ic) { char *buffer, *bp, *bp1; + bool inComment = FALSE; D (emitcode (";", "genInline")); _G.inLine += (!options.asmpeep); - buffer = bp = bp1 = Safe_strdup(IC_INLINE(ic)); + buffer = bp = bp1 = Safe_strdup (IC_INLINE (ic)); /* emit each line as a code */ while (*bp) { - if (*bp == '\n') + switch (*bp) { + case ';': + inComment = TRUE; + ++bp; + break; + + case '\n': + inComment = FALSE; *bp++ = '\0'; emitcode (bp1, ""); bp1 = bp; - } - else - { + break; + + default: /* Add \n for labels, not dirs such as c:\mydir */ - if ( (*bp == ':') && (isspace((unsigned char)bp[1])) ) + if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1]))) { - bp++; + ++bp; *bp = '\0'; - bp++; + ++bp; emitcode (bp1, ""); bp1 = bp; } else - bp++; + ++bp; + break; } } if (bp1 != bp) emitcode (bp1, ""); - /* emitcode("",buffer); */ + + Safe_free (buffer); + _G.inLine -= (!options.asmpeep); } diff --git a/src/pic/gen.c b/src/pic/gen.c index fb514994..aaa1b58c 100644 --- a/src/pic/gen.c +++ b/src/pic/gen.c @@ -6213,42 +6213,53 @@ release : static void genInline (iCode *ic) { char *buffer, *bp, *bp1; + bool inComment = FALSE; FENTRY; DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); _G.inLine += (!options.asmpeep); - buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1); - strcpy(buffer,IC_INLINE(ic)); + buffer = bp = bp1 = Safe_strdup (IC_INLINE (ic)); - /* emit each line as a code */ - while (*bp) { - if (*bp == '\n') { - *bp++ = '\0'; - - if(*bp1) - addpCode2pBlock(pb, newpCodeAsmDir(bp1, NULL)); // inline directly, no process - bp1 = bp; - } else { - if (*bp == ':') { - bp++; - *bp = '\0'; - bp++; - - /* print label, use this special format with NULL directive - * to denote that the argument should not be indented with tab */ - addpCode2pBlock(pb, newpCodeAsmDir(NULL, bp1)); // inline directly, no process - - bp1 = bp; - } else - bp++; + while (*bp) + { + switch (*bp) + { + case ';': + inComment = TRUE; + ++bp; + break; + + case '\n': + inComment = FALSE; + *bp++ = '\0'; + if (*bp1) + addpCode2pBlock(pb, newpCodeAsmDir(bp1, NULL)); // inline directly, no process + bp1 = bp; + break; + + default: + /* Add \n for labels, not dirs such as c:\mydir */ + if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1]))) + { + ++bp; + *bp = '\0'; + ++bp; + /* print label, use this special format with NULL directive + * to denote that the argument should not be indented with tab */ + addpCode2pBlock(pb, newpCodeAsmDir(NULL, bp1)); // inline directly, no process + bp1 = bp; + } + else + ++bp; + break; + } } - } if ((bp1 != bp) && *bp1) addpCode2pBlock(pb, newpCodeAsmDir(bp1, NULL)); // inline directly, no process - Safe_free(buffer); + Safe_free (buffer); _G.inLine -= (!options.asmpeep); } diff --git a/src/pic16/gen.c b/src/pic16/gen.c index 7f9dbe23..3648a37c 100644 --- a/src/pic16/gen.c +++ b/src/pic16/gen.c @@ -8481,112 +8481,119 @@ static void genXor (iCode *ic, iCode *ifx) static void genInline (iCode *ic) { char *buffer, *bp, *bp1; + bool inComment = FALSE; - DEBUGpic16_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic16_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - _G.inLine += (!options.asmpeep); + _G.inLine += (!options.asmpeep); - buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1); - strcpy(buffer,IC_INLINE(ic)); - - while((bp1=strstr(bp, "\\n"))) { - *bp1++ = '\n'; - *bp1++ = ' '; - bp = bp1; - } - bp = bp1 = buffer; + buffer = bp = bp1 = Safe_strdup (IC_INLINE (ic)); + + while((bp1=strstr(bp, "\\n"))) { + *bp1++ = '\n'; + *bp1++ = ' '; + bp = bp1; + } + bp = bp1 = buffer; #if 0 /* This is an experimental code for #pragma inline and is temporarily disabled for 2.5.0 release */ - if(asmInlineMap) - { - symbol *sym; - char *s; - char *cbuf; - int cblen; - - cbuf = Safe_strdup(buffer); - cblen = strlen(buffer)+1; - memset(cbuf, 0, cblen); - - bp = buffer; - bp1 = cbuf; - while(*bp) { - if(*bp != '%')*bp1++ = *bp++; - else { - int i; - - bp++; - i = *bp - '0'; - if(i>elementsInSet(asmInlineMap))break; - - bp++; - s = indexSet(asmInlineMap, i); - DEBUGpc("searching symbol s = `%s'", s); - sym = findSym(SymbolTab, NULL, s); - - if(sym->reqv) { - strcat(bp1, sym->reqv->operand.symOperand->regs[0]->name); - } else { - strcat(bp1, sym->rname); - } - - while(*bp1)bp1++; - } - - if(strlen(bp1) > cblen - 16) { - int i = strlen(cbuf); - cblen += 50; - cbuf = realloc(cbuf, cblen); - memset(cbuf+i, 0, 50); - bp1 = cbuf + i; - } - } + if(asmInlineMap) + { + symbol *sym; + char *s; + char *cbuf; + int cblen; + + cbuf = Safe_strdup(buffer); + cblen = strlen(buffer)+1; + memset(cbuf, 0, cblen); + + bp = buffer; + bp1 = cbuf; + while(*bp) { + if(*bp != '%')*bp1++ = *bp++; + else { + int i; + + bp++; + i = *bp - '0'; + if(i>elementsInSet(asmInlineMap))break; - free(buffer); - buffer = Safe_strdup( cbuf ); - free(cbuf); + bp++; + s = indexSet(asmInlineMap, i); + DEBUGpc("searching symbol s = `%s'", s); + sym = findSym(SymbolTab, NULL, s); + + if(sym->reqv) { + strcat(bp1, sym->reqv->operand.symOperand->regs[0]->name); + } else { + strcat(bp1, sym->rname); + } - bp = bp1 = buffer; + while(*bp1)bp1++; } + + if(strlen(bp1) > cblen - 16) { + int i = strlen(cbuf); + cblen += 50; + cbuf = realloc(cbuf, cblen); + memset(cbuf+i, 0, 50); + bp1 = cbuf + i; + } + } + + free(buffer); + buffer = Safe_strdup( cbuf ); + free(cbuf); + + bp = bp1 = buffer; + } #endif /* 0 */ - /* emit each line as a code */ - while (*bp) { - if (*bp == '\n') { - *bp++ = '\0'; + /* emit each line as a code */ + while (*bp) + { + switch (*bp) + { + case ';': + inComment = TRUE; + ++bp; + break; - if(*bp1) - pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(bp1, NULL)); // inline directly, no process - bp1 = bp; - } else { - if (*bp == ':') { - bp++; - *bp = '\0'; - bp++; - - /* print label, use this special format with NULL directive - * to denote that the argument should not be indented with tab */ - pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(NULL, bp1)); // inline directly, no process - bp1 = bp; - } if (*bp == ';') { - /* advance to end of line (prevent splitting of comments at ':' */ - while (*bp && *bp != '\n') { - bp++; - } // while - } else - bp++; - } - } + case '\n': + inComment = FALSE; + *bp++ = '\0'; + if (*bp1) + pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(bp1, NULL)); // inline directly, no process + bp1 = bp; + break; - if ((bp1 != bp) && *bp1) - pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(bp1, NULL)); // inline directly, no process + default: + /* Add \n for labels, not dirs such as c:\mydir */ + if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1]))) + { + ++bp; + *bp = '\0'; + ++bp; + /* print label, use this special format with NULL directive + * to denote that the argument should not be indented with tab */ + pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(NULL, bp1)); // inline directly, no process + bp1 = bp; + } + else + ++bp; + break; + } + } + if ((bp1 != bp) && *bp1) + pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(bp1, NULL)); // inline directly, no process - Safe_free(buffer); + Safe_free (buffer); - _G.inLine -= (!options.asmpeep); + _G.inLine -= (!options.asmpeep); } /*-----------------------------------------------------------------*/ diff --git a/src/z80/gen.c b/src/z80/gen.c index 0874fbe5..483c894e 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -5635,37 +5635,49 @@ static void genInline (iCode * ic) { char *buffer, *bp, *bp1; + bool inComment = FALSE; _G.lines.isInline += (!options.asmpeep); - buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1); - strcpy (buffer, IC_INLINE (ic)); + buffer = bp = bp1 = Safe_strdup (IC_INLINE (ic)); /* emit each line as a code */ while (*bp) { - if (*bp == '\n') + switch (*bp) { + case ';': + inComment = TRUE; + ++bp; + break; + + case '\n': + inComment = FALSE; *bp++ = '\0'; emit2 (bp1); bp1 = bp; - } - else - { - if (*bp == ':') + break; + + default: + /* Add \n for labels, not dirs such as c:\mydir */ + if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1]))) { - bp++; + ++bp; *bp = '\0'; - bp++; + ++bp; emit2 (bp1); bp1 = bp; } else - bp++; + ++bp; + break; } } if (bp1 != bp) emit2 (bp1); + + Safe_free (buffer); + _G.lines.isInline -= (!options.asmpeep); } -- 2.30.2