/** * \file * CIL instruction information * * Author: * Paolo Molaro (lupus@ximian.com) * * Copyright 2002-2003 Ximian, Inc (http://www.ximian.com) * Copyright 2004-2009 Novell, Inc (http://www.novell.com) * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include #include /* for NULL */ #include #define MONO_PREFIX1_OFFSET MONO_CEE_ARGLIST #define MONO_CUSTOM_PREFIX_OFFSET MONO_CEE_MONO_ICALL #define OPDEF(a,b,c,d,e,f,g,h,i,j) \ { Mono ## e, MONO_FLOW_ ## j, MONO_ ## a }, const MonoOpcode mono_opcodes [MONO_CEE_LAST + 1] = { #include "mono/cil/opcode.def" {0} }; #undef OPDEF #ifdef HAVE_ARRAY_ELEM_INIT #define MSGSTRFIELD(line) MSGSTRFIELD1(line) #define MSGSTRFIELD1(line) str##line static const struct msgstr_t { #define OPDEF(a,b,c,d,e,f,g,h,i,j) char MSGSTRFIELD(__LINE__) [sizeof (b)]; #include "mono/cil/opcode.def" #undef OPDEF } opstr = { #define OPDEF(a,b,c,d,e,f,g,h,i,j) b, #include "mono/cil/opcode.def" #undef OPDEF }; static const int16_t opidx [] = { #define OPDEF(a,b,c,d,e,f,g,h,i,j) [MONO_ ## a] = offsetof (struct msgstr_t, MSGSTRFIELD(__LINE__)), #include "mono/cil/opcode.def" #undef OPDEF }; /** * mono_opcode_name: */ const char* mono_opcode_name (int opcode) { return (const char*)&opstr + opidx [opcode]; } #else #define OPDEF(a,b,c,d,e,f,g,h,i,j) b, static const char* const mono_opcode_names [MONO_CEE_LAST + 1] = { #include "mono/cil/opcode.def" NULL }; const char* mono_opcode_name (int opcode) { return mono_opcode_names [opcode]; } #endif MonoOpcodeEnum mono_opcode_value (const mono_byte **ip, const mono_byte *end) { MonoOpcodeEnum res; const mono_byte *p = *ip; if (p >= end) return (MonoOpcodeEnum)-1; if (*p == 0xfe) { ++p; if (p >= end) return (MonoOpcodeEnum)-1; res = (MonoOpcodeEnum)(*p + MONO_PREFIX1_OFFSET); } else if (*p == MONO_CUSTOM_PREFIX) { ++p; if (p >= end) return (MonoOpcodeEnum)-1; res = (MonoOpcodeEnum)(*p + MONO_CUSTOM_PREFIX_OFFSET); } else { res = (MonoOpcodeEnum)*p; } *ip = p; return res; }