Now reports memory usage using the value from option --iram-size.
[fw/sdcc] / as / mcs51 / lklist.c
index 5a1a7fe8675f7364fed1368195db4713bd8bff78..688134a027b4cd3a54a595b2886cd2e8355b0c3e 100644 (file)
@@ -1102,12 +1102,18 @@ int summary(struct area * areap)
 {
        #define EQ(A,B) !strcmpi((A),(B))
        #define MIN_STACK 16
-       #define REPORT_ERROR(A) { fprintf(of, "%s", (A)); \
-                                     printf("%s", (A)); \
-                                                         toreturn=1; }
+       #define REPORT_ERROR(A, H) \
+       {\
+               fprintf(of, "%s%s", (H)?"*** ERROR: ":"", (A)); \
+               fprintf(stderr, "%s%s", (H)?"\n?ASlink-Error-":"",(A)); \
+               toreturn=1; \
+       }
 
-       #define REPORT_WARNING(A) { fprintf(of, "%s", (A)); \
-                                     printf("%s", (A));}
+       #define REPORT_WARNING(A, H) \
+       { \
+               fprintf(of, "%s%s", (H)?"*** WARNING: ":"", (A)); \
+               fprintf(stderr, "%s%s",(H)?"\n?ASlink-Warning-":"", (A)); \
+       }
 
        char buff[128];
        int j, toreturn=0;
@@ -1117,36 +1123,61 @@ int summary(struct area * areap)
        FILE * of;
        
        /*Artifacts used for printing*/
-       char start[8], end[8], size[8];
-       char format[]="   %-20.20s %-7.7s %-7.7s %-7.7s\n";
+       char start[8], end[8], size[8], max[8];
+       char format[]="   %-16.16s %-7.7s %-7.7s %-7.7s %-7.7s\n";
        char line[]="---------------------";
 
        typedef struct
        {
                unsigned int Start;
                unsigned int Size;
+               unsigned int Max;
                char Name[NCPS];
                unsigned int flag;
        } _Mem;
 
        unsigned int dram[0x100];
        _Mem Ram[]={
-               {0,             8, "REG_BANK_0", 0x0001},
-               {0x8,   8, "REG_BANK_1", 0x0002},
-               {0x10,  8, "REG_BANK_2", 0x0004},
-               {0x18,  8, "REG_BANK_3", 0x0008},
-               {0x20,  0, "BSEG_BYTES", 0x0010},
-               {0,             0, "UNUSED",     0x0000},
-               {0x7f,  0, "DATA",       0x0020},
-               {0,             0, "TOTAL:",     0x0000}
+               {0,             8,      8,       "REG_BANK_0", 0x0001},
+               {0x8,   8,      8,       "REG_BANK_1", 0x0002},
+               {0x10,  8,      8,       "REG_BANK_2", 0x0004},
+               {0x18,  8,      8,       "REG_BANK_3", 0x0008},
+               {0x20,  0,      16,      "BSEG_BYTES", 0x0010},
+               {0,             0,      128, "UNUSED",     0x0000},
+               {0x7f,  0,      128, "DATA",       0x0020},
+               {0,             0,      128, "TOTAL:",     0x0000}
        };
        
-       _Mem IRam= {0xff,   0, "INDIRECT RAM", 0x0080};
-       _Mem Stack={0xff,   0, "STACK", 0x0000};
-       _Mem XRam= {0xffff, 0, "EXTERNAL RAM", 0x0100};
-       _Mem Rom=  {0xffff, 0, "ROM/EPROM/FLASH", 0x0200};
+       _Mem IRam= {0xff,   0,   128, "INDIRECT RAM",           0x0080};
+       _Mem Stack={0xff,   0,     1, "STACK",                          0x0000};
+       _Mem XRam= {0xffff, 0, 65536, "EXTERNAL RAM",           0x0100};
+       _Mem Rom=  {0xffff, 0, 65536, "ROM/EPROM/FLASH",        0x0200};
+
+       if((iram_size<=0)||(iram_size>0x100)) /*Default: 8052 like memory*/
+       {
+               Ram[5].Max=0x80;
+               Ram[6].Max=0x80;
+               Ram[7].Max=0x80;
+               IRam.Max=0x80;
+               iram_size=0x100;
+       }
+       else if(iram_size<0x80)
+       {
+               Ram[5].Max=iram_size;
+               Ram[6].Max=iram_size;
+               Ram[7].Max=iram_size;
+               IRam.Max=0;
+       }
+       else
+       {
+               Ram[5].Max=0x80;
+               Ram[6].Max=0x80;
+               Ram[7].Max=0x80;
+               IRam.Max=iram_size-0x80;
+       }
 
