]> git.sur5r.net Git - cc65/blobdiff - src/od65/dump.c
Rather stay with OFF_YEAR as it is an "officially" name.
[cc65] / src / od65 / dump.c
index d812358c4f94eded8ddf60319796888824c67af7..b15dac59f7187fefa76c74dc80b933eab2313340 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2002-2011, Ullrich von Bassewitz                                      */
+/* (C) 2002-2012, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
 #include "coll.h"
 #include "exprdefs.h"
 #include "filepos.h"
+#include "lidefs.h"
 #include "objdefs.h"
 #include "optdefs.h"
-#include "segdefs.h"
+#include "scopedefs.h"
 #include "symdefs.h"
 #include "xmalloc.h"
 
@@ -134,6 +135,20 @@ static void SkipLineInfoList (FILE* F)
 
 
 
+static void SkipSpanList (FILE* F)
+/* Skip a span list from the given file */
+{
+    /* Count preceeds the list */
+    unsigned long Count = ReadVar (F);
+
+    /* Skip indices */
+    while (Count--) {
+        (void) ReadVar (F);
+    }
+}
+
+
+
 static void SkipExpr (FILE* F)
 /* Skip an expression from the given file */
 {
@@ -157,8 +172,9 @@ static void SkipExpr (FILE* F)
                break;
 
            case EXPR_SECTION:
+            case EXPR_BANK:
                /* Read the segment number */
-               (void) Read8 (F);
+               (void) ReadVar (F);
                break;
 
            default:
@@ -205,19 +221,25 @@ static const char* GetExportFlags (unsigned Flags, const unsigned char* ConDes)
                case SYM_EXPR:  strcat (TypeDesc, ",SYM_EXPR");   break;
     }
 
+    /* Size available? */
+    if (SYM_HAS_SIZE (Flags)) {
+        strcat (TypeDesc, ",SYM_SIZE");
+    }
+
+
     /* Constructor/destructor declarations */
     T = TypeDesc + strlen (TypeDesc);
     Count = SYM_GET_CONDES_COUNT (Flags);
     if (Count > 0 && ConDes) {
-       T += sprintf (T, ",SYM_CONDES=");
-       for (I = 0; I < Count; ++I) {
-           unsigned Type = CD_GET_TYPE (ConDes[I]);
-           unsigned Prio = CD_GET_PRIO (ConDes[I]);
-           if (I > 0) {
-               *T++ = ',';
-           }
+       T += sprintf (T, ",SYM_CONDES=");
+       for (I = 0; I < Count; ++I) {
+           unsigned Type = CD_GET_TYPE (ConDes[I]);
+           unsigned Prio = CD_GET_PRIO (ConDes[I]);
+           if (I > 0) {
+               *T++ = ',';
+           }
                    T += sprintf (T, "[%u,%u]", Type, Prio);
-       }
+       }
     }
 
     /* Return the result */
@@ -226,6 +248,22 @@ static const char* GetExportFlags (unsigned Flags, const unsigned char* ConDes)
 
 
 
+static const char* GetScopeType (unsigned Type)
+/* Return the name of a scope type */
+{
+    switch (Type) {
+        case SCOPE_GLOBAL:      return "Global scope";
+        case SCOPE_FILE:        return "File scope";
+        case SCOPE_SCOPE:       return ".SCOPE or .PROC";
+        case SCOPE_STRUCT:      return ".STRUCT";
+        case SCOPE_ENUM:        return ".ENUM";
+        case SCOPE_UNDEF:       return "Undefined";
+        default:                return "Unknown scope type";
+    }
+}
+
+
+
 void DumpObjHeader (FILE* F, unsigned long Offset)
 /* Dump the header of the given object file */
 {
@@ -278,6 +316,12 @@ void DumpObjHeader (FILE* F, unsigned long Offset)
 
     /* String pool */
     DumpObjHeaderSection ("String pool", H.StrPoolOffs, H.StrPoolSize);
+
+    /* Assertions */
+    DumpObjHeaderSection ("Assertions", H.AssertOffs, H.AssertSize);
+
+    /* Scopes */
+    DumpObjHeaderSection ("Scopes", H.ScopeOffs, H.ScopeSize);
 }
 
 
