Fri Feb 8 12:26:37 CET 2002 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Fri, 8 Feb 2002 07:37:22 +0000 (07:37 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Fri, 8 Feb 2002 07:37:22 +0000 (07:37 -0000)
* opcodes.c, opcodes.h: export interesting info about opcodes.

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

mono/metadata/ChangeLog
mono/metadata/Makefile.am
mono/metadata/opcodes.c [new file with mode: 0644]
mono/metadata/opcodes.h [new file with mode: 0644]
mono/metadata/verify.c

index 16e937552a478f655581c68b4a4e2d81edf5b8a0..8fa62f3d3095a2791b8765e7c3581ff5015219a1 100644 (file)
@@ -1,3 +1,8 @@
+
+Fri Feb 8 12:26:37 CET 2002 Paolo Molaro <lupus@ximian.com>
+
+       * opcodes.c, opcodes.h: export interesting info about opcodes.
+
 2002-02-05  Dietmar Maurer  <dietmar@ximian.com>
 
        * object.h (MONO_CHECK_ARG, MONO_CHECK_ARG_NULL): new macro for
index f2b1aaefd8643fdbc36cfe498325ce7a0be18de2..f15c286d7229925b42431fdbd8b011e3ce8c5828 100644 (file)
@@ -12,6 +12,7 @@ INCLUDES = $(GLIB_CFLAGS) $(GMODULE_CFLAGS) -I$(top_srcdir)   \
 
 libmetadata_a_SOURCES = \
        assembly.c      \
+       opcodes.c       \
        image.c         \
        metadata.c      \
        verify.c        \
@@ -43,6 +44,7 @@ libmetadataincludedir = $(includedir)/mono/metadata
 
 libmetadatainclude_HEADERS = \
        assembly.h      \
+       opcodes.h       \
        blob.h          \
        cil-coff.h      \
        mono-endian.h   \
diff --git a/mono/metadata/opcodes.c b/mono/metadata/opcodes.c
new file mode 100644 (file)
index 0000000..d4ca901
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * opcodes.c: CIL instruction information
+ *
+ * Author:
+ *   Paolo Molaro (lupus@ximian.com)
+ *
+ * (C) 2002 Ximian, Inc.
+ */
+#include <mono/metadata/opcodes.h>
+
+#define OPDEF(a,b,c,d,e,f,g,h,i,j) \
+       { Mono ## e, MONO_FLOW_ ## j, h, i },
+
+const MonoOpcode
+mono_opcodes [MONO_N_OPCODES] = {
+#include "mono/cil/opcode.def"
+};
+
+#undef OPDEF
+
+#define OPDEF(a,b,c,d,e,f,g,h,i,j) b,
+
+const char* const
+mono_opcode_names [MONO_N_OPCODES] = {
+#include "mono/cil/opcode.def"
+};
+
diff --git a/mono/metadata/opcodes.h b/mono/metadata/opcodes.h
new file mode 100644 (file)
index 0000000..fb7b4e4
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef __MONO_METADATA_OPCODES_H__
+#define __MONO_METADATA_OPCODES_H__
+
+/*
+ * opcodes.h: CIL instruction information
+ *
+ * Author:
+ *   Paolo Molaro (lupus@ximian.com)
+ *
+ * (C) 2002 Ximian, Inc.
+ */
+
+enum {
+       MONO_FLOW_NEXT,
+       MONO_FLOW_BRANCH,
+       MONO_FLOW_COND_BRANCH,
+       MONO_FLOW_ERROR,
+       MONO_FLOW_CALL,
+       MONO_FLOW_RETURN,
+       MONO_FLOW_META
+};
+
+enum {
+       MonoInlineNone,
+       MonoInlineType,
+       MonoInlineField,
+       MonoInlineMethod,
+       MonoInlineTok,
+       MonoInlineString,
+       MonoInlineSig,
+       MonoInlineVar,
+       MonoShortInlineVar,
+       MonoInlineBrTarget,
+       MonoShortInlineBrTarget,
+       MonoInlineSwitch,
+       MonoInlineR,
+       MonoShortInlineR,
+       MonoInlineI,
+       MonoShortInlineI,
+       MonoInlineI8
+};
+
+typedef struct {
+       unsigned char argument;
+       unsigned char flow_type;
+       unsigned char byte0, byte1;
+} MonoOpcode;
+
+#define MONO_N_OPCODES 300
+
+extern const MonoOpcode mono_opcodes [MONO_N_OPCODES];
+extern const char* const mono_opcode_names [MONO_N_OPCODES];
+
+#endif /* __MONO_METADATA_OPCODES_H__ */
index 70daf7ba0f0786b7338e88dfd53c33158f99f76a..2dad13ec69b60a432b925cfec87096e65d5f8a27 100644 (file)
@@ -1,6 +1,7 @@
 
 #include <mono/metadata/object.h>
 #include <mono/metadata/verify.h>
+#include <mono/metadata/opcodes.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/metadata/mono-endian.h>
 #include <string.h>
@@ -49,7 +50,7 @@ mono_free_verify_list (GSList *list)
                (list) = g_slist_prepend ((list), vinfo);       \
        } while (0)
 
-static const char*
+static const char* const
 valid_cultures[] = {
        "ar-SA", "ar-IQ", "ar-EG", "ar-LY",
        "ar-DZ", "ar-MA", "ar-TN", "ar-OM",
@@ -880,7 +881,7 @@ mono_method_verify (MonoMethod *method, int level)
 
        while (ip < end) {
                ip_offset = ip - header->code;
-               g_print ("IL_%04x: %02x\n", ip_offset, *ip);
+               g_print ("IL_%04x: %02x %s\n", ip_offset, *ip, mono_opcode_names [*ip]);
                if (start || !(code [ip_offset].flags & CODE_SEEN)) {
                        if (start) {
                                code [ip_offset].stack_count = 0;