X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.c;h=f830136954bce1767e639ed8b77cac9d9f8f9db2;hb=626863c49dd94f2a84ee83f28d3f71f56ebe0e8e;hp=9ff910f0c10790d4279b79d872100bab8d166377;hpb=994605ba5c8b657fac1563cd44707f679a85967e;p=fw%2Fsdcc diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 9ff910f0..f8301369 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -524,10 +524,32 @@ void checkTypeSanity(sym_link *etype, char *name) { /*------------------------------------------------------------------*/ /* mergeSpec - merges two specifiers and returns the new one */ /*------------------------------------------------------------------*/ +#define LAST_MINUTE_2_3_0_FIX sym_link * mergeSpec (sym_link * dest, sym_link * src, char *name) { +#ifdef LAST_MINUTE_2_3_0_FIX + sym_link *symlink; + + if (!IS_SPEC(dest)) { + // This should not happen + fprintf (stderr, "*** internal error: can't merge declarators\n"); + } + if (!IS_SPEC(src)) { + // here we have a declarator as source, reverse them + symlink=src; + src=dest; + dest=symlink; + while (!IS_SPEC(dest)) { + // and find the specifier + dest=dest->next; + } + } else { + symlink=dest; + } +#endif + if (getenv("DEBUG_mergeSpec")) { fprintf (stderr, "mergeSpec: \"%s\"\n", name); } @@ -592,7 +614,11 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) if (IS_STRUCT (dest) && SPEC_STRUCT (dest) == NULL) SPEC_STRUCT (dest) = SPEC_STRUCT (src); +#ifdef LAST_MINUTE_2_3_0_FIX + return symlink; +#else return dest; +#endif } /*------------------------------------------------------------------*/ @@ -2254,6 +2280,19 @@ _makeRegParam (symbol * sym) } } +static char * +_mangleFunctionName(char *in) +{ + if (port->getMangledFunctionName) + { + return port->getMangledFunctionName(in); + } + else + { + return in; + } +} + /*-----------------------------------------------------------------*/ /* initCSupport - create functions for C support routines */ /*-----------------------------------------------------------------*/ @@ -2319,12 +2358,12 @@ initCSupport () if (tofrom) { sprintf (buffer, "__fs2%s%s", ssu[su], sbwd[bwd]); - __conv[tofrom][bwd][su] = funcOfType (buffer, __multypes[bwd][su], floatType, 1, options.float_rent); + __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], floatType, 1, options.float_rent); } else { sprintf (buffer, "__%s%s2fs", ssu[su], sbwd[bwd]); - __conv[tofrom][bwd][su] = funcOfType (buffer, floatType, __multypes[bwd][su], 1, options.float_rent); + __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), floatType, __multypes[bwd][su], 1, options.float_rent); } } } @@ -2340,7 +2379,7 @@ initCSupport () smuldivmod[muldivmod], ssu[su], sbwd[bwd]); - __muldiv[muldivmod][bwd][su] = funcOfType (buffer, __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent); + __muldiv[muldivmod][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent); SPEC_NONBANKED (__muldiv[muldivmod][bwd][su]->etype) = 1; if (bwd < port->muldiv.force_reg_param_below) _makeRegParam (__muldiv[muldivmod][bwd][su]);