better fix for bug #954173
[fw/sdcc] / as / mcs51 / lkaomf51.c
index 7082e675bd8942f51a566c5fbcaac8a56ef6b998..82dccb3e8c0232aa5beb8fbd7b8c05afb5dc1ab9 100644 (file)
@@ -18,6 +18,7 @@
    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 -------------------------------------------------------------------------*/
 
+#include <ctype.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -25,6 +26,7 @@
 
 #define EQ(A,B) !strcmp((A),(B))
 #define MEMSIZE 0x10000
+//#define DODUMP 1
 
 typedef struct
 {
@@ -84,6 +86,12 @@ _UsageType UsageType[]=
 {
        {"CSEG",                0},
        {"GSINIT",              0},
+       {"GSINIT0",             0},
+       {"GSINIT1",             0},
+       {"GSINIT2",             0},
+       {"GSINIT3",             0},
+       {"GSINIT4",             0},
+       {"GSINIT5",             0},
        {"GSFINAL",             0},
        {"HOME",                0},
        {"XINIT",               0},
@@ -122,8 +130,8 @@ void GetName(char * filepath, char * name)
 void SaveLinkedFilePath(char * filepath) 
 {
        int j;
-       
-       if(dflag)
+
+       if((dflag) && (!rflag))
        {
                infn=realloc(infn, sizeof(_infn)*(numin+1));
 
@@ -143,7 +151,12 @@ void SaveLinkedFilePath(char * filepath)
                GetName(infn[numin].PathName, infn[numin].ModuleName);
                //printf("%s, %s\n", infn[numin].PathName, infn[numin].ModuleName);
                
-               numin++;
+               /*Check if this filename is already in*/
+               for(j=0; j<numin; j++)
+               {
+                       if(EQ(infn[numin].PathName, infn[j].PathName)) break;
+               }
+               if(j==numin) numin++;
        }
 }
 
@@ -210,11 +223,12 @@ void OutputChkSum(void)
        GlobalChkSum=0;
 }
 
+#ifdef DODUMP
 void DumpForDebug (void)
 {
        char DumpFileName[PATH_MAX];
        FILE * DumpFile;
-       int j;
+       int j, k;
 
        strcpy(DumpFileName, infn[0].PathName);
        strcat(DumpFileName, ".d51");
@@ -230,14 +244,15 @@ void DumpForDebug (void)
 
        for(j=0; j<numsym; j++)
        {
+               k=symbol[j].UsageType&0xf;
                fprintf(DumpFile, "%s, %s, %s, 0x%04x, %s\n",
                        symbol[j].name,
                        infn[symbol[j].FileNameNumber].PathName,
                        (symbol[j].Procedure>=0)?procedure[symbol[j].Procedure].name:"GLOBAL",
                        symbol[j].Address,
-                       UsageTypeName[symbol[j].UsageType&0xf]);
+                       k<6?UsageTypeName[k]:"???");
        }
-
+       
        fprintf(DumpFile,"\nPROCEDURES:\n");
        for(j=0; j<numproc; j++)
        {
@@ -260,6 +275,7 @@ void DumpForDebug (void)
 
        fclose(DumpFile);
 }
+#endif
 
 void OutputAOEMF51(void)
 {
@@ -300,7 +316,7 @@ void OutputAOEMF51(void)
                /*Public symbols defined in this module*/
                recsize=2;
                for(k=0; k<numsym; k++)/*Compute the record length*/
-                       if ( (symbol[k].FileNameNumber==j) &&
+                       if ( (symbol[k].FileNameNumber==j) && (symbol[k].Address!=-1) &&
                                 (symbol[k].Procedure==-1) &&
                                 (symbol[k].Static==-1) ) recsize+=((strlen(symbol[k].name)+1)+5);
 
@@ -311,7 +327,7 @@ void OutputAOEMF51(void)
                        OutputByte(0x01);       /*DEF TYPE: Public symbols*/
                        for(k=0; k<numsym; k++)
                        {
-                               if ( (symbol[k].FileNameNumber==j) &&
+                               if ( (symbol[k].FileNameNumber==j) && (symbol[k].Address!=-1) &&
                                         (symbol[k].Procedure==-1) &&
                                         (symbol[k].Static==-1) )
                                {
@@ -328,7 +344,7 @@ void OutputAOEMF51(void)
                /*Local symbols defined in this module*/
                recsize=2;
                for(k=0; k<numsym; k++)/*Compute the record length*/
-                       if ( (symbol[k].FileNameNumber==j) &&
+                       if ( (symbol[k].FileNameNumber==j) && (symbol[k].Address!=-1) &&
                                 (symbol[k].Procedure==-1) &&
                                 (symbol[k].Static==j) ) recsize+=((strlen(symbol[k].name)+1)+5);
 
@@ -339,7 +355,7 @@ void OutputAOEMF51(void)
                        OutputByte(0x00);       /*DEF TYPE: Local symbols*/
                        for(k=0; k<numsym; k++)
                        {
-                               if ( (symbol[k].FileNameNumber==j) && 
+                               if ( (symbol[k].FileNameNumber==j) && (symbol[k].Address!=-1) &&
                                         (symbol[k].Procedure==-1) &&
                                         (symbol[k].Static==j) )
                                {
@@ -368,6 +384,7 @@ void OutputAOEMF51(void)
 
                                /*Content Record*/
                                OutputByte(0x06);/*REC TYPE*/
+                               if(procedure[k].EndAdd==-1) procedure[k].EndAdd=HexSize;
                                recsize=procedure[k].EndAdd-procedure[k].BeginAdd+1+4;
                                OutputWord(recsize);/*Record Length*/
                                OutputByte(0x00);/*SEG ID*/
@@ -453,21 +470,29 @@ void OutputAOEMF51(void)
 
        for(j=-1; j<numproc; j++)
        {
-               if(j==-1)
+               if(numproc)
                {
-                       i=HexBegin;
-                       k=procedure[0].BeginAdd;
+                       if(j==-1)
+                       {
+                               i=HexBegin;
+                               k=procedure[0].BeginAdd;
+                       }
+                       else if(j==(numproc-1))
+                       {
+                               i=procedure[j].EndAdd+1;
+                               k=HexSize;
+                       }
+                       else
+                       {
+                               i=procedure[j].EndAdd+1;
+                               k=procedure[j+1].BeginAdd;
+                       }
                }
-               else if(j==(numproc-1))
+               else /*What, no procedures??? Ok, here it is the whole hex file*/
                {
-                       i=procedure[j].EndAdd+1;
+                       i=HexBegin;
                        k=HexSize;
                }
-               else
-               {
-                       i=procedure[j].EndAdd+1;
-                       k=procedure[j+1].BeginAdd;
-               }
 
                if(i<k)
                {
@@ -536,6 +561,7 @@ void CollectInfoFromCDB(void)
        if(CDBin==NULL)
        {
                printf("Couldn't open file '%s'\n", SourceName);
+               lkexit(1);
        }
 
        CurrentModule=0; /*Set the active module as the first one*/
@@ -556,6 +582,8 @@ void CollectInfoFromCDB(void)
                        /* Example:
                        "S:G$actual$0$0({7}ST__00010000:S),E,0,0"
                        "S:Lmain$j$1$1({2}SI:S),E,0,0"
+                       "S:G$DS1306_Reset_SPI$0$0({2}DF,SV:S),C,0,0"
+                       "S:G$main$0$0({2}DF,SV:S),C,0,0"
                        */
 
                        case 'S':
@@ -571,7 +599,7 @@ void CollectInfoFromCDB(void)
                                           &AddressSpace, &c,
                                           &OnStack, &c, 
                                           &StackOffset);
-                               
+
                                i=-1; k=-1;
                                switch(scope[2])
                                {
@@ -613,6 +641,7 @@ void CollectInfoFromCDB(void)
                                        {
                                                case 'C': /*Code*/ 
                                                case 'D': /*Code/static segment*/ 
+                                               case 'Z': /*Functions and undefined code space*/ 
                                                        symbol[numsym].UsageType=0x40;
                                                break;
 
@@ -623,6 +652,7 @@ void CollectInfoFromCDB(void)
 
                                                case 'E': /*Internal ram (lower 128) bytes*/ 
                                                case 'I': /*SFR space*/ 
+                                               case 'R': /*Register Space*/ 
                                                        symbol[numsym].UsageType=0x42;
                                                break;
 
@@ -635,6 +665,10 @@ void CollectInfoFromCDB(void)
                                                case 'J': /*SBIT space*/ 
                                                        symbol[numsym].UsageType=0x44;
                                                break;
+                                               
+                                               default:
+                                                       printf("Unknown scope information for: %s, AddressSpace:%c\n", symbol[numsym].name, AddressSpace);
+                                               break;
                                        }
                                        numsym++;
                                }
@@ -660,7 +694,7 @@ void CollectInfoFromCDB(void)
                                        procedure[numproc].EndAdd=-1;/*To be collected latter*/
                                        numproc++;
                                }
-
+                               
                                /*This function name is also a global symbol*/
                                for(j=0; j<numsym; j++)/*A global symbol may have been already defined*/
                                {
@@ -674,9 +708,9 @@ void CollectInfoFromCDB(void)
                                        symbol[numsym].UsageType=0x00;/*A procedure name symbol*/
                                        symbol[numsym].Procedure=-1; /*Global symbol*/
                                        symbol[numsym].Address=-1;/*Collected later*/
+                                       symbol[numsym].Static=-1; // o_gloom
                                        numsym++;
                                }
-
                        break;
 
                        case 'L':
@@ -685,7 +719,7 @@ void CollectInfoFromCDB(void)
                                        case 'G': /*Example L:G$P0$0$0:80*/
                                                sscanf(buff, "%[^$] %c %[^$] %c %[^:] %c %x",
                                                        scope, &c, name, &c, level, &c, &Address);
-                                               
+
                                                for(j=0; j<numsym; j++)
                                                {
                                                        if(EQ(symbol[j].name, name))
@@ -693,21 +727,23 @@ void CollectInfoFromCDB(void)
                                                                if( (symbol[j].Address==-1) && (symbol[j].Procedure==-1) )
                                                                {
                                                                        symbol[j].Address=Address;
-                                                                       /*If the symbol is the name of a procedure, the address is also
-                                                                       the begining of such procedure*/
-                                                                       if(symbol[j].UsageType==0x00)
+                                                               }
+                                                               
+                                                               /*If the symbol is the name of a procedure, the address is also
+                                                               the begining of such procedure*/
+                                                               if((symbol[j].UsageType&0x0f)==0x00)
+                                                               {
+                                                                       for(k=0; k<numproc; k++)
                                                                        {
-                                                                               for(k=0; k<numproc; k++)
+                                                                               if(EQ(symbol[j].name, procedure[k].name))
                                                                                {
-                                                                                       if(EQ(symbol[j].name, procedure[k].name))
-                                                                                       {
-                                                                                               if(procedure[k].BeginAdd==-1)
-                                                                                                       procedure[k].BeginAdd=Address;
-                                                                                               break;
-                                                                                       }
+                                                                                       if(procedure[k].BeginAdd==-1)
+                                                                                               procedure[k].BeginAdd=Address;
+                                                                                       break;
                                                                                }
                                                                        }
                                                                }
+                                                               
                                                                break;
                                                        }
                                                }
@@ -725,6 +761,17 @@ void CollectInfoFromCDB(void)
                                                                break;
                                                        }
                                                }
+                                               
+                                               /*It could be also a static function*/
+                                               for(j=0; j<numproc; j++)
+                                               {
+                                                       if(EQ(procedure[j].name, name))
+                                                       {
+                                                               if( (procedure[j].BeginAdd==-1) ) procedure[j].BeginAdd=Address;
+                                                               break;
+                                                       }
+                                               }
+
                                        break;
                                        
                                        case 'L': /*Example L:Lmain$j$1$1:29*/
@@ -807,6 +854,11 @@ void CollectInfoFromCDB(void)
                }
        }
 
+       /*Make sure each procedure has an end*/
+       for(k=0; k<(numproc-1); k++)
+       {
+               if (procedure[k].EndAdd==-1) procedure[k].EndAdd=procedure[k+1].BeginAdd-1;
+       }
        /*Asign each line number to a procedure*/
        for(j=0; j<numlinenum; j++)
        {
@@ -922,10 +974,12 @@ int ReadHexFile(int * Begin)
 
 void CreateAOMF51(void)
 {
-       if(dflag)
+       if((dflag) && (!rflag))
        {
                CollectInfoFromCDB();
-               //DumpForDebug();
+               #ifdef DODUMP
+               DumpForDebug();
+               #endif
                HexSize=ReadHexFile(&HexBegin)+1;
                OutputAOEMF51();
                FreeAll();