-       for(j=0; j<0x100; j++) dram[j]=0;
+       for(j=0; j<(int)iram_size; j++) dram[j]=0;
+       for(; j<0x100; j++) dram[j]=0x8000; /*Memory not available*/
 
        /* Open Memory Summary File*/
        of = afile(linkp->f_idp, "mem", 1);
@@ -1234,11 +1265,11 @@ int summary(struct area * areap)
 
        /*Report the Ram totals*/
        fprintf(of, "Direct Internal RAM:\n");
-       fprintf(of, format, "Name", "Start", "End", "Size");
+       fprintf(of, format, "Name", "Start", "End", "Size", "Max");
 
        for(j=0; j<8; j++)
        {
-               if((j==0) || (j==7)) fprintf(of, format, line, line, line, line);
+               if((j==0) || (j==7)) fprintf(of, format, line, line, line, line, line);
                if((j!=5) || (Ram[j].Size>0))
                {
                        sprintf(start, "0x%02x", Ram[j].Start);
@@ -1247,7 +1278,8 @@ int summary(struct area * areap)
                        else
                                sprintf(end,  "0x%02x", j==7?Total_Last:Ram[j].Size+Ram[j].Start-1);
                        sprintf(size, "%5u", Ram[j].Size);
-                       fprintf(of, format, Ram[j].Name, start, end, size);
+                       sprintf(max, "%5u", Ram[j].Max);
+                       fprintf(of, format, Ram[j].Name, start, end, size, max);
                }
        }
 
@@ -1255,37 +1287,51 @@ int summary(struct area * areap)
        {
                if(dram[k]!=Ram[6].flag)
                {
-                       sprintf(buff, "*** ERROR: There is a memory overlap starting at 0x%02x.\n", k);
-                       REPORT_ERROR(buff);
+                       sprintf(buff, "Internal memory overlap starting at 0x%02x.\n", k);
+                       REPORT_ERROR(buff, 1);
                        break;
                }
        }
 
