2003-11-01 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Sat, 1 Nov 2003 18:10:07 +0000 (18:10 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sat, 1 Nov 2003 18:10:07 +0000 (18:10 -0000)
* main.c: Add disassembly of module, moduleref and file tables.

* get.h get.c: Add support for modulerefs.

* dump.c: Avoid crash on empty assembly table.

svn path=/trunk/mono/; revision=19523

mono/dis/ChangeLog
mono/dis/dump.c
mono/dis/get.c
mono/dis/get.h
mono/dis/main.c

index 46493eb2d1a391e01608a99db1960b7a9b499895..6b23ebfed38a0ddea40e3141890e73f8003390f3 100644 (file)
@@ -1,3 +1,11 @@
+2003-11-01  Zoltan Varga  <vargaz@freemail.hu>
+
+       * main.c: Add disassembly of module, moduleref and file tables.
+
+       * get.h get.c: Add support for modulerefs.
+
+       * dump.c: Avoid crash on empty assembly table.
+
 2003-10-22 Jackson Harper <jackson@ximian.com>
 
        * main.c: Use escaped names for method, and type names. Initialize
index 16d3e3b30818e63d8d82175f9a03310721cc106f..1cf772da3a07374ac414f0e797a76c1feafd63e3 100644 (file)
@@ -25,9 +25,13 @@ dump_table_assembly (MonoImage *m)
        const char *ptr;
        int len;
 
-       mono_metadata_decode_row (t, 0, cols, MONO_ASSEMBLY_SIZE);
        fprintf (output, "Assembly Table\n");
 
+       if (!t->rows)
+               return;
+
+       mono_metadata_decode_row (t, 0, cols, MONO_ASSEMBLY_SIZE);
+
        fprintf (output, "Name:          %s\n", mono_metadata_string_heap (m, cols [MONO_ASSEMBLY_NAME]));
        fprintf (output, "Hash Algoritm: 0x%08x\n", cols [MONO_ASSEMBLY_HASH_ALG]);
        fprintf (output, "Version:       %d.%d.%d.%d\n", cols [MONO_ASSEMBLY_MAJOR_VERSION], 
@@ -511,8 +515,7 @@ dump_table_module (MonoImage *m)
                name = mono_metadata_string_heap (m, cols [MONO_MODULE_NAME]);
                guid = get_guid (m, cols [MONO_MODULE_MVID]);
                fprintf (output, "%d: %s %d %s\n", i + 1, name, cols [MONO_MODULE_MVID], guid);
-       }
-       
+       }       
 }
 
 void
index e1a834ec9425a4dd5694c69b968dffd21d37cf91..a20c039b28735084af69e55f4945ab1c32a3bec5 100644 (file)
@@ -71,6 +71,16 @@ get_module (MonoImage *m, int idx)
        return g_strdup (mono_metadata_string_heap (m, cols [MONO_MODULE_NAME]));
 }
 
+char *
+get_moduleref (MonoImage *m, int idx)
+{
+       guint32 cols [MONO_MODULEREF_SIZE];
+       
+       mono_metadata_decode_row (&m->tables [MONO_TABLE_MODULEREF], idx - 1, cols, MONO_MODULEREF_SIZE);
+
+       return g_strdup (mono_metadata_string_heap (m, cols [MONO_MODULEREF_NAME]));
+}
+
 char *
 get_assemblyref (MonoImage *m, int idx)
 {
@@ -258,7 +268,8 @@ get_typeref (MonoImage *m, int idx)
                break;
 
        case RESOLTION_SCOPE_MODULEREF: /* ModuleRef */
-               ret = g_strdup_printf ("TODO:TypeRef-ModuleRef (%s.%s)", s, t);
+               x = get_moduleref (m, rs_idx);
+               ret = g_strdup_printf ("[.module %s]%s%s%s", x, s, *s ? "." : "", t);
                break;
                              
        case RESOLTION_SCOPE_ASSEMBLYREF: /*
index 60e41e5c805656dec04d5238c3902bcf70b65a5a..c73dbb45bfc40c1c5df170da0d851bfc7829ad61 100644 (file)
@@ -4,6 +4,7 @@
  */
 char *get_typedef             (MonoImage *m, int idx);
 char *get_module              (MonoImage *m, int idx);
+char *get_moduleref           (MonoImage *m, int idx);
 char *get_assemblyref         (MonoImage *m, int idx);
 char *get_typeref             (MonoImage *m, int idx);
 char *get_typedef_or_ref      (MonoImage *m, guint32 dor_token);
index 2e02daa03553bd6b0219bc7ef07279f69fcbee90..2458fea3fb65f3fe041f1b9af956e3859616b9cc 100644 (file)
@@ -117,6 +117,76 @@ dis_directive_assemblyref (MonoImage *m)
        }
 }
 
