X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fasm.c;h=bc61329fb38070db8dfba885a864441c6384dbe8;hb=ba3245b2350c424ced782193797186e3167d6f30;hp=d31b0ea154e871dc96b071ae33243d187be0c732;hpb=bb24e1163a01518ea8814201919eb02838baae4b;p=fw%2Fsdcc diff --git a/src/asm.c b/src/asm.c index d31b0ea1..bc61329f 100644 --- a/src/asm.c +++ b/src/asm.c @@ -6,12 +6,15 @@ Note that the functions below only handle digit format modifiers. eg %02X is ok, but %lu and %.4u will fail. */ +#include + #include "common.h" #include "asm.h" +#include "dbuf_string.h" /* A 'token' is like !blah or %24f and is under the programmers control. */ -#define MAX_TOKEN_LEN 64 +#define MAX_TOKEN_LEN 64 static hTab *_h; @@ -27,33 +30,17 @@ FileBaseName (char *fileFullName) while (*fileFullName) { if ((*fileFullName == '/') || (*fileFullName == '\\') || (*fileFullName == ':')) - { - p = fileFullName; - p++; - } + { + p = fileFullName; + p++; + } fileFullName++; } return p; } -static const char * -_findMapping (const char *szKey) -{ - return shash_find (_h, szKey); -} - -// Append a string onto another, and update the pointer to the end of -// the new string. -static char * -_appendAt (char *at, char *onto, const char *sz) -{ - wassert (at && onto && sz); - strcpy (at, sz); - return at + strlen (sz); -} - -void -tvsprintf (char *buffer, const char *format, va_list ap) +void +dbuf_tvprintf (struct dbuf_s *dbuf, const char *format, va_list ap) { // Under Linux PPC va_list is a structure instead of a primitive type, // and doesnt like being passed around. This version turns everything @@ -67,128 +54,156 @@ tvsprintf (char *buffer, const char *format, va_list ap) // This is acheived by expanding the tokens and zero arg formats into // one big format string, which is passed to the native printf. static int count; - char noTokens[INITIAL_INLINEASM]; - char newFormat[INITIAL_INLINEASM]; - char *pInto = noTokens; + struct dbuf_s tmpDBuf; + const char *noTokens; char *p; char token[MAX_TOKEN_LEN]; const char *sz = format; - // NULL terminate it to let strlen work. - *pInto = '\0'; + dbuf_init(&tmpDBuf, INITIAL_INLINEASM); /* First pass: expand all of the macros */ while (*sz) { if (*sz == '!') - { - /* Start of a token. Search until the first - [non alpha, *] and call it a token. */ - const char *t; - p = token; - sz++; - while (isalpha (*sz) || *sz == '*') - { - *p++ = *sz++; - } - *p = '\0'; - /* Now find the token in the token list */ - if ((t = _findMapping (token))) - { - pInto = _appendAt (pInto, noTokens, t); - } - else - { - fprintf (stderr, "Cant find token \"%s\"\n", token); - wassert (0); - } - } + { + /* Start of a token. Search until the first + [non alpha, *] and call it a token. */ + const char *t; + p = token; + sz++; + while (isalpha ((unsigned char)*sz) || *sz == '*') + { + *p++ = *sz++; + } + *p = '\0'; + /* Now find the token in the token list */ + if ((t = shash_find (_h, token))) + { + dbuf_append_str(&tmpDBuf, t); + } + else + { + fprintf (stderr, "Cant find token \"%s\"\n", token); + wassert (0); + } + } else { - *pInto++ = *sz++; + dbuf_append_char(&tmpDBuf, *sz++); } } - *pInto = '\0'; - /* Second pass: Expand any macros that we own */ + noTokens = dbuf_c_str(&tmpDBuf); sz = noTokens; - pInto = newFormat; + + /* recycle tmpDBuf */ + dbuf_init(&tmpDBuf, INITIAL_INLINEASM); while (*sz) { if (*sz == '%') - { - // See if its one that we handle. - sz++; - switch (*sz) - { - case 'C': - // Code segment name. - pInto = _appendAt (pInto, newFormat, CODE_NAME); + { + // See if its one that we handle. + sz++; + switch (*sz) + { + case 'C': + // Code segment name. + dbuf_append_str(&tmpDBuf, CODE_NAME); sz++; - break; - case 'F': - // Source file name. - pInto = _appendAt (pInto, newFormat, fullSrcFileName); + break; + + case 'F': + // Source file name. + dbuf_append_str(&tmpDBuf, fullSrcFileName); sz++; - break; + break; + case 'N': // Current function name. - pInto = _appendAt (pInto, newFormat, currFunc->rname); + dbuf_append_str(&tmpDBuf, currFunc->rname); + sz++; + break; + + case 'I': + // Unique ID. + dbuf_printf(&tmpDBuf, "%u", ++count); sz++; break; - case 'I': - { - // Unique ID. - char id[20]; - sprintf (id, "%u", ++count); - pInto = _appendAt (pInto, newFormat, id); - sz++; - break; - } - default: - // Not one of ours. Copy until the end. - *pInto++ = '%'; - while (!isalpha (*sz)) - { - *pInto++ = *sz++; - } - *pInto++ = *sz++; - } - } + + default: + // Not one of ours. Copy until the end. + dbuf_append_char(&tmpDBuf, '%'); + while (!isalpha ((unsigned char)*sz)) + dbuf_append_char(&tmpDBuf, *sz++); + + dbuf_append_char(&tmpDBuf, *sz++); + } + } else - { - *pInto++ = *sz++; - } + { + dbuf_append_char(&tmpDBuf, *sz++); + } } - *pInto = '\0'; + dbuf_free(noTokens); + + sz = dbuf_c_str(&tmpDBuf); + + dbuf_vprintf(dbuf, sz, ap); - // Now do the actual printing - vsprintf (buffer, newFormat, ap); + dbuf_destroy(&tmpDBuf); } -void -tfprintf (FILE * fp, const char *szFormat,...) +void +dbuf_tprintf (struct dbuf_s *dbuf, const char *szFormat,...) { va_list ap; - char buffer[INITIAL_INLINEASM]; + va_start (ap, szFormat); + dbuf_tvprintf (dbuf, szFormat, ap); + va_end(ap); +} + +void +tsprintf (char *buffer, size_t len, const char *szFormat,...) +{ + va_list ap; + struct dbuf_s dbuf; + size_t copyLen; + + dbuf_init(&dbuf, INITIAL_INLINEASM); va_start (ap, szFormat); - tvsprintf (buffer, szFormat, ap); - fputs (buffer, fp); + dbuf_tvprintf (&dbuf, szFormat, ap); + va_end(ap); + + copyLen = min(len - 1, dbuf_get_length(&dbuf)); + memcpy(buffer, dbuf_get_buf(&dbuf), copyLen); + buffer[copyLen] = '\0'; + dbuf_destroy(&dbuf); } -void -tsprintf (char *buffer, const char *szFormat,...) +void +tfprintf (FILE *fp, const char *szFormat,...) { va_list ap; + struct dbuf_s dbuf; + size_t len; + + dbuf_init(&dbuf, INITIAL_INLINEASM); + va_start (ap, szFormat); - tvsprintf (buffer, szFormat, ap); + dbuf_tvprintf (&dbuf, szFormat, ap); + va_end(ap); + + len = dbuf_get_length(&dbuf); + fwrite(dbuf_get_buf(&dbuf), 1, len, fp); + dbuf_destroy(&dbuf); } -void +void asm_addTree (const ASM_MAPPINGS * pMappings) { const ASM_MAPPING *pMap; @@ -204,15 +219,47 @@ asm_addTree (const ASM_MAPPINGS * pMappings) } /*-----------------------------------------------------------------*/ -/* printCLine - try to find the c-code for this lineno */ +/* printILine - return the readable i-code for this ic */ /*-----------------------------------------------------------------*/ -static FILE *inFile=NULL; -static char inLineString[1024]; -static int inLineNo=0; -static char lastSrcFile[PATH_MAX]; -int rewinds=0; +char * +printILine (iCode *ic) +{ + char *verbalICode; + struct dbuf_s tmpBuf; + iCodeTable *icTab=getTableEntry(ic->op); + + dbuf_init(&tmpBuf, 1024); -char *printCLine (char *srcFile, int lineno) { + if (INLINEASM == ic->op) + dbuf_append (&tmpBuf, "inline", (sizeof "inline") - 1); + else { + /* stuff the temporary file with the readable icode */ + icTab->iCodePrint(&tmpBuf, ic, icTab->printName); + } + + /* null terminate the buffer */ + dbuf_c_str(&tmpBuf); + verbalICode = dbuf_detach(&tmpBuf); + + /* kill the trailing NL */ + if ('\n' == verbalICode[strlen(verbalICode) - 1]) + verbalICode[strlen(verbalICode) - 1] = '\0'; + + /* and throw it up */ + return verbalICode; +} + +/*-----------------------------------------------------------------*/ +/* printCLine - return the c-code for this lineno */ +/*-----------------------------------------------------------------*/ +/* int rewinds=0; */ +char * +printCLine (char *srcFile, int lineno) +{ + static FILE *inFile=NULL; + static char inLineString[1024]; + static int inLineNo=0; + static char lastSrcFile[PATH_MAX]; char *ilsP=inLineString; if (inFile) { @@ -220,30 +267,31 @@ char *printCLine (char *srcFile, int lineno) { fclose (inFile); inFile = NULL; inLineNo = 0; + strncpyz (lastSrcFile, srcFile, PATH_MAX); } } - if (!inFile) { - inFile=fopen(srcFile, "r"); - if (!inFile) { - perror ("printCLine"); - exit (1); - } - strcpy (lastSrcFile, srcFile); - } - if (lineno> 8)"}, {"hihis","(%s >> 16)"}, @@ -298,6 +346,7 @@ static const ASM_MAPPING _asxxxx_mapping[] = {"hihil","(%05d$ >> 16)"}, {"hihihil","(%05d$ >> 24)"}, {"equ","="}, + {"org", ".org 0x%04X"}, {NULL, NULL} }; @@ -337,7 +386,7 @@ static const ASM_MAPPING _gas_mapping[] = "; ---------------------------------" }, {"functionlabeldef", "%s:"}, - {"bankimmeds", "0 ; PENDING: bank support"}, + {"bankimmeds", "0 ; PENDING: bank support"}, {NULL, NULL} }; @@ -376,7 +425,7 @@ static const ASM_MAPPING _a390_mapping[] = "; ---------------------------------" }, {"functionlabeldef", "%s:"}, - {"bankimmeds", "0 ; PENDING: bank support"}, + {"bankimmeds", "0 ; PENDING: bank support"}, {"los","(%s & 0FFh)"}, {"his","((%s / 256) & 0FFh)"}, {"hihis","((%s / 65536) & 0FFh)"}, @@ -390,6 +439,7 @@ static const ASM_MAPPING _a390_mapping[] = {"hihil","((L%05d / 65536) & 0FFh)"}, {"hihihil","((L%09d / 16777216) & 0FFh)"}, {"equ"," equ"}, + {"org", ".org 0x%04X"}, {NULL, NULL} }; @@ -428,7 +478,7 @@ static const ASM_MAPPING _xa_asm_mapping[] = "; ---------------------------------" }, {"functionlabeldef", "%s:"}, - {"bankimmeds", "0 ; PENDING: bank support"}, + {"bankimmeds", "0 ; PENDING: bank support"}, {"los","(%s & 0FFh)"}, {"his","((%s / 256) & 0FFh)"}, {"hihis","((%s / 65536) & 0FFh)"},