From: jesusc Date: Sat, 9 Nov 2002 23:40:08 +0000 (+0000) Subject: Now reports memory usage using the value from option --iram-size. X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=6ac597e37a3c50be4cba4d9530bbab3d7fb1bb73;p=fw%2Fsdcc Now reports memory usage using the value from option --iram-size. git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2109 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/as/mcs51/lklist.c b/as/mcs51/lklist.c index 5a1a7fe8..688134a0 100644 --- a/as/mcs51/lklist.c +++ b/as/mcs51/lklist.c @@ -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 (k0x80) + 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);