1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/sourcepawn/compiler/amxdbg.h Sun Mar 30 07:00:22 2008 +0000
1.3 @@ -0,0 +1,173 @@
1.4 +/* Abstract Machine for the Pawn compiler, debugger support
1.5 + *
1.6 + * This file contains extra definitions that are convenient for debugger
1.7 + * support.
1.8 + *
1.9 + * Copyright (c) ITB CompuPhase, 2005
1.10 + *
1.11 + * This software is provided "as-is", without any express or implied warranty.
1.12 + * In no event will the authors be held liable for any damages arising from
1.13 + * the use of this software.
1.14 + *
1.15 + * Permission is granted to anyone to use this software for any purpose,
1.16 + * including commercial applications, and to alter it and redistribute it
1.17 + * freely, subject to the following restrictions:
1.18 + *
1.19 + * 1. The origin of this software must not be misrepresented; you must not
1.20 + * claim that you wrote the original software. If you use this software in
1.21 + * a product, an acknowledgment in the product documentation would be
1.22 + * appreciated but is not required.
1.23 + * 2. Altered source versions must be plainly marked as such, and must not be
1.24 + * misrepresented as being the original software.
1.25 + * 3. This notice may not be removed or altered from any source distribution.
1.26 + *
1.27 + * Version: $Id$
1.28 + */
1.29 +
1.30 +#ifndef AMXDBG_H_INCLUDED
1.31 +#define AMXDBG_H_INCLUDED
1.32 +
1.33 +#ifndef AMX_H_INCLUDED
1.34 + #include "amx.h"
1.35 +#endif
1.36 +
1.37 +#ifdef __cplusplus
1.38 +extern "C" {
1.39 +#endif
1.40 +
1.41 +/* Some compilers do not support the #pragma align, which should be fine. Some
1.42 + * compilers give a warning on unknown #pragmas, which is not so fine...
1.43 + */
1.44 +#if defined SN_TARGET_PS2 || defined __GNUC__
1.45 + #define AMX_NO_ALIGN
1.46 +#endif
1.47 +
1.48 +#if defined __GNUC__
1.49 + #define PACKED __attribute__((packed))
1.50 +#else
1.51 + #define PACKED
1.52 +#endif
1.53 +
1.54 +#if !defined AMX_NO_ALIGN
1.55 + #if defined LINUX || defined __FreeBSD__
1.56 + #pragma pack(1) /* structures must be packed (byte-aligned) */
1.57 + #elif defined MACOS && defined __MWERKS__
1.58 + #pragma options align=mac68k
1.59 + #else
1.60 + #pragma pack(push)
1.61 + #pragma pack(1) /* structures must be packed (byte-aligned) */
1.62 + #if defined __TURBOC__
1.63 + #pragma option -a- /* "pack" pragma for older Borland compilers */
1.64 + #endif
1.65 + #endif
1.66 +#endif
1.67 +
1.68 +typedef struct tagAMX_DBG_HDR {
1.69 + int32_t size PACKED; /* size of the debug information chunk */
1.70 + uint16_t magic PACKED; /* signature, must be 0xf1ef */
1.71 + char file_version; /* file format version */
1.72 + char amx_version; /* required version of the AMX */
1.73 + int16_t flags PACKED; /* currently unused */
1.74 + int16_t files PACKED; /* number of entries in the "file" table */
1.75 + int16_t lines PACKED; /* number of entries in the "line" table */
1.76 + int16_t symbols PACKED; /* number of entries in the "symbol" table */
1.77 + int16_t tags PACKED; /* number of entries in the "tag" table */
1.78 + int16_t automatons PACKED; /* number of entries in the "automaton" table */
1.79 + int16_t states PACKED; /* number of entries in the "state" table */
1.80 +} PACKED AMX_DBG_HDR;
1.81 +#define AMX_DBG_MAGIC 0xf1ef
1.82 +
1.83 +typedef struct tagAMX_DBG_FILE {
1.84 + ucell address PACKED; /* address in the code segment where generated code (for this file) starts */
1.85 + const char name[1]; /* ASCII string, zero-terminated */
1.86 +} PACKED AMX_DBG_FILE;
1.87 +
1.88 +typedef struct tagAMX_DBG_LINE {
1.89 + ucell address PACKED; /* address in the code segment where generated code (for this line) starts */
1.90 + int32_t line PACKED; /* line number */
1.91 +} PACKED AMX_DBG_LINE;
1.92 +
1.93 +typedef struct tagAMX_DBG_SYMBOL {
1.94 + ucell address PACKED; /* address in the data segment or relative to the frame */
1.95 + int16_t tag PACKED; /* tag for the symbol */
1.96 + ucell codestart PACKED; /* address in the code segment from which this symbol is valid (in scope) */
1.97 + ucell codeend PACKED; /* address in the code segment until which this symbol is valid (in scope) */
1.98 + char ident; /* kind of symbol (function/variable) */
1.99 + char vclass; /* class of symbol (global/local) */
1.100 + int16_t dim PACKED; /* number of dimensions */
1.101 + const char name[1]; /* ASCII string, zero-terminated */
1.102 +} PACKED AMX_DBG_SYMBOL;
1.103 +
1.104 +typedef struct tagAMX_DBG_SYMDIM {
1.105 + int16_t tag PACKED; /* tag for the array dimension */
1.106 + ucell size PACKED; /* size of the array dimension */
1.107 +} PACKED AMX_DBG_SYMDIM;
1.108 +
1.109 +typedef struct tagAMX_DBG_TAG {
1.110 + int16_t tag PACKED; /* tag id */
1.111 + const char name[1]; /* ASCII string, zero-terminated */
1.112 +} PACKED AMX_DBG_TAG;
1.113 +
1.114 +typedef struct tagAMX_DBG_MACHINE {
1.115 + int16_t automaton PACKED; /* automaton id */
1.116 + ucell address PACKED; /* address of state variable */
1.117 + const char name[1]; /* ASCII string, zero-terminated */
1.118 +} PACKED AMX_DBG_MACHINE;
1.119 +
1.120 +typedef struct tagAMX_DBG_STATE {
1.121 + int16_t state PACKED; /* state id */
1.122 + int16_t automaton PACKED; /* automaton id */
1.123 + const char name[1]; /* ASCII string, zero-terminated */
1.124 +} PACKED AMX_DBG_STATE;
1.125 +
1.126 +typedef struct tagAMX_DBG {
1.127 + AMX_DBG_HDR _FAR *hdr PACKED; /* points to the AMX_DBG header */
1.128 + AMX_DBG_FILE _FAR **filetbl PACKED;
1.129 + AMX_DBG_LINE _FAR *linetbl PACKED;
1.130 + AMX_DBG_SYMBOL _FAR **symboltbl PACKED;
1.131 + AMX_DBG_TAG _FAR **tagtbl PACKED;
1.132 + AMX_DBG_MACHINE _FAR **automatontbl PACKED;
1.133 + AMX_DBG_STATE _FAR **statetbl PACKED;
1.134 +} PACKED AMX_DBG;
1.135 +
1.136 +#if !defined iVARIABLE
1.137 + #define iVARIABLE 1 /* cell that has an address and that can be fetched directly (lvalue) */
1.138 + #define iREFERENCE 2 /* iVARIABLE, but must be dereferenced */
1.139 + #define iARRAY 3
1.140 + #define iREFARRAY 4 /* an array passed by reference (i.e. a pointer) */
1.141 + #define iFUNCTN 9
1.142 +#endif
1.143 +
1.144 +
1.145 +int AMXAPI dbg_FreeInfo(AMX_DBG *amxdbg);
1.146 +int AMXAPI dbg_LoadInfo(AMX_DBG *amxdbg, void *dbg_addr);
1.147 +
1.148 +int AMXAPI dbg_LookupFile(AMX_DBG *amxdbg, ucell address, const char **filename);
1.149 +int AMXAPI dbg_LookupFunction(AMX_DBG *amxdbg, ucell address, const char **funcname);
1.150 +int AMXAPI dbg_LookupLine(AMX_DBG *amxdbg, ucell address, long *line);
1.151 +
1.152 +int AMXAPI dbg_GetFunctionAddress(AMX_DBG *amxdbg, const char *funcname, const char *filename, ucell *address);
1.153 +int AMXAPI dbg_GetLineAddress(AMX_DBG *amxdbg, long line, const char *filename, ucell *address);
1.154 +int AMXAPI dbg_GetAutomatonName(AMX_DBG *amxdbg, int automaton, const char **name);
1.155 +int AMXAPI dbg_GetStateName(AMX_DBG *amxdbg, int state, const char **name);
1.156 +int AMXAPI dbg_GetTagName(AMX_DBG *amxdbg, int tag, const char **name);
1.157 +int AMXAPI dbg_GetVariable(AMX_DBG *amxdbg, const char *symname, ucell scopeaddr, const AMX_DBG_SYMBOL **sym);
1.158 +int AMXAPI dbg_GetArrayDim(AMX_DBG *amxdbg, const AMX_DBG_SYMBOL *sym, const AMX_DBG_SYMDIM **symdim);
1.159 +
1.160 +
1.161 +#if !defined AMX_NO_ALIGN
1.162 + #if defined LINUX || defined __FreeBSD__
1.163 + #pragma pack() /* reset default packing */
1.164 + #elif defined MACOS && defined __MWERKS__
1.165 + #pragma options align=reset
1.166 + #else
1.167 + #pragma pack(pop) /* reset previous packing */
1.168 + #endif
1.169 +#endif
1.170 +
1.171 +#ifdef __cplusplus
1.172 +}
1.173 +#endif
1.174 +
1.175 +#endif /* AMXDBG_H_INCLUDED */
1.176 +