210 lines
7.4 KiB
C++
210 lines
7.4 KiB
C++
// vim: set sts=2 ts=8 sw=2 tw=99 et:
|
|
// =============================================================================
|
|
// SourcePawn
|
|
// Copyright (C) 2004-2014 AlliedModders LLC. All rights reserved.
|
|
// =============================================================================
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify it under
|
|
// the terms of the GNU General Public License, version 3.0, as published by the
|
|
// Free Software Foundation.
|
|
//
|
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
// details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License along with
|
|
// this program. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// As a special exception, AlliedModders LLC gives you permission to link the
|
|
// code of this program (as well as its derivative works) to "Half-Life 2," the
|
|
// "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
|
|
// by the Valve Corporation. You must obey the GNU General Public License in
|
|
// all respects for all other code used. Additionally, AlliedModders LLC grants
|
|
// this exception to all derivative works. AlliedModders LLC defines further
|
|
// exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
|
|
// or <http://www.sourcemod.net/license.php>.
|
|
|
|
#ifndef _INCLUDE_SPFILE_HEADERS_v1_H
|
|
#define _INCLUDE_SPFILE_HEADERS_v1_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <smx/smx-headers.h>
|
|
|
|
namespace sp {
|
|
|
|
// These structures are byte-packed.
|
|
#if defined __GNUC__
|
|
# pragma pack(1)
|
|
#else
|
|
# pragma pack(push)
|
|
# pragma pack(1)
|
|
#endif
|
|
|
|
// (Obsolete) debug-information is present.
|
|
static const uint16_t CODEFLAG_DEBUG = 0x1;
|
|
|
|
// The ".data" section.
|
|
typedef struct sp_file_data_s
|
|
{
|
|
uint32_t datasize; /**< Size of data section in memory */
|
|
uint32_t memsize; /**< Total mem required (includes data) */
|
|
uint32_t data; /**< File offset to data (helper) */
|
|
} sp_file_data_t;
|
|
|
|
// The ".publics" section.
|
|
typedef struct sp_file_publics_s
|
|
{
|
|
uint32_t address; /**< Address relative to code section */
|
|
uint32_t name; /**< Index into nametable */
|
|
} sp_file_publics_t;
|
|
|
|
// The ".natives" section.
|
|
typedef struct sp_file_natives_s
|
|
{
|
|
uint32_t name; /**< Index into nametable */
|
|
} sp_file_natives_t;
|
|
|
|
// The ".pubvars" section.
|
|
typedef struct sp_file_pubvars_s
|
|
{
|
|
uint32_t address; /**< Address relative to the DAT section */
|
|
uint32_t name; /**< Index into nametable */
|
|
} sp_file_pubvars_t;
|
|
|
|
// The ".tags" section.
|
|
typedef struct sp_file_tag_s
|
|
{
|
|
uint32_t tag_id; /**< Tag ID from compiler */
|
|
uint32_t name; /**< Index into nametable */
|
|
} sp_file_tag_t;
|
|
|
|
// The ".dbg.info" section.
|
|
typedef struct sp_fdbg_info_s
|
|
{
|
|
uint32_t num_files; /**< number of files */
|
|
uint32_t num_lines; /**< number of lines */
|
|
uint32_t num_syms; /**< number of symbols */
|
|
uint32_t num_arrays; /**< number of symbols which are arrays */
|
|
} sp_fdbg_info_t;
|
|
|
|
// The ".dbg.files" section.
|
|
typedef struct sp_fdbg_file_s
|
|
{
|
|
uint32_t addr; /**< Address into code */
|
|
uint32_t name; /**< Offset into debug nametable */
|
|
} sp_fdbg_file_t;
|
|
|
|
// The ".dbg.lines" section.
|
|
typedef struct sp_fdbg_line_s
|
|
{
|
|
uint32_t addr; /**< Address into code */
|
|
uint32_t line; /**< Line number */
|
|
} sp_fdbg_line_t;
|
|
|
|
static const uint8_t IDENT_VARIABLE = 1; // Scalar local variable.
|
|
static const uint8_t IDENT_REFERENCE = 2; // Reference to a scalar argument.
|
|
static const uint8_t IDENT_ARRAY = 3; // Array with known dimensions.
|
|
static const uint8_t IDENT_REFARRAY = 4; // Array with unknown dimensions.
|
|
static const uint8_t IDENT_FUNCTION = 9; // Symbolic function.
|
|
static const uint8_t IDENT_VARARGS = 11; // Variadic argument (...).
|
|
|
|
// The ".dbg.symbols" table.
|
|
typedef struct sp_fdbg_symbol_s
|
|
{
|
|
int32_t addr; /**< Address rel to DAT or stack frame */
|
|
int16_t tagid; /**< Tag id */
|
|
uint32_t codestart; /**< Start scope validity in code */
|
|
uint32_t codeend; /**< End scope validity in code */
|
|
uint8_t ident; /**< Variable type */
|
|
uint8_t vclass; /**< Scope class (local vs global) */
|
|
uint16_t dimcount; /**< Dimension count (for arrays) */
|
|
uint32_t name; /**< Offset into debug nametable */
|
|
} sp_fdbg_symbol_t;
|
|
|
|
// Occurs after an fdbg_symbol entry, for each dimension.
|
|
typedef struct sp_fdbg_arraydim_s
|
|
{
|
|
int16_t tagid; /**< Tag id */
|
|
uint32_t size; /**< Size of dimension */
|
|
} sp_fdbg_arraydim_t;
|
|
|
|
// Typedef for the ".names" section.
|
|
typedef char * sp_file_nametab_t;
|
|
|
|
// Header for the ".dbg.natives" section. It is followed by a number of
|
|
// sp_fdbg_native_t entries.
|
|
typedef struct sp_fdbg_ntvtab_s
|
|
{
|
|
uint32_t num_entries; /**< Number of entries. */
|
|
} sp_fdbg_ntvtab_t;
|
|
|
|
// An entry in the .dbg.natives section. Each is followed by an
|
|
// sp_fdbg_ntvarg_t for each argument.
|
|
typedef struct sp_fdbg_native_s
|
|
{
|
|
uint32_t index; /**< Native index in the plugin. */
|
|
uint32_t name; /**< Offset into debug nametable. */
|
|
int16_t tagid; /**< Return tag. */
|
|
uint16_t nargs; /**< Number of formal arguments. */
|
|
} sp_fdbg_native_t;
|
|
|
|
static const uint8_t IDENT_NATIVE_VARARGS = 1;
|
|
|
|
// Each entry is followed by an sp_fdbg_arraydim_t for each dimcount.
|
|
typedef struct sp_fdbg_ntvarg_s
|
|
{
|
|
uint8_t ident; /**< Variable type */
|
|
int16_t tagid; /**< Tag id */
|
|
uint16_t dimcount; /**< Dimension count (for arrays) */
|
|
uint32_t name; /**< Offset into debug nametable */
|
|
} sp_fdbg_ntvarg_t;
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
// DO NOT DEFINE NEW STRUCTURES BELOW.
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
#if defined __GNUC__
|
|
# pragma pack() /* reset default packing */
|
|
#else
|
|
# pragma pack(pop) /* reset previous packing */
|
|
#endif
|
|
|
|
// The packing for files changed by accident for a small window of time, and
|
|
// some files may have unparsable debug information using sp_fdbg_arraydim_t or
|
|
// sp_fdbg_symbol_t.
|
|
//
|
|
// If the file version is >= 0x0102, all structures will be packed. If the
|
|
// file version is < 0x0101, and the ".dbg.natives" table is present,
|
|
// all structures will be packed.
|
|
//
|
|
// If the version is 0x0101 and ".dbg.natives" is not present, then you must
|
|
// use the unpacked versions of those structures below. There is an extremely
|
|
// small chance, if the plugin used no natives, that the packing is
|
|
// indeterminate. This case is unlikely to be interesting, but if such a file
|
|
// exists, the only solution is to re-parse if the data looks corrupt.
|
|
|
|
typedef struct sp_u_fdbg_arraydim_s
|
|
{
|
|
int16_t tagid; /**< Tag id */
|
|
uint32_t size; /**< Size of dimension */
|
|
} sp_u_fdbg_arraydim_t;
|
|
|
|
typedef struct sp_u_fdbg_symbol_s
|
|
{
|
|
int32_t addr; /**< Address rel to DAT or stack frame */
|
|
int16_t tagid; /**< Tag id */
|
|
uint32_t codestart; /**< Start scope validity in code */
|
|
uint32_t codeend; /**< End scope validity in code */
|
|
uint8_t ident; /**< Variable type */
|
|
uint8_t vclass; /**< Scope class (local vs global) */
|
|
uint16_t dimcount; /**< Dimension count (for arrays) */
|
|
uint32_t name; /**< Offset into debug nametable */
|
|
} sp_u_fdbg_symbol_t;
|
|
|
|
} // namespace sp
|
|
|
|
#endif //_INCLUDE_SPFILE_HEADERS_v1_H
|
|
|