From: havoc Date: Fri, 8 Jan 2010 05:38:48 +0000 (+0000) Subject: significantly reduce code size in prvm_exec.c by simplifying the X-Git-Tag: xonotic-v0.1.0preview~230^2~662 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=commitdiff_plain;h=fda81eb8eb6440b8bef219f615ea25a6073c0ba2 significantly reduce code size in prvm_exec.c by simplifying the prvm_execprogram.h includes git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9805 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/progsvm.h b/progsvm.h index 64df5155..6aa6b01a 100644 --- a/progsvm.h +++ b/progsvm.h @@ -552,9 +552,15 @@ void VM_Cmd_Reset(void); void PRVM_Init (void); +#ifdef PROFILING void MVM_ExecuteProgram (func_t fnum, const char *errormessage); void CLVM_ExecuteProgram (func_t fnum, const char *errormessage); void SVVM_ExecuteProgram (func_t fnum, const char *errormessage); +#else +#define MVM_ExecuteProgram SVVM_ExecuteProgram +#define CLVM_ExecuteProgram SVVM_ExecuteProgram +void SVVM_ExecuteProgram (func_t fnum, const char *errormessage); +#endif #define PRVM_ExecuteProgram prog->ExecuteProgram #define PRVM_Alloc(buffersize) _PRVM_Alloc(buffersize, __FILE__, __LINE__) diff --git a/prvm_edict.c b/prvm_edict.c index 3b8e3b81..1959bc6d 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -46,10 +46,6 @@ cvar_t prvm_reuseedicts_neverinsameframe = {0, "prvm_reuseedicts_neverinsamefram static double prvm_reuseedicts_always_allow = 0; qboolean prvm_runawaycheck = true; -// LordHavoc: optional runtime bounds checking (speed drain, but worth it for security, on by default - breaks most QCCX features (used by CRMod and others)) -// enables detection of out of bounds memory access in the QuakeC code being run (in other words, prevents really exceedingly bad QuakeC code from doing nasty things to your computer) -qboolean prvm_boundscheck = true; - extern sizebuf_t vm_tempstringsbuf; //============================================================================ @@ -2716,9 +2712,6 @@ void PRVM_Init (void) Cmd_AddCommand ("menu_cmd", PRVM_GameCommand_Menu_f, "calls the menu QC function GameCommand with the supplied string as argument"); Cmd_AddCommand ("sv_cmd", PRVM_GameCommand_Server_f, "calls the server QC function GameCommand with the supplied string as argument"); - // COMMANDLINEOPTION: PRVM: -noboundscheck disables the bounds checks (security hole if CSQC is in use!) - prvm_boundscheck = !COM_CheckParm("-noboundscheck"); - Cvar_RegisterVariable (&prvm_language); Cvar_RegisterVariable (&prvm_traceqc); Cvar_RegisterVariable (&prvm_statementprofiling); diff --git a/prvm_exec.c b/prvm_exec.c index 4544e5b0..6dfdc150 100644 --- a/prvm_exec.c +++ b/prvm_exec.c @@ -642,12 +642,6 @@ void PRVM_Init_Exec(void) // nothing here yet } -/* -==================== -MVM_ExecuteProgram -==================== -*/ -// LordHavoc: optimized #define OPA ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->a]) #define OPB ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->b]) #define OPC ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->c]) @@ -655,7 +649,13 @@ extern cvar_t prvm_traceqc; extern cvar_t prvm_statementprofiling; extern sizebuf_t vm_tempstringsbuf; extern qboolean prvm_runawaycheck; -extern qboolean prvm_boundscheck; + +#ifdef PROFILING +/* +==================== +MVM_ExecuteProgram +==================== +*/ void MVM_ExecuteProgram (func_t fnum, const char *errormessage) { dstatement_t *st, *startst; @@ -698,141 +698,15 @@ void MVM_ExecuteProgram (func_t fnum, const char *errormessage) chooseexecprogram: cachedpr_trace = prog->trace; - if (prvm_runawaycheck) + if (prvm_statementprofiling.integer || prog->trace) { -#define PRVMRUNAWAYCHECK 1 - if (prvm_statementprofiling.integer) - { -#define PRVMSTATEMENTPROFILING 1 - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } -#undef PRVMSTATEMENTPROFILING - } - else - { - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 +#define PRVMSLOWINTERPRETER 1 #include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } - } -#undef PRVMRUNAWAYCHECK +#undef PRVMSLOWINTERPRETER } else { - if (prvm_statementprofiling.integer) - { -#define PRVMSTATEMENTPROFILING 1 - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { #include "prvm_execprogram.h" - } - } -#undef PRVMSTATEMENTPROFILING - } - else - { - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } - } } cleanup: @@ -851,15 +725,6 @@ cleanup: CLVM_ExecuteProgram ==================== */ -// LordHavoc: optimized -#define OPA ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->a]) -#define OPB ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->b]) -#define OPC ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->c]) -extern cvar_t prvm_traceqc; -extern cvar_t prvm_statementprofiling; -extern sizebuf_t vm_tempstringsbuf; -extern qboolean prvm_runawaycheck; -extern qboolean prvm_boundscheck; void CLVM_ExecuteProgram (func_t fnum, const char *errormessage) { dstatement_t *st, *startst; @@ -902,141 +767,15 @@ void CLVM_ExecuteProgram (func_t fnum, const char *errormessage) chooseexecprogram: cachedpr_trace = prog->trace; - if (prvm_runawaycheck) + if (prvm_statementprofiling.integer || prog->trace) { -#define PRVMRUNAWAYCHECK 1 - if (prvm_statementprofiling.integer) - { -#define PRVMSTATEMENTPROFILING 1 - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 +#define PRVMSLOWINTERPRETER 1 #include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } -#undef PRVMSTATEMENTPROFILING - } - else - { - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } - } -#undef PRVMRUNAWAYCHECK +#undef PRVMSLOWINTERPRETER } else { - if (prvm_statementprofiling.integer) - { -#define PRVMSTATEMENTPROFILING 1 - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 #include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } -#undef PRVMSTATEMENTPROFILING - } - else - { - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } - } } cleanup: @@ -1049,21 +788,13 @@ cleanup: SV_FlushBroadcastMessages(); } +#endif /* ==================== SVVM_ExecuteProgram ==================== */ -// LordHavoc: optimized -#define OPA ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->a]) -#define OPB ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->b]) -#define OPC ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->c]) -extern cvar_t prvm_traceqc; -extern cvar_t prvm_statementprofiling; -extern sizebuf_t vm_tempstringsbuf; -extern qboolean prvm_runawaycheck; -extern qboolean prvm_boundscheck; void SVVM_ExecuteProgram (func_t fnum, const char *errormessage) { dstatement_t *st, *startst; @@ -1106,141 +837,15 @@ void SVVM_ExecuteProgram (func_t fnum, const char *errormessage) chooseexecprogram: cachedpr_trace = prog->trace; - if (prvm_runawaycheck) + if (prvm_statementprofiling.integer || prog->trace) { -#define PRVMRUNAWAYCHECK 1 - if (prvm_statementprofiling.integer) - { -#define PRVMSTATEMENTPROFILING 1 - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } -#undef PRVMSTATEMENTPROFILING - } - else - { - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { +#define PRVMSLOWINTERPRETER 1 #include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } - } -#undef PRVMRUNAWAYCHECK +#undef PRVMSLOWINTERPRETER } else { - if (prvm_statementprofiling.integer) - { -#define PRVMSTATEMENTPROFILING 1 - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { #include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } -#undef PRVMSTATEMENTPROFILING - } - else - { - if (prvm_boundscheck) - { -#define PRVMBOUNDSCHECK 1 - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } -#undef PRVMBOUNDSCHECK - } - else - { - if (prog->trace) - { -#define PRVMTRACE 1 -#include "prvm_execprogram.h" -#undef PRVMTRACE - } - else - { -#include "prvm_execprogram.h" - } - } - } } cleanup: diff --git a/prvm_execprogram.h b/prvm_execprogram.h index 99666756..e486419f 100644 --- a/prvm_execprogram.h +++ b/prvm_execprogram.h @@ -5,10 +5,9 @@ { st++; -#if PRVMTRACE - PRVM_PrintStatement(st); -#endif -#if PRVMSTATEMENTPROFILING +#if PRVMSLOWINTERPRETER + if (prog->trace) + PRVM_PrintStatement(st); prog->statement_profile[st - prog->statements]++; #endif @@ -152,7 +151,6 @@ case OP_STOREP_FLD: // integers case OP_STOREP_S: case OP_STOREP_FNC: // pointers -#if PRVMBOUNDSCHECK if (OPB->_int < 0 || OPB->_int + 1 > prog->entityfieldsarea) { prog->xfunction->profile += (st - startst); @@ -160,14 +158,12 @@ PRVM_ERROR("%s attempted to write to an out of bounds edict (%i)", PRVM_NAME, OPB->_int); goto cleanup; } -#endif if (OPB->_int < prog->progs->entityfields && !prog->allowworldwrites) Con_DPrintf("WARNING: assignment to world.%s (field %i) in %s\n", PRVM_GetString(PRVM_ED_FieldAtOfs(OPB->_int)->s_name), OPB->_int, PRVM_NAME); ptr = (prvm_eval_t *)(prog->edictsfields + OPB->_int); ptr->_int = OPA->_int; break; case OP_STOREP_V: -#if PRVMBOUNDSCHECK if (OPB->_int < 0 || OPB->_int + 3 > prog->entityfieldsarea) { prog->xfunction->profile += (st - startst); @@ -175,7 +171,6 @@ PRVM_ERROR("%s attempted to write to an out of bounds edict (%i)", PRVM_NAME, OPB->_int); goto cleanup; } -#endif if (OPB->_int < prog->progs->entityfields && !prog->allowworldwrites) Con_DPrintf("WARNING: assignment to world.%s (field %i) in %s\n", PRVM_GetString(PRVM_ED_FieldAtOfs(OPB->_int)->s_name), OPB->_int, PRVM_NAME); ptr = (prvm_eval_t *)(prog->edictsfields + OPB->_int); @@ -185,7 +180,6 @@ break; case OP_ADDRESS: -#if PRVMBOUNDSCHECK if (OPA->edict < 0 || OPA->edict >= prog->max_edicts) { prog->xfunction->profile += (st - startst); @@ -200,7 +194,6 @@ PRVM_ERROR("%s attempted to address an invalid field (%i) in an edict", PRVM_NAME, OPB->_int); goto cleanup; } -#endif #if 0 if (OPA->edict == 0 && !prog->allowworldwrites) { @@ -219,7 +212,6 @@ case OP_LOAD_ENT: case OP_LOAD_S: case OP_LOAD_FNC: -#if PRVMBOUNDSCHECK if (OPA->edict < 0 || OPA->edict >= prog->max_edicts) { prog->xfunction->profile += (st - startst); @@ -234,13 +226,11 @@ PRVM_ERROR("%s attempted to read an invalid field in an edict (%i)", PRVM_NAME, OPB->_int); goto cleanup; } -#endif ed = PRVM_PROG_TO_EDICT(OPA->edict); OPC->_int = ((prvm_eval_t *)((int *)ed->fields.vp + OPB->_int))->_int; break; case OP_LOAD_V: -#if PRVMBOUNDSCHECK if (OPA->edict < 0 || OPA->edict >= prog->max_edicts) { prog->xfunction->profile += (st - startst); @@ -255,7 +245,6 @@ PRVM_ERROR("%s attempted to read an invalid field in an edict (%i)", PRVM_NAME, OPB->_int); goto cleanup; } -#endif ed = PRVM_PROG_TO_EDICT(OPA->edict); OPC->ivector[0] = ((prvm_eval_t *)((int *)ed->fields.vp + OPB->_int))->ivector[0]; OPC->ivector[1] = ((prvm_eval_t *)((int *)ed->fields.vp + OPB->_int))->ivector[1]; @@ -274,14 +263,12 @@ st += st->b - 1; // offset the s++ startst = st; // no bounds check needed, it is done when loading progs -#if PRVMRUNAWAYCHECK - if (++jumpcount == 10000000) + if (++jumpcount == 10000000 && prvm_runawaycheck) { prog->xstatement = st - prog->statements; PRVM_Profile(1<<30, 1000000, 0); PRVM_ERROR("%s runaway loop counter hit limit of %d jumps\ntip: read above for list of most-executed functions", PRVM_NAME, jumpcount); } -#endif } break; @@ -295,14 +282,12 @@ st += st->b - 1; // offset the s++ startst = st; // no bounds check needed, it is done when loading progs -#if PRVMRUNAWAYCHECK - if (++jumpcount == 10000000) + if (++jumpcount == 10000000 && prvm_runawaycheck) { prog->xstatement = st - prog->statements; PRVM_Profile(1<<30, 1000000, 0); PRVM_ERROR("%s runaway loop counter hit limit of %d jumps\ntip: read above for list of most-executed functions", PRVM_NAME, jumpcount); } -#endif } break; @@ -311,14 +296,12 @@ st += st->a - 1; // offset the s++ startst = st; // no bounds check needed, it is done when loading progs -#if PRVMRUNAWAYCHECK - if (++jumpcount == 10000000) + if (++jumpcount == 10000000 && prvm_runawaycheck) { prog->xstatement = st - prog->statements; PRVM_Profile(1<<30, 1000000, 0); PRVM_ERROR("%s runaway loop counter hit limit of %d jumps\ntip: read above for list of most-executed functions", PRVM_NAME, jumpcount); } -#endif break; case OP_CALL0: @@ -337,7 +320,6 @@ if (!OPA->function) PRVM_ERROR("NULL function in %s", PRVM_NAME); -#if PRVMBOUNDSCHECK if(!OPA->function || OPA->function >= (unsigned int)prog->progs->numfunctions) { prog->xfunction->profile += (st - startst); @@ -345,7 +327,6 @@ PRVM_ERROR("%s CALL outside the program", PRVM_NAME); goto cleanup; } -#endif newf = &prog->functions[OPA->function]; newf->callcount++;