More AVR stuff
[fw/sdcc] / src / SDCCsymt.c
index 688e896685e4ea842a4cb18093000aa0ca616cd0..a6b711b8efbe0af35f105fb647699be75294a676 100644 (file)
@@ -293,11 +293,11 @@ void pointerTypes (link *ptr, link *type)
            DCL_TYPE(ptr) = POINTER ;
            break;
        case S_CODE:
-           DCL_PTR_CONST(ptr) = 1;
+           DCL_PTR_CONST(ptr) = port->mem.code_ro;
            DCL_TYPE(ptr) = CPOINTER ;
            break;
-       case S_FLASH:
-           DCL_TYPE(ptr) = FLPOINTER;
+       case S_EEPROM:
+           DCL_TYPE(ptr) = EEPPOINTER;
            break;
        default:
            DCL_TYPE(ptr) = GPOINTER;
@@ -565,7 +565,7 @@ unsigned int   getSize ( link *p )
     case PPOINTER:
     case POINTER:
        return ( PTRSIZE ) ;
-    case FLPOINTER:
+    case EEPPOINTER:
     case FPOINTER:
     case CPOINTER:
        return ( FPTRSIZE );
@@ -620,7 +620,7 @@ unsigned int   bitsForType ( link *p )
     case PPOINTER:
     case POINTER:
        return ( PTRSIZE * 8) ;
-    case FLPOINTER:
+    case EEPPOINTER:
     case FPOINTER:
     case CPOINTER:
        return ( FPTRSIZE * 8);
@@ -930,13 +930,15 @@ static void  checkSClass ( symbol *sym )
 
     /* global variables declared const put into code */
     if (sym->level == 0 && 
-       SPEC_SCLS(sym->etype) == S_CONSTANT) 
+       SPEC_SCLS(sym->etype) == S_CONSTANT) {
        SPEC_SCLS(sym->etype) = S_CODE ;
-    
+       SPEC_CONST(sym->etype) = 1;
+    }
 
     /* global variable in code space is a constant */
     if (sym->level == 0 && 
-       SPEC_SCLS(sym->etype) == S_CODE) 
+       SPEC_SCLS(sym->etype) == S_CODE &&
+       port->mem.code_ro )
        SPEC_CONST(sym->etype) = 1;
     
 
@@ -1003,6 +1005,7 @@ static void  checkSClass ( symbol *sym )
     if (SPEC_SCLS(sym->etype) == S_CODE && 
        sym->ival == NULL               &&
        !sym->level                     &&
+       port->mem.code_ro               &&
        !IS_EXTERN(sym->etype)) 
        werror(E_CODE_NO_INIT,sym->name);
     
@@ -1379,6 +1382,7 @@ void  processFuncArgs   (symbol *func, int ignoreName)
     value *val ;
     int pNum = 1;   
     
+
     /* if this function has variable argument list */
     /* then make the function a reentrant one     */
     if (func->hasVargs)
@@ -1395,19 +1399,23 @@ void  processFuncArgs   (symbol *func, int ignoreName)
        func->args = NULL ;
        return ;
     }
-    
+
+    /* reset regparm for the port */
+    (*port->reset_regparms)();
     /* if any of the arguments is an aggregate */
     /* change it to pointer to the same type */
     while (val) {
 
        /* mark it as a register parameter if
-          the function does nit have VA_ARG
-          and MAX_REG_PARMS not exceeded &&
+          the function does not have VA_ARG
+          and as port dictates
           not inhibited by command line option or #pragma */
-       if (pNum <= MAX_REG_PARMS && 
+       if (!func->hasVargs       &&        
            !options.noregparms   &&
-           !func->hasVargs)
+           (*port->reg_parm)(val->type)) {
+
            SPEC_REGPARM(val->etype) = 1;
+       }
        
        if ( IS_AGGREGATE(val->type)) {
            /* if this is a structure */
@@ -1442,8 +1450,8 @@ void  processFuncArgs   (symbol *func, int ignoreName)
            case S_XDATA:
                DCL_TYPE(val->type) = FPOINTER;
                break;
-           case S_FLASH:
-               DCL_TYPE(val->type) = FLPOINTER;
+           case S_EEPROM:
+               DCL_TYPE(val->type) = EEPPOINTER;
                break;
            default :
                DCL_TYPE(val->type) = GPOINTER;
@@ -1554,8 +1562,8 @@ void printTypeChain (link *type, FILE *of)
                if (DCL_PTR_CONST(type))
                    fprintf(of,"const ");
                break;
-           case FLPOINTER:
-               fprintf (of,"_flash * ");
+           case EEPPOINTER:
+               fprintf (of,"_eeprom * ");
                if (DCL_PTR_CONST(type))
                    fprintf(of,"const ");
                break;
@@ -1625,6 +1633,9 @@ void printTypeChain (link *type, FILE *of)
            case V_BIT:
                fprintf(of,"bit {%d,%d}",SPEC_BSTR(type),SPEC_BLEN(type));
                break;
+               
+           default:
+               break;
            }
        }
        type = type->next;
@@ -1663,12 +1674,14 @@ void cdbTypeInfo (link *type,FILE *of)
            case PPOINTER:
                fprintf (of,"DP,");
                break;
-           case FLPOINTER:
+           case EEPPOINTER:
                fprintf (of,"DA,");
                break;
            case ARRAY :
                fprintf (of,"DA%d,",DCL_ELEM(type));
                break;
+           default:
+               break;
            }
        } else { 
            switch (SPEC_NOUN(type)) {
@@ -1705,6 +1718,9 @@ void cdbTypeInfo (link *type,FILE *of)
            case V_BIT:
                fprintf(of,"SB%d$%d",SPEC_BSTR(type),SPEC_BLEN(type));
                break;
+
+           default:
+               break;
            }
            fputs(":",of);
            if (SPEC_USIGN(type))
@@ -1907,11 +1923,11 @@ void initCSupport ()
            for (su = 0; su < 2; su++) {
                if (tofrom) {
                    sprintf(buffer, "__fs2%s%s", ssu[su], sbwd[bwd]);
-                   __conv[tofrom][bwd][su] = funcOfType(buffer, __multypes[bwd][su], floatType, 2, options.float_rent);
+                   __conv[tofrom][bwd][su] = funcOfType(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], 2, options.float_rent);
+                   __conv[tofrom][bwd][su] = funcOfType(buffer, floatType, __multypes[bwd][su], 1, options.float_rent);
                }
            }
        }