-       if((Ram[6].Start+Ram[6].Size)>0x80)
+       if(Ram[4].Size>Ram[4].Max)
        {
-               sprintf(buff, "*** ERROR: Insuficient DRAM memory.  "
-                                       "%d byte%s short.\n", (Ram[6].Start+Ram[6].Size)-0x80,
-                                       ((Ram[6].Start+Ram[6].Size)==1)?"":"s");
-               REPORT_ERROR(buff);
+               k=Ram[4].Size-Ram[4].Max;
+               sprintf(buff, "Insufficient bit addressable memory.  "
+                                       "%d byte%s short.\n", k, (k==1)?"":"s");
+               REPORT_ERROR(buff, 1);
        }
 
        if(Ram[5].Size!=0)
        {
-               sprintf(buff, "*** WARNING: %d bytes in DRAM wasted.  "
-                           "Link could use: --data-loc 0x%02x\n",
+               sprintf(buff, "%d bytes in DRAM wasted.  "
+                           "SDCC link could use: --data-loc 0x%02x\n",
                                        Ram[5].Size, Ram[6].Start-Ram[5].Size);
-               REPORT_WARNING(buff);
+               REPORT_WARNING(buff, 1);
+       }
+
+       if((Ram[6].Start+Ram[6].Size)>Ram[6].Max)
+       {
+               k=(Ram[6].Start+Ram[6].Size)-Ram[6].Max;
+               sprintf(buff, "Insufficient DRAM memory.  "
+                                       "%d byte%s short.\n", k, (k==1)?"":"s");
+               REPORT_ERROR(buff, 1);
        }
 
        /*Report the position of the begining of the stack*/
        fprintf(of, "\nStack starts at: 0x%02x", Stack.Start);
 
        /*Check that the stack pointer is landing in a safe place:*/
-       if(dram[Stack.Start])
+       if( (dram[Stack.Start] & 0x8000) == 0x8000 )
+       {
+               fprintf(of, ".\n");
+               sprintf(buff, "Stack set to unavailable memory.\n");
+               REPORT_ERROR(buff, 1);
+       }
+       else if(dram[Stack.Start])
        {
                fprintf(of, ".\n");
-               sprintf(buff, "*** ERROR: Stack overlaps area ");
-               REPORT_ERROR(buff);
+               sprintf(buff, "Stack overlaps area ");
+               REPORT_ERROR(buff, 1);
                for(j=0; j<7; j++)
                {
                        if(dram[Stack.Start]&Ram[j].flag)
@@ -1298,23 +1344,23 @@ int summary(struct area * areap)
                {
                        sprintf(buff, "'%s'\n", IRam.Name);
                }
-               REPORT_ERROR(buff);
+               REPORT_ERROR(buff, 0);
        }
        else    
        {
-               for(j=Stack.Start, k=0; (j<0x100)&&(dram[j]==0); j++, k++);
+               for(j=Stack.Start, k=0; (j<(int)iram_size)&&(dram[j]==0); j++, k++);
                fprintf(of, " with %d bytes available\n", k);
                if (k<MIN_STACK)
                {
-                       sprintf(buff, "*** WARNING: Only %d byte%s available for stack.\n",
+                       sprintf(buff, "Only %d byte%s available for stack.\n",
                                        k, (k==1)?"":"s");
-                       REPORT_WARNING(buff);
+                       REPORT_WARNING(buff, 1);
                }
        }
 
        fprintf(of, "\nOther memory:\n");
-       fprintf(of, format, "Name", "Start", "End", "Size");
-       fprintf(of, format, line, line, line, line);
+       fprintf(of, format, "Name", "Start", "End", "Size", "Max");
+       fprintf(of, format, line, line, line, line, line);
 
        /*Report IRam totals:*/
        sprintf(start, "0x%02x", IRam.Start);
@@ -1323,7 +1369,8 @@ int summary(struct area * areap)
        else
                sprintf(end,  "0x%02x", IRam.Size+IRam.Start-1);
        sprintf(size, "%5u", IRam.Size);
-       fprintf(of, format, IRam.Name, start, end, size);
+       sprintf(max, "%5u", IRam.Max);
+       fprintf(of, format, IRam.Name, start, end, size, max);
 
        /*Report XRam totals:*/
        sprintf(start, "0x%04x", XRam.Start);
@@ -1332,7 +1379,8 @@ int summary(struct area * areap)
        else
                sprintf(end,  "0x%04x", XRam.Size+XRam.Start-1);
        sprintf(size, "%5u", XRam.Size);
-       fprintf(of, format, XRam.Name, start, end, size);
+       sprintf(max, "%5u", XRam.Max);
+       fprintf(of, format, XRam.Name, start, end, size, max);
 
        /*Report Rom/Flash totals:*/
        sprintf(start, "0x%04x", Rom.Start);
@@ -1341,23 +1389,24 @@ int summary(struct area * areap)
        else
                sprintf(end,  "0x%04x", Rom.Size+Rom.Start-1);
        sprintf(size, "%5u", Rom.Size);
-       fprintf(of, format, Rom.Name, start, end, size);
+       sprintf(max, "%5u", Rom.Max);
+       fprintf(of, format, Rom.Name, start, end, size, max);
 
        /*Report any excess:*/
-       if(IRam.Size>0x80)
+       if((IRam.Start+IRam.Size)>(IRam.Max+0x80))
        {
-               sprintf(buff, "*** ERROR: Insuficient INDIRECT RAM memory.\n");
-               REPORT_ERROR(buff);
+               sprintf(buff, "Insufficient INDIRECT RAM memory.\n");
+               REPORT_ERROR(buff, 1);
        }
-       if(XRam.Size>0x10000)
+       if((XRam.Start+XRam.Size)>XRam.Max)
        {
-               sprintf(buff, "*** ERROR: Insuficient EXTERNAL RAM memory.\n");
-               REPORT_ERROR(buff);
+               sprintf(buff, "Insufficient EXTERNAL RAM memory.\n");
+               REPORT_ERROR(buff, 1);
        }
-       if(Rom.Size>0x10000)
+       if((Rom.Start+Rom.Size)>Rom.Max)
        {
-               sprintf(buff, "*** ERROR: Insuficient ROM/EPROM/FLASH memory.\n");
-               REPORT_ERROR(buff);
+               sprintf(buff, "Insufficient ROM/EPROM/FLASH memory.\n");
+               REPORT_ERROR(buff, 1);
        }
 
        fclose(of);