@@ -348,7 +392,7 @@ void DumpObjOptions (FILE* F, unsigned long Offset)
 
            case OPT_ARGNUM:
                printf ("      Data:%26lu", Val);
-               if (Type == OPT_DATETIME) {
+               if (Type == OPT_DATETIME) {
                    /* Print the time as a string */
                    printf ("  (%s)", TimeToStr (Val));
                }
@@ -454,8 +498,9 @@ void DumpObjSegments (FILE* F, unsigned long Offset)
         unsigned long NextSeg   = ftell (F) + DataSize;
                const char*   Name      = GetString (&StrPool, ReadVar (F));
        unsigned      Len       = strlen (Name);
-       unsigned long Size      = Read32 (F);
-       unsigned      Align     = (1U << Read8 (F));
+        unsigned      Flags     = ReadVar (F);
+       unsigned long Size      = ReadVar (F);
+               unsigned long Align     = ReadVar (F);
                unsigned char AddrSize  = Read8 (F);
         unsigned long FragCount = ReadVar (F);
 
@@ -464,8 +509,9 @@ void DumpObjSegments (FILE* F, unsigned long Offset)
 
        /* Print the data */
        printf ("      Name:%*s\"%s\"\n", (int)(24-Len), "", Name);
+        printf ("      Flags:%25u\n", Flags);
                printf ("      Size:%26lu\n", Size);
-       printf ("      Alignment:%21u\n", Align);
+       printf ("      Alignment:%21lu\n", Align);
        printf ("      Address size:%14s0x%02X  (%s)\n", "", AddrSize,
                 AddrSizeToStr (AddrSize));
                printf ("      Fragment count:%16lu\n", FragCount);
@@ -514,7 +560,8 @@ void DumpObjImports (FILE* F, unsigned long Offset)
                const char*   Name     = GetString (&StrPool, ReadVar (F));
        unsigned      Len      = strlen (Name);
 
-        /* Skip the line infos */
+        /* Skip both line info lists */
+        SkipLineInfoList (F);
         SkipLineInfoList (F);
 
        /* Print the header */
@@ -562,8 +609,8 @@ void DumpObjExports (FILE* F, unsigned long Offset)
     for (I = 0; I < Count; ++I) {
 
        unsigned long   Value = 0;
-       int             HaveValue;
-       unsigned char   ConDes [CD_TYPE_COUNT];
+        unsigned long   Size = 0;
+               unsigned char   ConDes[CD_TYPE_COUNT];
                const char*     Name;
        unsigned        Len;
 
@@ -574,15 +621,17 @@ void DumpObjExports (FILE* F, unsigned long Offset)
        ReadData (F, ConDes, SYM_GET_CONDES_COUNT (Type));
                Name  = GetString (&StrPool, ReadVar (F));
        Len   = strlen (Name);
-               if (SYM_IS_EXPR (Type)) {
-           SkipExpr (F);
-           HaveValue = 0;
-       } else {
+               if (SYM_IS_CONST (Type)) {
            Value = Read32 (F);
-           HaveValue = 1;
+       } else {
+                   SkipExpr (F);
        }
+        if (SYM_HAS_SIZE (Type)) {
+            Size = ReadVar (F);
+        }
 
-        /* Skip the line infos */
+        /* Skip both line infos lists */
+        SkipLineInfoList (F);
         SkipLineInfoList (F);
 
        /* Print the header */
@@ -593,8 +642,11 @@ void DumpObjExports (FILE* F, unsigned long Offset)
        printf ("      Address size:%14s0x%02X  (%s)\n", "", AddrSize,
                 AddrSizeToStr (AddrSize));
        printf ("      Name:%*s\"%s\"\n", (int)(24-Len), "", Name);
-       if (HaveValue) {
-           printf ("      Value:%15s0x%08lX  (%lu)\n", "", Value, Value);
+       if (SYM_IS_CONST (Type)) {
+           printf ("      Value:%15s0x%08lX  (%lu)\n", "", Value, Value);
+       }
+               if (SYM_HAS_SIZE (Type)) {
+           printf ("      Size:%16s0x%04lX  (%lu)\n", "", Size, Size);
        }
     }
 
@@ -640,23 +692,34 @@ void DumpObjDbgSyms (FILE* F, unsigned long Offset)
     /* Read and print all debug symbols */
     for (I = 0; I < Count; ++I) {
 
-       unsigned long   Value = 0;
-       int             HaveValue;
+       unsigned long   Value = 0;
+        unsigned long   Size = 0;
+        unsigned        ImportId = 0;
+        unsigned        ExportId = 0;
 
                /* Read the data for one symbol */
                unsigned Type          = ReadVar (F);
         unsigned char AddrSize = Read8 (F);
+        unsigned long Owner    = ReadVar (F);
                const char*   Name     = GetString (&StrPool, ReadVar (F));
        unsigned      Len      = strlen (Name);
-       if (SYM_IS_EXPR (Type)) {
-           SkipExpr (F);
-           HaveValue = 0;
-       } else {
+       if (SYM_IS_CONST (Type)) {
            Value = Read32 (F);
-           HaveValue = 1;
+       } else {
+           SkipExpr (F);
        }
-
-        /* Skip the line infos */
+        if (SYM_HAS_SIZE (Type)) {
+            Size = ReadVar (F);
+        }
+        if (SYM_IS_IMPORT (Type)) {
+            ImportId = ReadVar (F);
+        }
+        if (SYM_IS_EXPORT (Type)) {
+            ExportId = ReadVar (F);
+        }
+
+        /* Skip both line info lists */
+        SkipLineInfoList (F);
         SkipLineInfoList (F);
 
        /* Print the header */
@@ -666,10 +729,20 @@ void DumpObjDbgSyms (FILE* F, unsigned long Offset)
                printf ("      Type:%22s0x%02X  (%s)\n", "", Type, GetExportFlags (Type, 0));
        printf ("      Address size:%14s0x%02X  (%s)\n", "", AddrSize,
                 AddrSizeToStr (AddrSize));
+               printf ("      Owner:%25lu\n", Owner);
        printf ("      Name:%*s\"%s\"\n", (int)(24-Len), "", Name);
-       if (HaveValue) {
+       if (SYM_IS_CONST (Type)) {
            printf ("      Value:%15s0x%08lX  (%lu)\n", "", Value, Value);
        }
+               if (SYM_HAS_SIZE (Type)) {
+           printf ("      Size:%20s0x%04lX  (%lu)\n", "", Size, Size);
+       }
+               if (SYM_IS_IMPORT (Type)) {
+           printf ("      Import:%24u\n", ImportId);
+       }
+               if (SYM_IS_EXPORT (Type)) {
+           printf ("      Export:%24u\n", ExportId);
+       }
     }
 
     /* Destroy the string pool */
@@ -714,15 +787,25 @@ void DumpObjLineInfo (FILE* F, unsigned long Offset)
     /* Read and print all line infos */
     for (I = 0; I < Count; ++I) {
 
-               /* Read one line info */
        FilePos   Pos;
+        unsigned  Type;
+
+               /* File position of line info */
        ReadFilePos (F, &Pos);
 
+        /* Type of line info */
+        Type = ReadVar (F);
+
+        /* Skip the spans */
+        SkipSpanList (F);
+
        /* Print the header */
        printf ("    Index:%27u\n", I);
 
        /* Print the data */
-               printf ("      Line:%26lu\n", Pos.Line);
+        printf ("      Type:%26u\n", LI_GET_TYPE (Type));
+        printf ("      Count:%25u\n", LI_GET_COUNT (Type));
+               printf ("      Line:%26u\n", Pos.Line);
                printf ("      Col:%27u\n", Pos.Col);
                printf ("      Name:%26u\n", Pos.Name);
     }
@@ -733,6 +816,87 @@ void DumpObjLineInfo (FILE* F, unsigned long Offset)
 
 
 
+void DumpObjScopes (FILE* F, unsigned long Offset)
+/* Dump the scopes from an object file */
+{
+    ObjHeader   H;
+    Collection  StrPool = AUTO_COLLECTION_INITIALIZER;
+    unsigned    Count;
+    unsigned    I;
+
+    /* Seek to the header position and read the header */
+    FileSetPos (F, Offset);
+    ReadObjHeader (F, &H);
+
+    /* Seek to the start of the string pool and read it */
+    FileSetPos (F, Offset + H.StrPoolOffs);
+    ReadStrPool (F, &StrPool);
+
+    /* Seek to the start of scopes */
+    FileSetPos (F, Offset + H.ScopeOffs);
+
+    /* Output a header */
+    printf ("  Scopes:\n");
+
+    /* Check if the object file was compiled with debug info */
+    if ((H.Flags & OBJ_FLAGS_DBGINFO) == 0) {
+       /* Print that there no scopes and bail out */
+       printf ("    Count:%27u\n", 0);
+       return;
+    }
+
+    /* Read the number of scopes and print it */
+    Count = ReadVar (F);
+    printf ("    Count:%27u\n", Count);
+
+    /* Read and print all scopes */
+    for (I = 0; I < Count; ++I) {
+
+        const char*     Name;
+        unsigned        Len;
+
+        /* Read the data */
+        unsigned        ParentId = ReadVar (F);
+        unsigned        LexicalLevel = ReadVar (F);
+        unsigned        Flags = ReadVar (F);
+        const char*     ScopeType = GetScopeType (ReadVar (F));
+
+       /* Print the header */
+       printf ("    Index:%27u\n", I);
+
+               /* Print the data */
+        printf ("      Parent id:%21u\n",       ParentId);
+        printf ("      Lexical level:%17u\n",   LexicalLevel);
+               printf ("      Flags:%21s0x%02X\n",     "", Flags);
+        printf ("      Type:%26s\n",            ScopeType);
+
+        /* Resolve and print the name */
+               Name = GetString (&StrPool, ReadVar (F));
+       Len  = strlen (Name);
+       printf ("      Name:%*s\"%s\"\n", (int)(24-Len), "", Name);
+
+        /* Size */
+               if (SCOPE_HAS_SIZE (Flags)) {
+            unsigned long Size = ReadVar (F);
+           printf ("      Size:%20s0x%04lX  (%lu)\n", "", Size, Size);
+       }
+
+        /* Label */
+        if (SCOPE_HAS_LABEL (Flags)) {
+            unsigned LabelId = ReadVar (F);
+            printf ("      Label id:%22u\n", LabelId);
+        }
+
+        /* Skip the spans */
+        SkipSpanList (F);
+    }
+
+    /* Destroy the string pool */
+    DestroyStrPool (&StrPool);
+}
+
+
+
 void DumpObjSegSize (FILE* F, unsigned long Offset)
 /* Dump the sizes of the segment in the object file */
 {
@@ -765,10 +929,10 @@ void DumpObjSegSize (FILE* F, unsigned long Offset)
         unsigned long NextSeg  = ftell (F) + DataSize;
        const char*   Name     = GetString (&StrPool, ReadVar (F));
        unsigned      Len      = strlen (Name);
-       unsigned long Size     = Read32 (F);
+       unsigned long Size     = ReadVar (F);
 
         /* Skip alignment, type and fragment count */
-        (void) Read8 (F);
+        (void) ReadVar (F);
         (void) Read8 (F);
         (void) ReadVar (F);
 
@@ -785,3 +949,4 @@ void DumpObjSegSize (FILE* F, unsigned long Offset)
 
 
 
+