]> git.sur5r.net Git - cc65/commitdiff
Fragment cleanup, more string pool use
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 6 Jun 2003 06:50:27 +0000 (06:50 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 6 Jun 2003 06:50:27 +0000 (06:50 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2201 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/fileio.c
src/ld65/fileio.h
src/ld65/fragment.c
src/ld65/fragment.h
src/ld65/library.c
src/ld65/lineinfo.c
src/ld65/lineinfo.h
src/ld65/objdata.c
src/ld65/objdata.h
src/ld65/objfile.c
src/ld65/segments.c

index 4998fe3ed572ced030c8f73950abaacac51e1d48..6ddc17158a101d2b6662728254a068b233c46e76 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2000 Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
+/* (C) 1998-2003 Ullrich von Bassewitz                                       */
+/*               Römerstrasse 52                                             */
+/*               D-70794 Filderstadt                                         */
+/* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -41,6 +41,7 @@
 /* ld65 */
 #include "error.h"
 #include "fileio.h"
+#include "spool.h"
 
 
 
@@ -253,19 +254,43 @@ unsigned long ReadVar (FILE* F)
 
 
 
-char* ReadStr (FILE* F)
-/* Read a string from the file (the memory will be malloc'ed) */
+unsigned ReadStr (FILE* F)
+/* Read a string from the file, place it into the global string pool, and
+ * return its string id.
+ */
 {
+    unsigned    Id;
+    char*       B;
+    char        Buf[256];
+
     /* Read the length */
     unsigned Len = ReadVar (F);
 
-    /* Allocate memory and read the string itself */
-    char* S = xmalloc (Len + 1);
-    ReadData (F, S, Len);
+    /* If the string is short enough, use our buffer on the stack, otherwise
+     * allocate space on the heap.
+     */
+    if (Len < sizeof (Buf)) {
+        B = Buf;
+    } else {
+        B = xmalloc (Len + 1);
+    }
+
+    /* Read the string */
+    ReadData (F, B, Len);
+
+    /* Terminate the string */
+    B[Len] = '\0';
 
-    /* Terminate the string and return it */
-    S [Len] = '\0';
-    return S;
+    /* Insert it into the string pool and remember the id */
+    Id = GetStringId (B);
+
+    /* If we had allocated memory before, free it now */
+    if (B != Buf) {
+        xfree (B);
+    }
+
+    /* Return the string id */
+    return Id;
 }
 
 
@@ -284,7 +309,7 @@ FilePos* ReadFilePos (FILE* F, FilePos* Pos)
 
 void* ReadData (FILE* F, void* Data, unsigned Size)
 /* Read data from the file */
-{     
+{
     /* Explicitly allow reading zero bytes */
     if (Size > 0) {
        if (fread (Data, 1, Size, F) != Size) {
index 3da7e86a3f224e4728544fd9e366b434e6a36640..b8dd2b1ecc805ccad3a32498b6a1065e770ce868 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2000 Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
+/* (C) 1998-2003 Ullrich von Bassewitz                                       */
+/*               Römerstrasse 52                                             */
+/*               D-70794 Filderstadt                                         */
+/* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -96,8 +96,10 @@ long Read32Signed (FILE* F);
 unsigned long ReadVar (FILE* F);
 /* Read a variable size value from the file */
 
-char* ReadStr (FILE* F);
-/* Read a string from the file into a malloced area */
+unsigned ReadStr (FILE* F);
+/* Read a string from the file, place it into the global string pool, and
+ * return its string id.
+ */
 
 FilePos* ReadFilePos (FILE* F, FilePos* Pos);
 /* Read a file position from the file */
index 65f10bed0f86b6d3a6c042888405a019916a78bd..3f543b33d17f64212248d443b19cd3427368076d 100644 (file)
 
 /* ld65 */
 #include "error.h"
-#include "expr.h"
 #include "fragment.h"
-#include "fileio.h"
 #include "segments.h"
-#include "spool.h"
 
 
 
 
 
 
-static FragCheck* NewFragCheck (unsigned Action)
-/* Allocate a new FragCheck struct and return it */
-{
-    /* Allocate memory */
-    FragCheck* FC = xmalloc (sizeof (FragCheck));
-
-    /* Initialize the fields */
-    FC->Next    = 0;
-    FC->Expr    = 0;
-    FC->Action  = Action;
-    FC->Message = INVALID_STRING_ID;
-
-    /* Return the new struct */
-    return FC;
-}
-
-
-
-FragCheck* ReadFragCheck (FILE* F, Fragment* Frag)
-/* Read a fragment check expression from the given file */
-{
-    /* Get the object file pointer from the fragment */
-    ObjData* O = Frag->Obj;
-
-    /* Read the action and create a new struct */
-    FragCheck* FC = NewFragCheck (ReadVar (F));
-
-    /* Determine the remaining data from the action */
-    switch (FC->Action) {
-
-        case FRAG_ACT_WARN:
-        case FRAG_ACT_ERROR:
-            FC->Expr = ReadExpr (F, O);
-            FC->Message = MakeGlobalStringId (O, ReadVar (F));
-            break;
-
-        default:
-            Internal ("In module `%s', file `%s', line %lu: Invalid fragment "
-                      "check action: %u",
-                      GetObjFileName (O),
-                      GetSourceFileName (O, Frag->Pos.Name),
-                      Frag->Pos.Line, FC->Action);
-    }
-
-    /* Return the new fragment check */
-    return FC;
-}
-
-
-
 Fragment* NewFragment (unsigned char Type, unsigned Size, Section* S)
 /* Create a new fragment and insert it into the section S */
 {
@@ -126,7 +73,6 @@ Fragment* NewFragment (unsigned char Type, unsigned Size, Section* S)
     F->Expr      = 0;
     InitFilePos (&F->Pos);
     F->LI        = 0;
-    F->Check     = 0;
     F->Type      = Type;
 
     /* Insert the code fragment into the section */
index 342f5696c695c60688f4b3f37b2fcc30ff7b58e9..d6a6233cb256acef899d6c6c4a5e604301d36102 100644 (file)
@@ -61,15 +61,6 @@ struct Section;
 
 
 
-/* Fragment check expression */
-typedef struct FragCheck FragCheck;
-struct FragCheck {
-    struct FragCheck*   Next;           /* Next check expression */
-    struct ExprNode*    Expr;           /* The expression itself */
-    unsigned            Action;         /* Action to take if the check fails */
-    unsigned            Message;        /* Message number */
-};
-
 /* Fragment structure */
 typedef struct Fragment Fragment;
 struct Fragment {
@@ -79,7 +70,6 @@ struct Fragment {
     struct ExprNode*   Expr;           /* Expression if FRAG_EXPR */
     FilePos            Pos;            /* File position in source */
     struct LineInfo*    LI;             /* Additional line info */
-    FragCheck*          Check;          /* Single linked list of checks */
     unsigned char      Type;           /* Type of fragment */
     unsigned char              LitBuf [1];     /* Dynamically alloc'ed literal buffer */
 };
@@ -92,9 +82,6 @@ struct Fragment {
 
 
 
-FragCheck* ReadFragCheck (FILE* F, Fragment* Frag);
-/* Read a fragment check expression from the given file */
-
 Fragment* NewFragment (unsigned char Type, unsigned Size, struct Section* S);
 /* Create a new fragment and insert it into the section S */
 
index 327c142d98da824c65a44aed0c8d5f4b29691f52..98ff05e0bfd47721a150a689e73c398b26e7a028 100644 (file)
@@ -118,13 +118,11 @@ static ObjData* ReadIndexEntry (void)
     ObjData* O = NewObjData ();
 
     /* Module name */
-    char* Name = ReadStr (Lib);
-    O->Name = GetStringId (Name);
-    xfree (Name);
+    O->Name = ReadStr (Lib);
 
     /* Module flags/MTime/Start/Size */
     O->Flags   = Read16 (Lib);
-    O->MTime    = Read32 (Lib);      
+    O->MTime    = Read32 (Lib);
     O->Start   = Read32 (Lib);
     Read32 (Lib);                      /* Skip Size */
 
index 46c3c7a6a933548772610fcb591adffbb7b09bc4..92374f9742bc4201a604958630c31236d9a5f999 100644 (file)
@@ -7,8 +7,8 @@
 /*                                                                           */
 /*                                                                           */
 /* (C) 2001      Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
+/*               Römerstrasse 52                                             */
+/*               D-70794 Filderstadt                                         */
 /* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
@@ -151,7 +151,7 @@ static void AddCodeRange (LineInfo* LI, unsigned long Offs, unsigned long Size)
 
 
 
-void RelocLineInfo (struct Segment* S)
+void RelocLineInfo (Segment* S)
 /* Relocate the line info for a segment. */
 {
     unsigned long Offs = 0;
index 5b2a3a9831d8293640305d606d9646192e791ce1..6d02504af49a813b2ce902d3a15b62e20eb1468b 100644 (file)
@@ -7,8 +7,8 @@
 /*                                                                           */
 /*                                                                           */
 /* (C) 2001      Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
+/*               Römerstrasse 52                                             */
+/*               D-70794 Filderstadt                                         */
 /* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
index 6da81965c01d83f7691f976514534e27a09b0f4b..c962c5164cb047a8c7c16899d32f96d1fab9551c 100644 (file)
@@ -110,7 +110,7 @@ void FreeObjData (ObjData* O)
         FreeImport (O->Imports[--O->ImportCount]);
     }
     xfree (O->Imports);
-    FreeObjStrings (O);
+    xfree (O->Strings);
     xfree (O);
 }
 
@@ -121,9 +121,6 @@ void FreeObjStrings (ObjData* O)
  * when all strings are converted to global strings.
  */
 {
-    while (O->StringCount) {
-        xfree (O->Strings[--O->StringCount]);
-    }
     xfree (O->Strings);
     O->Strings = 0;
 }
@@ -138,20 +135,6 @@ void InsertObjData (ObjData* O)
 
 
 
-const char* GetObjString (const ObjData* O, unsigned Index)
-/* Get a string from the object file string table. Abort if the string index
- * is invalid.
- */
-{
-    if (Index >= O->StringCount) {
-               Error ("Invalid string index (%u) in module `%s'",
-              Index, GetObjFileName (O));
-    }
-    return O->Strings[Index];
-}
-
-
-
 unsigned MakeGlobalStringId (const ObjData* O, unsigned Index)
 /* Convert a local string id into a global one and return it. */
 {
@@ -159,7 +142,7 @@ unsigned MakeGlobalStringId (const ObjData* O, unsigned Index)
                Error ("Invalid string index (%u) in module `%s'",
               Index, GetObjFileName (O));
     }
-    return GetStringId (O->Strings[Index]);
+    return O->Strings[Index];
 }
 
 
index 0174b733d7c3ba699b711c1ffb5a0a64fc1174ce..d1e5414a62d065b4f6982eae036c1d27aa8dfd24 100644 (file)
@@ -76,7 +76,7 @@ struct ObjData {
     unsigned            LineInfoCount;  /* Count of additional line infos */
     struct LineInfo**   LineInfos;      /* List of additional line infos */
     unsigned            StringCount;    /* Count of strings */
-    char**              Strings;        /* List of strings used */
+    unsigned*           Strings;        /* List of global string indices */
 };
 
 
@@ -109,11 +109,6 @@ void FreeObjStrings (ObjData* O);
 void InsertObjData (ObjData* O);
 /* Insert the ObjData object into the collection of used ObjData objects. */
 
-const char* GetObjString (const ObjData* O, unsigned Index);
-/* Get a string from the object file string table. Abort if the string index
- * is invalid.
- */
-
 unsigned MakeGlobalStringId (const ObjData* O, unsigned Index);
 /* Convert a local string id into a global one and return it. */
 
index 7404b2cacb7fc296e6cdeda12724462efec079d1..313977973fdfc0b67b9efa68b94dca17ab7a309f 100644 (file)
@@ -111,7 +111,7 @@ void ObjReadFiles (FILE* F, ObjData* O)
     unsigned I;
 
     O->FileCount  = ReadVar (F);
-    O->Files      = xmalloc (O->FileCount * sizeof (FileInfo*));
+    O->Files      = xmalloc (O->FileCount * sizeof (O->Files[0]));
     for (I = 0; I < O->FileCount; ++I) {
                O->Files[I] = ReadFileInfo (F, O);
     }
@@ -125,7 +125,7 @@ void ObjReadImports (FILE* F, ObjData* O)
     unsigned I;
 
     O->ImportCount = ReadVar (F);
-    O->Imports     = xmalloc (O->ImportCount * sizeof (Import*));
+    O->Imports     = xmalloc (O->ImportCount * sizeof (O->Imports[0]));
     for (I = 0; I < O->ImportCount; ++I) {
        O->Imports [I] = ReadImport (F, O);
        InsertImport (O->Imports [I]);
@@ -140,7 +140,7 @@ void ObjReadExports (FILE* F, ObjData* O)
     unsigned I;
 
     O->ExportCount = ReadVar (F);
-    O->Exports     = xmalloc (O->ExportCount * sizeof (Export*));
+    O->Exports     = xmalloc (O->ExportCount * sizeof (O->Exports[0]));
     for (I = 0; I < O->ExportCount; ++I) {
        O->Exports [I] = ReadExport (F, O);
        InsertExport (O->Exports [I]);
@@ -155,7 +155,7 @@ void ObjReadDbgSyms (FILE* F, ObjData* O)
     unsigned I;
 
     O->DbgSymCount = ReadVar (F);
-    O->DbgSyms    = xmalloc (O->DbgSymCount * sizeof (DbgSym*));
+    O->DbgSyms    = xmalloc (O->DbgSymCount * sizeof (O->DbgSyms[0]));
     for (I = 0; I < O->DbgSymCount; ++I) {
        O->DbgSyms [I] = ReadDbgSym (F, O);
     }
@@ -169,7 +169,7 @@ void ObjReadLineInfos (FILE* F, ObjData* O)
     unsigned I;
 
     O->LineInfoCount = ReadVar (F);
-    O->LineInfos     = xmalloc (O->LineInfoCount * sizeof (LineInfo*));
+    O->LineInfos     = xmalloc (O->LineInfoCount * sizeof (O->LineInfos[0]));
     for (I = 0; I < O->LineInfoCount; ++I) {
                O->LineInfos[I] = ReadLineInfo (F, O);
     }
@@ -181,8 +181,9 @@ void ObjReadStrPool (FILE* F, ObjData* O)
 /* Read the string pool from a file at the current position */
 {
     unsigned I;
+
     O->StringCount = ReadVar (F);
-    O->Strings     = xmalloc (O->StringCount * sizeof (char*));
+    O->Strings     = xmalloc (O->StringCount * sizeof (O->Strings[0]));
     for (I = 0; I < O->StringCount; ++I) {
         O->Strings[I] = ReadStr (F);
     }
@@ -196,7 +197,7 @@ void ObjReadSections (FILE* F, ObjData* O)
     unsigned I;
 
     O->SectionCount = ReadVar (F);
-    O->Sections     = xmalloc (O->SectionCount * sizeof (Section*));
+    O->Sections     = xmalloc (O->SectionCount * sizeof (O->Sections[0]));
     for (I = 0; I < O->SectionCount; ++I) {
        O->Sections [I] = ReadSection (F, O);
     }
index 2c887829bbd365afe03f0f70e0e567adcb82b494..c685ac48eecd6b91bb7b968e7161c33faecd2ca5 100644 (file)
@@ -238,7 +238,6 @@ Section* ReadSection (FILE* F, ObjData* O)
        unsigned char Type = Read8 (F);
 
         /* Extract the check mask from the type */
-        unsigned char Check = Type & FRAG_CHECKMASK;
         unsigned char Bytes = Type & FRAG_BYTEMASK;
         Type &= FRAG_TYPEMASK;
 
@@ -268,18 +267,6 @@ Section* ReadSection (FILE* F, ObjData* O)
                return 0;
                }
 
-        /* A list of check expressions may follow */
-        if (Check) {
-
-            /* Read the number of expressions that follow */
-            unsigned Count = ReadVar (F);
-
-            /* Read the expressions */
-            while (Count--) {
-                /* ### */
-            }
-        }
-
        /* Read the file position of the fragment */
        ReadFilePos (F, &Frag->Pos);