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