| author | Scott Ehlert <ds@alliedmods.net> |
| Sun Jul 15 08:00:26 2007 +0000 (2007-07-15) | |
| changeset 1116 | 40cc5e9f0f1b |
| parent 679 | aa756b3f37a3 |
| child 1231 | 17badaf66ce4 |
| permissions | -rw-r--r-- |
| dvander@372 | 1 |
/** |
| dvander@375 | 2 |
* vim: set ts=4 : |
| dvander@372 | 3 |
* ================================================================ |
| dvander@376 | 4 |
* SourcePawn, Copyright (C) 2004-2007 AlliedModders LLC. |
| dvander@376 | 5 |
* All rights reserved. |
| dvander@372 | 6 |
* ================================================================ |
| dvander@372 | 7 |
* |
| dvander@379 | 8 |
* This file is part of the SourceMod/SourcePawn SDK. This file may only be |
| dvander@379 | 9 |
* used or modified under the Terms and Conditions of its License Agreement, |
| dvander@379 | 10 |
* which is found in public/licenses/LICENSE.txt. As of this notice, derivative |
| dvander@379 | 11 |
* works must be licensed under the GNU General Public License (version 2 or |
| dvander@379 | 12 |
* greater). A copy of the GPL is included under public/licenses/GPL.txt. |
| dvander@379 | 13 |
* |
| dvander@379 | 14 |
* To view the latest information, see: http://www.sourcemod.net/license.php |
| dvander@372 | 15 |
* |
| dvander@372 | 16 |
* Version: $Id$ |
| dvander@372 | 17 |
*/ |
| dvander@372 | 18 |
|
| dvander@324 | 19 |
#ifndef _INCLUDE_SPFILE_HEADERS_H |
| dvander@324 | 20 |
#define _INCLUDE_SPFILE_HEADERS_H |
| dvander@324 | 21 |
|
| dvander@372 | 22 |
/** |
| dvander@372 | 23 |
* @file sp_file_headers.h |
| dvander@372 | 24 |
* @brief Defines the structure present in a SourcePawn compiled binary. |
| dvander@372 | 25 |
* |
| dvander@372 | 26 |
* Note: These structures should be 1-byte packed to match the file format. |
| dvander@372 | 27 |
*/ |
| dvander@372 | 28 |
|
| dvander@324 | 29 |
#include <stddef.h> |
| dvander@324 | 30 |
#if defined __GNUC__ || defined HAVE_STDINT_ |
| dvander@324 | 31 |
#include <stdint.h> |
| dvander@324 | 32 |
#else |
| dvander@324 | 33 |
#if !defined HAVE_STDINT_H |
| dvander@372 | 34 |
typedef unsigned __int64 uint64_t; /**< 64bit unsigned integer */ |
| dvander@372 | 35 |
typedef __int64 int64_t; /**< 64bit signed integer */ |
| dvander@372 | 36 |
typedef unsigned __int32 uint32_t; /**< 32bit unsigned integer */ |
| dvander@372 | 37 |
typedef __int32 int32_t; /**< 32bit signed integer */ |
| dvander@372 | 38 |
typedef unsigned __int16 uint16_t; /**< 16bit unsigned integer */ |
| dvander@372 | 39 |
typedef __int16 int16_t; /**< 16bit signed integer */ |
| dvander@372 | 40 |
typedef unsigned __int8 uint8_t; /**< 8bit unsigned integer */ |
| dvander@372 | 41 |
typedef __int8 int8_t; /**< 8bit signed integer */ |
| dvander@324 | 42 |
#define HAVE_STDINT_H |
| dvander@324 | 43 |
#endif |
| dvander@324 | 44 |
#endif |
| dvander@324 | 45 |
|
| dvander@372 | 46 |
#define SPFILE_MAGIC 0x53504646 /**< Source Pawn File Format (SPFF) */ |
| dvander@372 | 47 |
#define SPFILE_VERSION 0x0101 /**< Uncompressed bytecode */ |
| dvander@324 | 48 |
|
| dvander@324 | 49 |
//:TODO: better compiler/nix support |
| dvander@324 | 50 |
#if defined __linux__ |
| dvander@324 | 51 |
#pragma pack(1) /* structures must be packed (byte-aligned) */ |
| dvander@324 | 52 |
#else |
| dvander@324 | 53 |
#pragma pack(push) |
| dvander@324 | 54 |
#pragma pack(1) /* structures must be packed (byte-aligned) */ |
| dvander@324 | 55 |
#endif |
| dvander@324 | 56 |
|
| dvander@372 | 57 |
#define SPFILE_COMPRESSION_NONE 0 /**< No compression in file */ |
| dvander@372 | 58 |
#define SPFILE_COMPRESSION_GZ 1 /**< GZ compression */ |
| dvander@324 | 59 |
|
| dvander@372 | 60 |
/** |
| dvander@372 | 61 |
* @brief File section header format. |
| dvander@372 | 62 |
*/ |
| dvander@324 | 63 |
typedef struct sp_file_section_s |
| dvander@324 | 64 |
{ |
| dvander@372 | 65 |
uint32_t nameoffs; /**< Relative offset into global string table */ |
| dvander@372 | 66 |
uint32_t dataoffs; /**< Offset into the data section of the file */ |
| dvander@372 | 67 |
uint32_t size; /**< Size of the section's entry in the data section */ |
| dvander@324 | 68 |
} sp_file_section_t; |
| dvander@324 | 69 |
|
| dvander@324 | 70 |
/** |
| dvander@372 | 71 |
* @brief File header format. If compression is 0, then disksize may be 0 |
| dvander@372 | 72 |
* to mean that only the imagesize is needed. |
| dvander@324 | 73 |
*/ |
| dvander@324 | 74 |
typedef struct sp_file_hdr_s |
| dvander@324 | 75 |
{ |
| dvander@372 | 76 |
uint32_t magic; /**< Magic number */ |
| dvander@372 | 77 |
uint16_t version; /**< Version code */ |
| dvander@372 | 78 |
uint8_t compression;/**< Compression algorithm */ |
| dvander@372 | 79 |
uint32_t disksize; /**< Size on disk */ |
| dvander@372 | 80 |
uint32_t imagesize; /**< Size in memory */ |
| dvander@372 | 81 |
uint8_t sections; /**< Number of sections */ |
| dvander@372 | 82 |
uint32_t stringtab; /**< Offset to string table */ |
| dvander@372 | 83 |
uint32_t dataoffs; /**< Offset to file proper (any compression starts here) */ |
| dvander@324 | 84 |
} sp_file_hdr_t; |
| dvander@324 | 85 |
|
| dvander@372 | 86 |
#define SP_FLAG_DEBUG (1<<0) /**< Debug information is present in the file */ |
| dvander@324 | 87 |
|
| dvander@372 | 88 |
/** |
| dvander@372 | 89 |
* @brief File-encoded format of the ".code" section. |
| dvander@372 | 90 |
*/ |
| dvander@324 | 91 |
typedef struct sp_file_code_s |
| dvander@324 | 92 |
{ |
| dvander@372 | 93 |
uint32_t codesize; /**< Codesize in bytes */ |
| dvander@372 | 94 |
uint8_t cellsize; /**< Cellsize in bytes */ |
| dvander@372 | 95 |
uint8_t codeversion; /**< Version of opcodes supported */ |
| dvander@372 | 96 |
uint16_t flags; /**< Flags */ |
| dvander@372 | 97 |
uint32_t main; /**< Address to "main," if any */ |
| dvander@372 | 98 |
uint32_t code; /**< Relative offset to code */ |
| dvander@324 | 99 |
} sp_file_code_t; |
| dvander@324 | 100 |
|
| dvander@372 | 101 |
/** |
| dvander@372 | 102 |
* @brief File-encoded format of the ".data" section. |
| dvander@372 | 103 |
*/ |
| dvander@324 | 104 |
typedef struct sp_file_data_s |
| dvander@324 | 105 |
{ |
| dvander@372 | 106 |
uint32_t datasize; /**< Size of data section in memory */ |
| dvander@372 | 107 |
uint32_t memsize; /**< Total mem required (includes data) */ |
| dvander@372 | 108 |
uint32_t data; /**< File offset to data (helper) */ |
| dvander@324 | 109 |
} sp_file_data_t; |
| dvander@324 | 110 |
|
| dvander@372 | 111 |
/** |
| dvander@372 | 112 |
* @brief File-encoded format of the ".publics" section. |
| dvander@372 | 113 |
*/ |
| dvander@324 | 114 |
typedef struct sp_file_publics_s |
| dvander@324 | 115 |
{ |
| dvander@372 | 116 |
uint32_t address; /**< Address relative to code section */ |
| dvander@372 | 117 |
uint32_t name; /**< Index into nametable */ |
| dvander@324 | 118 |
} sp_file_publics_t; |
| dvander@324 | 119 |
|
| dvander@372 | 120 |
/** |
| dvander@372 | 121 |
* @brief File-encoded format of the ".natives" section. |
| dvander@372 | 122 |
*/ |
| dvander@324 | 123 |
typedef struct sp_file_natives_s |
| dvander@324 | 124 |
{ |
| dvander@372 | 125 |
uint32_t name; /**< Index into nametable */ |
| dvander@324 | 126 |
} sp_file_natives_t; |
| dvander@324 | 127 |
|
| dvander@372 | 128 |
/** |
| dvander@372 | 129 |
* @brief File-encoded format of the ".pubvars" section. |
| dvander@372 | 130 |
*/ |
| dvander@324 | 131 |
typedef struct sp_file_pubvars_s |
| dvander@324 | 132 |
{ |
| dvander@372 | 133 |
uint32_t address; /**< Address relative to the DAT section */ |
| dvander@372 | 134 |
uint32_t name; /**< Index into nametable */ |
| dvander@324 | 135 |
} sp_file_pubvars_t; |
| dvander@324 | 136 |
|
| dvander@679 | 137 |
/** |
| dvander@679 | 138 |
* @brief File-encoded tag info. |
| dvander@679 | 139 |
*/ |
| dvander@679 | 140 |
typedef struct sp_file_tag_s |
| dvander@679 | 141 |
{ |
| dvander@679 | 142 |
uint32_t tag_id; /**< Tag ID from compiler */ |
| dvander@679 | 143 |
uint32_t name; /**< Index into nametable */ |
| dvander@679 | 144 |
} sp_file_tag_t; |
| dvander@679 | 145 |
|
| dvander@324 | 146 |
#if defined __linux__ |
| dvander@324 | 147 |
#pragma pack() /* reset default packing */ |
| dvander@324 | 148 |
#else |
| dvander@324 | 149 |
#pragma pack(pop) /* reset previous packing */ |
| dvander@324 | 150 |
#endif |
| dvander@324 | 151 |
|
| dvander@372 | 152 |
/** |
| dvander@372 | 153 |
* @brief File-encoded debug information table. |
| dvander@372 | 154 |
*/ |
| dvander@324 | 155 |
typedef struct sp_fdbg_info_s |
| dvander@324 | 156 |
{ |
| dvander@372 | 157 |
uint32_t num_files; /**< number of files */ |
| dvander@372 | 158 |
uint32_t num_lines; /**< number of lines */ |
| dvander@372 | 159 |
uint32_t num_syms; /**< number of symbols */ |
| dvander@372 | 160 |
uint32_t num_arrays; /**< number of symbols which are arrays */ |
| dvander@324 | 161 |
} sp_fdbg_info_t; |
| dvander@324 | 162 |
|
| dvander@324 | 163 |
/** |
| dvander@372 | 164 |
* @brief File-encoded debug file table. |
| dvander@324 | 165 |
*/ |
| dvander@324 | 166 |
typedef struct sp_fdbg_file_s |
| dvander@324 | 167 |
{ |
| dvander@372 | 168 |
uint32_t addr; /**< Address into code */ |
| dvander@372 | 169 |
uint32_t name; /**< Offset into debug nametable */ |
| dvander@324 | 170 |
} sp_fdbg_file_t; |
| dvander@324 | 171 |
|
| dvander@372 | 172 |
/** |
| dvander@372 | 173 |
* @brief File-encoded debug line table. |
| dvander@372 | 174 |
*/ |
| dvander@324 | 175 |
typedef struct sp_fdbg_line_s |
| dvander@324 | 176 |
{ |
| dvander@372 | 177 |
uint32_t addr; /**< Address into code */ |
| dvander@372 | 178 |
uint32_t line; /**< Line number */ |
| dvander@324 | 179 |
} sp_fdbg_line_t; |
| dvander@324 | 180 |
|
| dvander@372 | 181 |
#define SP_SYM_VARIABLE 1 /**< Cell that has an address and that can be fetched directly (lvalue) */ |
| dvander@372 | 182 |
#define SP_SYM_REFERENCE 2 /**< VARIABLE, but must be dereferenced */ |
| dvander@372 | 183 |
#define SP_SYM_ARRAY 3 /**< Symbol is an array */ |
| dvander@372 | 184 |
#define SP_SYM_REFARRAY 4 /**< An array passed by reference (i.e. a pointer) */ |
| dvander@372 | 185 |
#define SP_SYM_FUNCTION 9 /**< Symbol is a function */ |
| dvander@324 | 186 |
|
| dvander@372 | 187 |
/** |
| dvander@372 | 188 |
* @brief File-encoded debug symbol information. |
| dvander@372 | 189 |
*/ |
| dvander@324 | 190 |
typedef struct sp_fdbg_symbol_s |
| dvander@324 | 191 |
{ |
| dvander@372 | 192 |
int32_t addr; /**< Address rel to DAT or stack frame */ |
| dvander@372 | 193 |
int16_t tagid; /**< Tag id */ |
| dvander@372 | 194 |
uint32_t codestart; /**< Start scope validity in code */ |
| dvander@372 | 195 |
uint32_t codeend; /**< End scope validity in code */ |
| dvander@372 | 196 |
uint8_t ident; /**< Variable type */ |
| dvander@372 | 197 |
uint8_t vclass; /**< Scope class (local vs global) */ |
| dvander@372 | 198 |
uint16_t dimcount; /**< Dimension count (for arrays) */ |
| dvander@372 | 199 |
uint32_t name; /**< Offset into debug nametable */ |
| dvander@324 | 200 |
} sp_fdbg_symbol_t; |
| dvander@324 | 201 |
|
| dvander@372 | 202 |
/** |
| dvander@372 | 203 |
* @brief File-encoded debug symbol array dimension info. |
| dvander@372 | 204 |
*/ |
| dvander@324 | 205 |
typedef struct sp_fdbg_arraydim_s |
| dvander@324 | 206 |
{ |
| dvander@372 | 207 |
int16_t tagid; /**< Tag id */ |
| dvander@372 | 208 |
uint32_t size; /**< Size of dimension */ |
| dvander@324 | 209 |
} sp_fdbg_arraydim_t; |
| dvander@324 | 210 |
|
| dvander@372 | 211 |
/** Typedef for .names table */ |
| dvander@324 | 212 |
typedef char * sp_file_nametab_t; |
| dvander@324 | 213 |
|
| dvander@324 | 214 |
#endif //_INCLUDE_SPFILE_HEADERS_H |