/tags/rel-1-3-26/SWIG/Tools/WAD/Include/wad.h
C++ Header | 269 lines | 183 code | 57 blank | 29 comment | 0 complexity | 5c0bb841f0d0bce0f6d09efb26d1b232 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
1/* ----------------------------------------------------------------------------- 2 * wad.h 3 * 4 * WAD header file (obviously) 5 * 6 * Author(s) : David Beazley (beazley@cs.uchicago.edu) 7 * 8 * Copyright (C) 2001. University of Chicago. All rights reserved. 9 * 10 * $Header$ 11 * ----------------------------------------------------------------------------- */ 12 13#include <stdio.h> 14#include <unistd.h> 15#include <signal.h> 16#include <stdlib.h> 17#include <string.h> 18#include <fcntl.h> 19#include <limits.h> 20#include <sys/mman.h> 21#include <ctype.h> 22#include <sys/ucontext.h> 23 24#ifdef WAD_SOLARIS 25#include <procfs.h> 26 27#endif 28 29#ifdef __cplusplus 30extern "C" { 31#endif 32 33 /* Core datatypes */ 34 35 typedef int int32; 36 typedef unsigned uint32; 37 typedef short int16; 38 typedef unsigned short uint16; 39 typedef signed char int8; 40 typedef unsigned char uint8; 41 42 43#ifndef MAX_PATH 44#define MAX_PATH 1024 45#endif 46 47#define WAD_SRC_WINDOW 2 48 49/* --- Low level memory management functions --- */ 50 51extern int wad_memory_init(); 52extern void *wad_malloc(int nbytes); 53extern char *wad_strdup(const char *c); 54extern void wad_memory_debug(); 55extern void wad_memcpy(void *t, const void *s, unsigned len); 56 57 /* --- Low level string handling --- */ 58 59extern char *wad_string_lookup(char *s); 60extern void wad_string_debug(); 61extern char *wad_strcpy(char *t, const char *s); 62extern char *wad_strcat(char *t, const char *s); 63extern int wad_strlen(const char *s); 64 65/* --- I/O, Debugging --- */ 66 67extern void wad_printf(const char *fmt, ...); 68extern char *wad_format_hex(unsigned long u, int leading); 69extern char *wad_format_unsigned(unsigned long u, int width); 70extern char *wad_format_signed(long s, int width); 71 72/* --- Memory segments --- */ 73typedef struct WadSegment { 74 char *base; /* Base address for symbol lookup */ 75 char *vaddr; /* Virtual address start */ 76 unsigned long size; /* Size of the segment (bytes) */ 77 unsigned long offset; /* Offset into mapped object */ 78 char *mapname; /* Filename mapped to this region */ 79 char *mappath; /* Full path to mapname */ 80 struct WadSegment *next; /* Next segment */ 81} WadSegment; 82 83extern int wad_segment_read(); 84extern WadSegment *wad_segment_find(void *vaddr); 85extern int wad_segment_valid(void *vaddr); 86 87/* --- Object files --- */ 88typedef struct WadObjectFile { 89 void *ptr; /* Pointer to data */ 90 int len; /* Length of data */ 91 int type; /* Type of the object file */ 92 char *path; /* Path name of this object */ 93 struct WadObjectFile *next; 94} WadObjectFile; 95 96extern void wad_object_reset(); 97extern WadObjectFile *wad_object_load(const char *path); 98extern int wad_file_check(void *); 99 100#define SYM_LOCAL 1 101#define SYM_GLOBAL 2 102 103/* Signal handling */ 104extern void wad_init(); 105extern void wad_signalhandler(int, siginfo_t *, void *); 106extern void wad_signal_init(); 107extern void wad_signal_clear(); 108extern void wad_set_return(const char *name, long value); 109extern void wad_set_return_value(long value); 110extern void wad_set_return_func(void (*f)(void)); 111 112typedef struct WadLocal { 113 char *name; /* Name of the local */ 114 void *ptr; /* Pointer to the actual data (if known) */ 115 int size; /* Size of the data (if known) */ 116 int type; /* Data type */ 117 118 /* Debugging information */ 119 120 int loc; /* Location: register or stack */ 121 int stack; /* location on the stack */ 122 int reg; /* Register number */ 123 int line; /* Line number where defined */ 124 struct WadLocal *next; 125} WadLocal; 126 127#define PARM_REGISTER 1 128#define PARM_STACK 2 129 130/* Type codes for local variables */ 131 132#define WAD_TYPE_UNKNOWN 0 133#define WAD_TYPE_INT32 1 134#define WAD_TYPE_INT16 2 135#define WAD_TYPE_INT8 3 136#define WAD_TYPE_INT64 4 137#define WAD_TYPE_UINT32 5 138#define WAD_TYPE_UINT16 6 139#define WAD_TYPE_UINT8 7 140#define WAD_TYPE_UINT64 8 141#define WAD_TYPE_FLOAT 9 142#define WAD_TYPE_DOUBLE 10 143#define WAD_TYPE_POINTER 11 144#define WAD_TYPE_CHAR 12 145 146extern long wad_local_as_long(WadLocal *loc); 147extern double wad_local_as_double(WadLocal *loc); 148 149/* Data structure containing information about each stack frame */ 150 151typedef struct WadFrame { 152 long frameno; /* Frame number */ 153 struct WadFrame *next; /* Next frame up the stack */ 154 struct WadFrame *prev; /* Previous frame down the stack */ 155 156 /* Stack context information */ 157 long pc; /* Real PC */ 158 long sp; /* Real SP */ 159 long fp; /* Real FP */ 160 char *stack; /* Pointer to where a copy of the stack frame is stored */ 161 int stack_size; /* Stack frame size (fp-sp) */ 162 163 /* Loading information. Contains information from /proc as well as a pointer to 164 the executable or shared library in which the PC is located */ 165 166 WadSegment *segment; /* Memory segment corresponding to PC */ 167 WadObjectFile *object; /* Object file corresponding to PC */ 168 169 /* Symbol table information for PC */ 170 171 char *sym_name; /* Symbol name */ 172 int sym_nlen; /* Symbol name length */ 173 char *sym_file; /* Source file (if any) */ 174 unsigned long sym_base; /* Symbol base address */ 175 unsigned long sym_size; /* Symbol size */ 176 int sym_type; /* Symbol type */ 177 int sym_bind; /* Symbol binding */ 178 179 /* Location information */ 180 char *loc_objfile; /* Object filename */ 181 char *loc_srcfile; /* Source filename */ 182 int loc_line; /* Source line */ 183 184 /* Debugging information */ 185 int debug_check; /* Checked debugging information */ 186 int debug_nargs; /* Number of arguments */ 187 WadLocal *debug_args; /* Arguments */ 188 WadLocal *debug_lastarg; /* Last argument */ 189 int debug_nlocals; /* Number of locals */ 190 WadLocal *debug_locals; /* Local variables */ 191 WadLocal *debug_lastlocal; /* Last local */ 192 193 /* Output strings */ 194 char *debug_str; /* Debugging string */ 195 char *debug_srcstr; /* Source string */ 196 197 int last; /* Last frame flag */ 198} WadFrame; 199 200extern WadFrame *wad_stack_trace(unsigned long, unsigned long, unsigned long); 201extern void wad_stack_debug(WadFrame *f); 202 203extern char *wad_strip_dir(char *); 204extern void wad_default_callback(int signo, WadFrame *frame, char *ret); 205extern void wad_dump_trace(int fd, int signo, WadFrame *frame, char *ret); 206 207extern void wad_set_callback(void (*h)(int, WadFrame *, char *)); 208extern char *wad_load_source(char *, int line); 209extern void wad_release_source(); 210extern void wad_release_trace(); 211extern long wad_steal_arg(WadFrame *f, char *symbol, int argno, int *error); 212extern long wad_steal_outarg(WadFrame *f, char *symbol, int argno, int *error); 213 214extern char *wad_arg_string(WadFrame *f); 215 216typedef struct { 217 char name[128]; 218 long value; 219} WadReturnFunc; 220 221extern void wad_set_returns(WadReturnFunc *rf); 222extern WadReturnFunc *wad_check_return(const char *name); 223 224extern int wad_search_stab(void *stab, int size, char *stabstr, WadFrame *f); 225 226extern void wad_find_object(WadFrame *f); 227extern void wad_find_symbol(WadFrame *f); 228extern void wad_find_debug(WadFrame *f); 229extern void wad_build_vars(WadFrame *f); 230extern char *wad_format_var(WadLocal *l); 231 232extern void wad_debug_make_strings(WadFrame *f); 233 234/* --- Debugging Interface --- */ 235 236#define DEBUG_SEGMENT 0x1 237#define DEBUG_SYMBOL 0x2 238#define DEBUG_STABS 0x4 239#define DEBUG_OBJECT 0x8 240#define DEBUG_FILE 0x10 241#define DEBUG_HOLD 0x20 242#define DEBUG_RETURN 0x40 243#define DEBUG_SYMBOL_SEARCH 0x80 244#define DEBUG_INIT 0x100 245#define DEBUG_NOSTACK 0x200 246#define DEBUG_ONESHOT 0x400 247#define DEBUG_STACK 0x800 248#define DEBUG_UNWIND 0x1000 249#define DEBUG_SIGNAL 0x2000 250#define DEBUG_STRING 0x4000 251#define DEBUG_MEMORY 0x8000 252 253extern int wad_debug_mode; 254extern int wad_heap_overflow; 255 256#ifdef WAD_LINUX 257#define WAD_LITTLE_ENDIAN 258#endif 259#ifdef WAD_SOLARIS 260#define WAD_BIG_ENDIAN 261#endif 262 263#ifdef __cplusplus 264} 265#endif 266 267 268 269