+static void
+dis_directive_module (MonoImage *m)
+{
+       MonoTableInfo *t = &m->tables [MONO_TABLE_MODULE];
+       int i;
+
+       for (i = 0; i < t->rows; i++){
+               guint32 cols [MONO_MODULE_SIZE];
+               const char *name;
+               char *guid;
+               
+               mono_metadata_decode_row (t, i, cols, MONO_MODULE_SIZE);
+
+               name = mono_metadata_string_heap (m, cols [MONO_MODULE_NAME]);
+               guid = get_guid (m, cols [MONO_MODULE_MVID]);
+               fprintf (output, ".module %s // GUID = %s\n", name, guid);
+       }
+}
+
+static void
+dis_directive_moduleref (MonoImage *m)
+{
+       MonoTableInfo *t = &m->tables [MONO_TABLE_MODULEREF];
+       int i;
+
+       for (i = 0; i < t->rows; i++){
+               guint32 cols [MONO_MODULEREF_SIZE];
+               const char *name;
+               
+               mono_metadata_decode_row (t, i, cols, MONO_MODULEREF_SIZE);
+
+               name = mono_metadata_string_heap (m, cols [MONO_MODULEREF_NAME]);
+               fprintf (output, ".module extern %s\n", name);
+       }
+       
+}
+
+static void
+dis_directive_file (MonoImage *m)
+{
+       MonoTableInfo *t = &m->tables [MONO_TABLE_FILE];
+       int i, j, len;
+       guint32 entry_point;
+
+       entry_point = mono_image_get_entry_point (m);
+
+       for (i = 0; i < t->rows; i++){
+               guint32 cols [MONO_FILE_SIZE];
+               const char *name, *hash;
+               guint32 token;
+
+               mono_metadata_decode_row (t, i, cols, MONO_FILE_SIZE);
+
+               name = mono_metadata_string_heap (m, cols [MONO_FILE_NAME]);
+
+               hash = mono_metadata_blob_heap (m, cols [MONO_FILE_HASH_VALUE]);
+               len = mono_metadata_decode_blob_size (hash, &hash);
+
+               fprintf (output, ".file %s%s .hash = (", name,
+                               cols [MONO_FILE_FLAGS] & FILE_CONTAINS_NO_METADATA ? " nometadata" : "");
+
+               for (j = 0; j < len; ++j)
+                       fprintf (output, " %02X", hash [j] & 0xff);
+
+               token = mono_metadata_make_token (MONO_TABLE_FILE, i + 1);
+               fprintf (output, " )%s\n", (token == entry_point) ? " .entrypoint" : "");
+       }
+       
+}
+
 static map_t visibility_map [] = {
        { TYPE_ATTRIBUTE_NOT_PUBLIC,           "private " },
        { TYPE_ATTRIBUTE_PUBLIC,               "public " },
@@ -1095,6 +1165,9 @@ disassemble_file (const char *file)
                
                dis_directive_assemblyref (img);
                dis_directive_assembly (img);
+               dis_directive_file (img);
+               dis_directive_module (img);
+               dis_directive_moduleref (img);
                dis_types (img);
                dis_data (img);
        }