**/
while (bp)
{
-
if (strcmp (bp->name, sym->name) == 0 && bp->level <= sym->level)
{
/* if this is parameter then nothing else need to be checked */
if (((symbol *) (bp->sym))->_isparm)
return (bp->sym);
- /* if levels match then block numbers hsould also match */
+ /* if levels match then block numbers should also match */
if (bp->level && bp->level == sym->level && bp->block == sym->block)
return (bp->sym);
/* if levels don't match then we are okay */
ptr = ptr->next;
/* could not find it */
-#if 0
- if (!ptr || IS_SPEC (ptr) ||
- DCL_TYPE(ptr)!=UPOINTER)
- return;
-#else
if (!ptr || IS_SPEC (ptr))
return;
pointerTypes (ptr->next, type);
return;
}
-#endif
/* change the pointer type depending on the
storage class of the type */
/*------------------------------------------------------------------*/
/* 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;
+ sym_link *symlink=dest;
+#if 0
if (!IS_SPEC(dest)) {
- // This should not happen
- fprintf (stderr, "*** internal error: can't merge declarators\n");
+ // This can happen for pointers, find the end type
+ while (dest && !IS_SPEC(dest))
+ dest=dest->next;
}
if (!IS_SPEC(src)) {
// here we have a declarator as source, reverse them
symlink=src;
src=dest;
dest=symlink;
- while (!IS_SPEC(dest)) {
+ while (dest && !IS_SPEC(dest)) {
// and find the specifier
dest=dest->next;
}
}
#endif
+ if (!IS_SPEC(dest) || !IS_SPEC(src)) {
+ werror (E_INTERNAL_ERROR, __FILE__, __LINE__, "cannot merge declarator");
+ exit (1);
+ }
+
if (getenv("DEBUG_mergeSpec")) {
fprintf (stderr, "mergeSpec: \"%s\"\n", 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
}
/*------------------------------------------------------------------*/
sym->ival = NULL;
}
-#if 0
- /* if this is an automatic symbol then */
- /* storage class will be ignored and */
- /* symbol will be allocated on stack/ */
- /* data depending on flag */
- if (sym->level &&
- (options.stackAuto || reentrant) &&
- (SPEC_SCLS (sym->etype) != S_AUTO &&
- SPEC_SCLS (sym->etype) != S_FIXED &&
- SPEC_SCLS (sym->etype) != S_REGISTER &&
- SPEC_SCLS (sym->etype) != S_STACK &&
- SPEC_SCLS (sym->etype) != S_XSTACK))
- {
- werror (E_AUTO_ASSUMED, sym->name);
- SPEC_SCLS (sym->etype) = S_AUTO;
- }
-#else
/* if this is an atomatic symbol */
if (sym->level && (options.stackAuto || reentrant)) {
if ((SPEC_SCLS (sym->etype) == S_AUTO ||
}
}
}
-#endif
/* automatic symbols cannot be given */
/* an absolute address ignore it */
/* initializers if not an extern */
if (SPEC_SCLS (sym->etype) == S_CODE &&
sym->ival == NULL &&
- !sym->level &&
+ //!sym->level &&
port->mem.code_ro &&
!IS_EXTERN (sym->etype) &&
!funcInChain (sym->type))
return rType;
}
-/*------------------------------------------------------------------*/
-/* compareType - will do type check return 1 if match */
-/*------------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+/* compareType - will do type check return 1 if match, -1 if castable */
+/*--------------------------------------------------------------------*/
int
compareType (sym_link * dest, sym_link * src)
{
{
if (DCL_TYPE (src) == DCL_TYPE (dest))
return compareType (dest->next, src->next);
- else if (IS_PTR (src) && IS_PTR (dest))
+ if (IS_PTR (src) && IS_PTR (dest))
return -1;
- else if (IS_PTR (dest) && IS_ARRAY (src))
+ if (IS_PTR (dest) && IS_ARRAY (src))
return -1;
- else if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src))
+ if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src))
return -1 * compareType (dest->next, src);
- else
- return 0;
+ return 0;
}
else if (IS_PTR (dest) && IS_INTEGRAL (src))
return -1;
return -1;
if (SPEC_USIGN (dest) != SPEC_USIGN (src))
- return -2;
+ return -1;
return 1;
}
if (compareType (csym->type, sym->type) <= 0)
{
werror (E_PREV_DEF_CONFLICT, csym->name, "type");
- werror (E_CONTINUE, "previous definition type ");
+ werror (W_CONTINUE, "previous definition type ");
printTypeChain (csym->type, stderr);
fprintf (stderr, "\n");
- werror (E_CONTINUE, "current definition type ");
+ werror (W_CONTINUE, "current definition type ");
printTypeChain (sym->type, stderr);
fprintf (stderr, "\n");
return 0;
/*-----------------------------------------------------------------*/
/* printTypeChain - prints the type chain in human readable form */
/*-----------------------------------------------------------------*/
-void
-printTypeChain (sym_link * type, FILE * of)
+void
+printTypeChain (sym_link * start, FILE * of)
{
int nlr = 0;
+ sym_link * type, * search;
if (!of)
{
nlr = 1;
}
+ /* print the chain as it is written in the source: */
+ /* start with the last entry */
+ for (type = start; type && type->next; type = type->next)
+ ;
while (type)
{
if (IS_DECL (type))
{
- if (DCL_PTR_VOLATILE(type)) {
+ if (DCL_PTR_VOLATILE (type)) {
fprintf (of, "volatile ");
}
switch (DCL_TYPE (type))
{
case FUNCTION:
- fprintf (of, "function ");
+ fprintf (of, "function");
break;
case GPOINTER:
- fprintf (of, "_generic * ");
if (DCL_PTR_CONST (type))
fprintf (of, "const ");
+ fprintf (of, "generic *");
break;
case CPOINTER:
- fprintf (of, "_code * ");
if (DCL_PTR_CONST (type))
fprintf (of, "const ");
+ fprintf (of, "code *");
break;
case FPOINTER:
- fprintf (of, "_far * ");
if (DCL_PTR_CONST (type))
fprintf (of, "const ");
+ fprintf (of, "far *");
break;
case EEPPOINTER:
- fprintf (of, "_eeprom * ");
if (DCL_PTR_CONST (type))
fprintf (of, "const ");
+ fprintf (of, "eeprom * ");
break;
case POINTER:
- fprintf (of, "_near * ");
if (DCL_PTR_CONST (type))
fprintf (of, "const ");
+ fprintf (of, "near *");
break;
case IPOINTER:
- fprintf (of, "_idata *");
if (DCL_PTR_CONST (type))
fprintf (of, "const ");
+ fprintf (of, "idata *");
break;
case PPOINTER:
- fprintf (of, "_pdata *");
if (DCL_PTR_CONST (type))
fprintf (of, "const ");
+ fprintf (of, "pdata *");
break;
case UPOINTER:
- fprintf (of, " _unkown *");
if (DCL_PTR_CONST (type))
fprintf (of, "const ");
+ fprintf (of, "unkown *");
break;
case ARRAY:
- fprintf (of, "array of ");
+ fprintf (of, "array of");
break;
}
}
case V_INT:
if (IS_LONG (type))
fprintf (of, "long ");
- fprintf (of, "int ");
+ fprintf (of, "int");
break;
case V_CHAR:
- fprintf (of, "char ");
+ fprintf (of, "char");
break;
case V_VOID:
- fprintf (of, "void ");
+ fprintf (of, "void");
break;
case V_FLOAT:
- fprintf (of, "float ");
+ fprintf (of, "float");
break;
case V_STRUCT:
break;
case V_SBIT:
- fprintf (of, "sbit ");
+ fprintf (of, "sbit");
break;
case V_BIT:
break;
case V_DOUBLE:
- fprintf (of, "double ");
+ fprintf (of, "double");
break;
default:
- fprintf (of, "unknown type ");
+ fprintf (of, "unknown type");
break;
}
}
- type = type->next;
+ /* search entry in list before "type" */
+ for (search = start; search && search->next != type;)
+ search = search->next;
+ type = search;
+ if (type)
+ fputc (' ', of);
}
if (nlr)
fprintf (of, "\n");
/*-----------------------------------------------------------------*/
/* cdbTypeInfo - print the type information for debugger */
/*-----------------------------------------------------------------*/
-void
+void
cdbTypeInfo (sym_link * type, FILE * of)
{
fprintf (of, "{%d}", getSize (type));
int bwd, su, muldivmod, tofrom, rlrr;
+ if (getenv("SDCC_NO_C_SUPPORT")) {
+ /* for debugging only */
+ return;
+ }
+
floatType = newFloatLink ();
for (bwd = 0; bwd < 3; bwd++)