danderson@3977: /** danderson@3977: * vim: set ts=8 sw=2 tw=99 sts=2 et: danderson@3977: * ============================================================================= danderson@3977: * SourceMod danderson@3977: * Copyright _(C) 2004-2008 AlliedModders LLC. All rights reserved. danderson@3977: * ============================================================================= danderson@3977: * danderson@3977: * This program is free software; you can redistribute it and/or modify it under danderson@3977: * the terms of the GNU General Public License), version 3.0), as published by the danderson@3977: * Free Software Foundation. danderson@3977: * danderson@3977: * This program is distributed in the hope that it will be useful), but WITHOUT danderson@3977: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS danderson@3977: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more danderson@3977: * details. danderson@3977: * danderson@3977: * You should have received a copy of the GNU General Public License along with danderson@3977: * this program. If not), see . danderson@3977: * danderson@3977: * As a special exception), AlliedModders LLC gives you permission to link the danderson@3977: * code of this program _(as well as its derivative works) to "Half-Life 2)," the danderson@3977: * "Source Engine)," the "SourcePawn JIT)," and any Game MODs that run on software danderson@3977: * by the Valve Corporation. You must obey the GNU General Public License in danderson@3977: * all respects for all other code used. Additionally), AlliedModders LLC grants danderson@3977: * this exception to all derivative works. AlliedModders LLC defines further danderson@3977: * exceptions), found in LICENSE.txt _(as of this writing), version JULY-31-2007)), danderson@3977: * or . danderson@3977: * danderson@3977: * Version: $Id$ danderson@3977: */ danderson@3977: #include "opcodes.h" danderson@3977: #include "jit_shared.h" danderson@3977: danderson@3977: using namespace SourcePawn; danderson@3977: danderson@3977: const char *OpcodeNames[] = { danderson@3977: #define _(op, text) text, danderson@3977: OPCODE_LIST(_) danderson@3977: #undef _ danderson@3977: NULL danderson@3977: }; danderson@3977: danderson@3977: void danderson@3977: SourcePawn::SpewOpcode(const sp_plugin_t *plugin, cell_t *start, cell_t *cip) danderson@3977: { danderson@3977: fprintf(stdout, " [%05d:%04d]", cip - (cell_t *)plugin->pcode, cip - start); danderson@3977: danderson@3977: if (*cip >= OPCODES_TOTAL) { danderson@3977: fprintf(stdout, " unknown-opcode\n"); danderson@3977: return; danderson@3977: } danderson@3977: danderson@3977: OPCODE op = (OPCODE)*cip; danderson@3977: fprintf(stdout, " %s ", OpcodeNames[op]); danderson@3977: danderson@3977: switch (op) { danderson@3977: case OP_PUSH_C: danderson@3977: case OP_PUSH_ADR: danderson@3977: case OP_SHL_C_PRI: danderson@3977: case OP_SHL_C_ALT: danderson@3977: case OP_SHR_C_PRI: danderson@3977: case OP_SHR_C_ALT: danderson@3977: case OP_ADD_C: danderson@3977: case OP_SMUL_C: danderson@3977: case OP_EQ_C_PRI: danderson@3977: case OP_EQ_C_ALT: danderson@3977: case OP_TRACKER_PUSH_C: danderson@3977: case OP_STACK: danderson@3977: case OP_PUSH_S: danderson@3977: case OP_HEAP: danderson@3977: case OP_GENARRAY: danderson@3977: case OP_GENARRAY_Z: dvander@3989: case OP_CONST_PRI: dvander@3989: case OP_CONST_ALT: danderson@3977: fprintf(stdout, "%d", cip[1]); danderson@3977: break; danderson@3977: danderson@3977: case OP_JUMP: danderson@3977: case OP_JZER: danderson@3977: case OP_JNZ: danderson@3977: case OP_JEQ: danderson@3977: case OP_JNEQ: danderson@3977: case OP_JSLESS: danderson@3977: case OP_JSGRTR: danderson@3977: case OP_JSGEQ: danderson@3977: case OP_JSLEQ: danderson@3977: fprintf(stdout, "%05d:%04d", danderson@3977: cip[1] / 4, danderson@3977: ((cell_t *)plugin->pcode + cip[1] / 4) - start); danderson@3977: break; danderson@3977: danderson@3977: case OP_SYSREQ_C: danderson@3977: case OP_SYSREQ_N: danderson@3977: { danderson@3977: uint32_t index = cip[1]; danderson@3977: if (index < plugin->num_natives) danderson@3977: fprintf(stdout, "%s", plugin->natives[index].name); danderson@3977: if (op == OP_SYSREQ_N) danderson@3977: fprintf(stdout, " ; (%d args, index %d)", cip[2], index); danderson@3977: else danderson@3977: fprintf(stdout, " ; (index %d)", index); danderson@3977: break; danderson@3977: } danderson@3977: danderson@3977: case OP_PUSH2_C: danderson@3977: case OP_PUSH2: danderson@3977: case OP_PUSH2_S: danderson@3977: case OP_PUSH2_ADR: danderson@3977: fprintf(stdout, "%d, %d", cip[1], cip[2]); danderson@3977: break; danderson@3977: danderson@3977: case OP_PUSH3_C: danderson@3977: case OP_PUSH3: danderson@3977: case OP_PUSH3_S: danderson@3977: case OP_PUSH3_ADR: danderson@3977: fprintf(stdout, "%d, %d, %d", cip[1], cip[2], cip[3]); danderson@3977: break; danderson@3977: danderson@3977: case OP_PUSH4_C: danderson@3977: case OP_PUSH4: danderson@3977: case OP_PUSH4_S: danderson@3977: case OP_PUSH4_ADR: danderson@3977: fprintf(stdout, "%d, %d, %d, %d", cip[1], cip[2], cip[3], cip[4]); danderson@3977: break; danderson@3977: danderson@3977: case OP_PUSH5_C: danderson@3977: case OP_PUSH5: danderson@3977: case OP_PUSH5_S: danderson@3977: case OP_PUSH5_ADR: danderson@3977: fprintf(stdout, "%d, %d, %d, %d, %d", cip[1], cip[2], cip[3], cip[4], cip[5]); danderson@3977: break; danderson@3977: danderson@3977: default: danderson@3977: break; danderson@3977: } danderson@3977: danderson@3977: fprintf(stdout, "\n"); danderson@3977: } danderson@3977: