A couple of optimizations.
[wine/multimedia.git] / debugger / debugger.h
blob567b9497b7ea5a78f84ef903cf2b88acf4583045
1 /*
2 * Debugger definitions
4 * Copyright 1995 Alexandre Julliard
5 */
7 #ifndef __WINE_DEBUGGER_H
8 #define __WINE_DEBUGGER_H
10 #include <sys/types.h> /* u_long ... */
11 #include <assert.h>
12 #include "windef.h"
13 #include "winbase.h"
14 #include "wine/exception.h"
16 #ifdef __i386__
17 #define STEP_FLAG 0x00000100 /* single step flag */
18 #define V86_FLAG 0x00020000
19 #endif
21 #define SYM_FUNC 0x0
22 #define SYM_DATA 0x1
23 #define SYM_WIN32 0x2
24 #define SYM_WINE 0x4
25 #define SYM_INVALID 0x8
26 #define SYM_TRAMPOLINE 0x10
27 #define SYM_STEP_THROUGH 0x20
29 enum debug_type {DT_BASIC, DT_POINTER, DT_ARRAY, DT_STRUCT, DT_ENUM,
30 DT_FUNC, DT_BITFIELD};
34 * Return values for DEBUG_CheckLinenoStatus. Used to determine
35 * what to do when the 'step' command is given.
37 #define FUNC_HAS_NO_LINES (0)
38 #define NOT_ON_LINENUMBER (1)
39 #define AT_LINENUMBER (2)
40 #define FUNC_IS_TRAMPOLINE (3)
43 * For constants generated by the parser, we use this datatype
45 extern struct datatype * DEBUG_TypeShortUInt;
46 extern struct datatype * DEBUG_TypeInt;
47 extern struct datatype * DEBUG_TypeIntConst;
48 extern struct datatype * DEBUG_TypeUSInt;
49 extern struct datatype * DEBUG_TypeString;
51 typedef struct
53 DWORD seg; /* 0xffffffff means current default segment (cs or ds) */
54 DWORD off;
55 } DBG_ADDR;
57 typedef struct
59 struct datatype* type;
60 int cookie; /* DV_??? */
61 /* DV_TARGET references an address in debugger's address space, whereas DV_HOST
62 * references the debuggee address space
64 # define DV_TARGET 0xF00D
65 # define DV_HOST 0x50DA
66 # define DV_INVALID 0x0000
68 DBG_ADDR addr;
69 } DBG_VALUE;
71 struct list_id
73 char * sourcefile;
74 int line;
77 struct wine_lines {
78 unsigned long line_number;
79 DBG_ADDR pc_offset;
82 struct symbol_info
84 struct name_hash * sym;
85 struct list_id list;
88 typedef struct wine_lines WineLineNo;
91 * This structure holds information about stack variables, function
92 * parameters, and register variables, which are all local to this
93 * function.
95 struct wine_locals {
96 unsigned int regno:8; /* For register symbols */
97 signed int offset:24; /* offset from esp/ebp to symbol */
98 unsigned int pc_start; /* For RBRAC/LBRAC */
99 unsigned int pc_end; /* For RBRAC/LBRAC */
100 char * name; /* Name of symbol */
101 struct datatype * type; /* Datatype of symbol */
104 typedef struct wine_locals WineLocals;
106 enum exec_mode
108 EXEC_CONT, /* Continuous execution */
109 EXEC_PASS, /* Continue, passing exception to app */
110 EXEC_STEP_OVER, /* Stepping over a call to next source line */
111 EXEC_STEP_INSTR, /* Step to next source line, stepping in if needed */
112 EXEC_STEPI_OVER, /* Stepping over a call */
113 EXEC_STEPI_INSTR, /* Single-stepping an instruction */
114 EXEC_FINISH, /* Step until we exit current frame */
115 EXEC_STEP_OVER_TRAMPOLINE, /* Step over trampoline. Requires that
116 * we dig the real return value off the stack
117 * and set breakpoint there - not at the
118 * instr just after the call.
122 #define DBG_BREAK 0
123 #define DBG_WATCH 1
125 typedef struct
127 DBG_ADDR addr;
128 WORD enabled : 1,
129 type : 1,
130 is32 : 1,
131 refcount : 13;
132 WORD skipcount;
133 union {
134 struct {
135 BYTE opcode;
136 BOOL (*func)(void);
137 } b;
138 struct {
139 BYTE rw : 1,
140 len : 2;
141 BYTE reg;
142 DWORD oldval;
143 } w;
144 } u;
145 struct expr * condition;
146 } DBG_BREAKPOINT;
148 enum dbg_mode
150 MODE_INVALID, MODE_16, MODE_32, MODE_VM86
155 /* Wine extension; Windows doesn't have a name for this code. This is an
156 undocumented exception understood by MS VC debugger, allowing the program
157 to name a particular thread. Search google.com or deja.com for "0x406d1388"
158 for more info. */
159 #define EXCEPTION_NAME_THREAD 0x406D1388
161 /* Helper structure */
162 typedef struct tagTHREADNAME_INFO
164 DWORD dwType; /* Must be 0x1000 */
165 LPCTSTR szName; /* Pointer to name - limited to 9 bytes (8 characters + terminator) */
166 DWORD dwThreadID; /* Thread ID (-1 = caller thread) */
167 DWORD dwFlags; /* Reserved for future use. Must be zero. */
168 } THREADNAME_INFO;
170 typedef struct tagDBG_THREAD {
171 struct tagDBG_PROCESS* process;
172 HANDLE handle;
173 DWORD tid;
174 LPVOID start;
175 LPVOID teb;
176 int wait_for_first_exception;
177 enum dbg_mode dbg_mode;
178 enum exec_mode dbg_exec_mode;
179 int dbg_exec_count;
180 DBG_BREAKPOINT stepOverBP;
181 char name[9];
182 struct tagDBG_THREAD* next;
183 struct tagDBG_THREAD* prev;
184 } DBG_THREAD;
186 typedef struct tagDBG_DELAYED_BP {
187 int lineno;
188 char* name;
189 } DBG_DELAYED_BP;
191 typedef struct tagDBG_PROCESS {
192 HANDLE handle;
193 DWORD pid;
194 const char* imageName;
195 DBG_THREAD* threads;
196 int num_threads;
197 unsigned continue_on_first_exception;
198 struct tagDBG_MODULE** modules;
199 int num_modules;
200 unsigned long dbg_hdr_addr;
201 DBG_DELAYED_BP* delayed_bp;
202 int num_delayed_bp;
204 * This is an index we use to keep track of the debug information
205 * when we have multiple sources. We use the same database to also
206 * allow us to do an 'info shared' type of deal, and we use the index
207 * to eliminate duplicates.
209 int next_index;
210 struct tagDBG_PROCESS* next;
211 struct tagDBG_PROCESS* prev;
212 } DBG_PROCESS;
214 extern DBG_PROCESS* DEBUG_CurrProcess;
215 extern DBG_THREAD* DEBUG_CurrThread;
216 extern DWORD DEBUG_CurrTid;
217 extern DWORD DEBUG_CurrPid;
218 extern CONTEXT DEBUG_context;
219 extern BOOL DEBUG_interactiveP;
221 #define DEBUG_READ_MEM(addr, buf, len) \
222 (ReadProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
224 #define DEBUG_WRITE_MEM(addr, buf, len) \
225 (WriteProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
227 #define DEBUG_READ_MEM_VERBOSE(addr, buf, len) \
228 (DEBUG_READ_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
230 #define DEBUG_WRITE_MEM_VERBOSE(addr, buf, len) \
231 (DEBUG_WRITE_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
233 enum DbgInfoLoad {DIL_DEFERRED, DIL_LOADED, DIL_NOINFO, DIL_ERROR};
234 enum DbgModuleType {DMT_UNKNOWN, DMT_ELF, DMT_NE, DMT_PE};
236 typedef struct tagDBG_MODULE {
237 void* load_addr;
238 unsigned long size;
239 char* module_name;
240 enum DbgInfoLoad dil;
241 enum DbgModuleType type;
242 unsigned short main : 1;
243 short int dbg_index;
244 HMODULE handle;
245 struct tagMSC_DBG_INFO* msc_info;
246 struct tagELF_DBG_INFO* elf_info;
247 } DBG_MODULE;
249 typedef struct {
250 DWORD val;
251 const char* name;
252 LPDWORD pval;
253 struct datatype* type;
254 } DBG_INTVAR;
256 #define OFFSET_OF(__c,__f) ((int)(((char*)&(((__c*)0)->__f))-((char*)0)))
258 /* from winelib.so */
259 extern void DEBUG_ExternalDebugger(void);
261 /* debugger/break.c */
262 extern void DEBUG_SetBreakpoints( BOOL set );
263 extern void DEBUG_AddBreakpoint( const DBG_VALUE *addr, BOOL (*func)(void) );
264 extern void DEBUG_AddBreakpointFromId( const char *name, int lineno );
265 extern void DEBUG_AddBreakpointFromLineno( int lineno );
266 extern void DEBUG_AddWatchpoint( const DBG_VALUE *addr, int is_write );
267 extern void DEBUG_AddWatchpointFromId( const char *name );
268 extern void DEBUG_CheckDelayedBP( void );
269 extern void DEBUG_DelBreakpoint( int num );
270 extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
271 extern void DEBUG_InfoBreakpoints(void);
272 extern BOOL DEBUG_HandleTrap(void);
273 extern BOOL DEBUG_ShouldContinue( DBG_ADDR *addr, DWORD code, enum exec_mode mode,
274 int * count );
275 extern void DEBUG_SuspendExecution( void );
276 extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
277 extern BOOL DEBUG_IsFctReturn(void);
278 extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
280 /* debugger/db_disasm.c */
281 extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
283 /* debugger/dbg.y */
284 extern BOOL DEBUG_Parser(void);
285 extern void DEBUG_Exit( DWORD );
287 /* debugger/debug.l */
288 extern void DEBUG_FlushSymbols(void);
289 extern char*DEBUG_MakeSymbol(const char*);
291 /* debugger/display.c */
292 extern int DEBUG_DoDisplay(void);
293 extern int DEBUG_AddDisplay(struct expr * exp, int count, char format);
294 extern int DEBUG_DoDisplay(void);
295 extern int DEBUG_DelDisplay(int displaynum);
296 extern int DEBUG_InfoDisplay(void);
298 /* debugger/editline.c */
299 extern char * readline(const char *);
300 extern void add_history(char *);
302 /* debugger/expr.c */
303 extern void DEBUG_FreeExprMem(void);
304 struct expr * DEBUG_IntVarExpr(const char* name);
305 struct expr * DEBUG_SymbolExpr(const char * name);
306 struct expr * DEBUG_ConstExpr(int val);
307 struct expr * DEBUG_StringExpr(const char * str);
308 struct expr * DEBUG_SegAddr(struct expr *, struct expr *);
309 struct expr * DEBUG_USConstExpr(unsigned int val);
310 struct expr * DEBUG_BinopExpr(int oper, struct expr *, struct expr *);
311 struct expr * DEBUG_UnopExpr(int oper, struct expr *);
312 struct expr * DEBUG_StructPExpr(struct expr *, const char * element);
313 struct expr * DEBUG_StructExpr(struct expr *, const char * element);
314 struct expr * DEBUG_ArrayExpr(struct expr *, struct expr * index);
315 struct expr * DEBUG_CallExpr(const char *, int nargs, ...);
316 struct expr * DEBUG_TypeCastExpr(struct datatype *, struct expr *);
317 extern DBG_VALUE DEBUG_EvalExpr(struct expr *);
318 extern int DEBUG_DelDisplay(int displaynum);
319 extern struct expr * DEBUG_CloneExpr(const struct expr * exp);
320 extern int DEBUG_FreeExpr(struct expr * exp);
321 extern int DEBUG_DisplayExpr(const struct expr * exp);
323 /* debugger/hash.c */
324 extern struct name_hash * DEBUG_AddSymbol( const char *name,
325 const DBG_VALUE *addr,
326 const char *sourcefile,
327 int flags);
328 extern int DEBUG_GetSymbolValue( const char * name, const int lineno,
329 DBG_VALUE *addr, int );
330 extern BOOL DEBUG_SetSymbolValue( const char * name, const DBG_VALUE *addr );
331 extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
332 struct name_hash ** rtn,
333 unsigned int ebp,
334 struct list_id * source);
335 extern void DEBUG_ReadSymbolTable( const char * filename );
336 extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num,
337 unsigned long offset );
338 extern struct wine_locals *
339 DEBUG_AddLocal( struct name_hash * func, int regno,
340 int offset,
341 int pc_start,
342 int pc_end,
343 char * name);
344 extern int DEBUG_CheckLinenoStatus(const DBG_ADDR *addr);
345 extern void DEBUG_GetFuncInfo(struct list_id * ret, const char * file,
346 const char * func);
347 extern int DEBUG_SetSymbolSize(struct name_hash * sym, unsigned int len);
348 extern int DEBUG_SetSymbolBPOff(struct name_hash * sym, unsigned int len);
349 extern int DEBUG_GetSymbolAddr(struct name_hash * sym, DBG_ADDR * addr);
350 extern int DEBUG_cmp_sym(const void * p1, const void * p2);
351 extern BOOL DEBUG_GetLineNumberAddr( const struct name_hash *, const int lineno,
352 DBG_ADDR *addr, int bp_flag );
354 extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
355 struct datatype * type);
356 extern BOOL DEBUG_Normalize(struct name_hash * nh );
358 /* debugger/info.c */
359 extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );
360 extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr,
361 enum dbg_mode mode, int flag );
362 extern void DEBUG_Help(void);
363 extern void DEBUG_HelpInfo(void);
364 extern struct symbol_info DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr,
365 enum dbg_mode mode,
366 unsigned int ebp,
367 int flag );
368 extern void DEBUG_InfoClass(const char* clsName);
369 extern void DEBUG_WalkClasses(void);
370 extern void DEBUG_WalkModref(DWORD p);
371 extern void DEBUG_DumpModule(DWORD mod);
372 extern void DEBUG_WalkModules(void);
373 extern void DEBUG_WalkProcess(void);
374 extern void DEBUG_WalkThreads(void);
375 extern void DEBUG_DumpQueue(DWORD q);
376 extern void DEBUG_WalkQueues(void);
377 extern void DEBUG_InfoSegments(DWORD s, int v);
378 extern void DEBUG_InfoVirtual(void);
379 extern void DEBUG_InfoWindow(HWND hWnd);
380 extern void DEBUG_WalkWindows(HWND hWnd, int indent);
382 /* debugger/memory.c */
383 extern int DEBUG_ReadMemory( const DBG_VALUE* value );
384 extern void DEBUG_WriteMemory( const DBG_VALUE* val, int value );
385 extern void DEBUG_ExamineMemory( const DBG_VALUE *addr, int count, char format);
386 extern void DEBUG_InvalAddr( const DBG_ADDR* addr );
387 extern void DEBUG_InvalLinAddr( void* addr );
388 extern DWORD DEBUG_ToLinear( const DBG_ADDR *address );
389 extern void DEBUG_GetCurrentAddress( DBG_ADDR * );
390 extern BOOL DEBUG_GrabAddress( DBG_VALUE* value, BOOL fromCode );
391 extern enum dbg_mode DEBUG_GetSelectorType( WORD sel );
392 #ifdef __i386__
393 extern void DEBUG_FixAddress( DBG_ADDR *address, DWORD def );
394 extern int DEBUG_IsSelectorSystem( WORD sel );
395 #endif
397 /* debugger/module.c */
398 extern int DEBUG_LoadEntryPoints( const char * prefix );
399 extern void DEBUG_LoadModule32( const char* name, HANDLE hFile, DWORD base );
400 extern DBG_MODULE* DEBUG_AddModule(const char* name, enum DbgModuleType type,
401 void* mod_addr, u_long size, HMODULE hmod);
402 extern DBG_MODULE* DEBUG_FindModuleByName(const char* name, enum DbgModuleType type);
403 extern DBG_MODULE* DEBUG_FindModuleByHandle(HANDLE handle, enum DbgModuleType type);
404 extern DBG_MODULE* DEBUG_FindModuleByAddr(void* addr, enum DbgModuleType type);
405 extern DBG_MODULE* DEBUG_GetProcessMainModule(DBG_PROCESS* process);
406 extern DBG_MODULE* DEBUG_RegisterPEModule(HMODULE, u_long load_addr, u_long size,
407 const char* name);
408 extern DBG_MODULE* DEBUG_RegisterELFModule(u_long load_addr, u_long size,
409 const char* name);
410 extern enum DbgInfoLoad DEBUG_RegisterPEDebugInfo(DBG_MODULE* wmod, HANDLE hFile,
411 void* _nth, unsigned long nth_ofs);
412 extern void DEBUG_ReportDIL(enum DbgInfoLoad dil, const char* pfx,
413 const char* filename, DWORD load_addr);
414 extern void DEBUG_InfoShare(void);
416 /* debugger/msc.c */
417 extern enum DbgInfoLoad DEBUG_RegisterMSCDebugInfo(DBG_MODULE* module, HANDLE hFile,
418 void* nth, unsigned long nth_ofs);
419 extern enum DbgInfoLoad DEBUG_RegisterStabsDebugInfo(DBG_MODULE* module,
420 HANDLE hFile, void* nth,
421 unsigned long nth_ofs);
422 extern void DEBUG_InitCVDataTypes(void);
424 /* debugger/registers.c */
425 extern void DEBUG_InfoRegisters(void);
426 extern BOOL DEBUG_ValidateRegisters(void);
428 /* debugger/source.c */
429 extern void DEBUG_ShowDir(void);
430 extern void DEBUG_AddPath(const char * path);
431 extern void DEBUG_List(struct list_id * line1, struct list_id * line2,
432 int delta);
433 extern void DEBUG_NukePath(void);
434 extern void DEBUG_Disassemble(const DBG_VALUE *, const DBG_VALUE*, int offset);
435 extern BOOL DEBUG_DisassembleInstruction(DBG_ADDR *addr);
437 /* debugger/stack.c */
438 extern void DEBUG_InfoStack(void);
439 extern void DEBUG_BackTrace(DWORD threadID, BOOL noisy);
440 extern int DEBUG_InfoLocals(void);
441 extern int DEBUG_SetFrame(int newframe);
442 extern int DEBUG_GetCurrentFrame(struct name_hash ** name,
443 unsigned int * eip,
444 unsigned int * ebp);
446 /* debugger/stabs.c */
447 extern enum DbgInfoLoad DEBUG_ReadExecutableDbgInfo(const char* exe_name);
448 extern enum DbgInfoLoad DEBUG_ParseStabs(char * addr, unsigned int load_offset,
449 unsigned int staboff, int stablen,
450 unsigned int strtaboff, int strtablen);
452 /* debugger/types.c */
453 extern int DEBUG_nchar;
454 extern void DEBUG_InitTypes(void);
455 extern struct datatype * DEBUG_NewDataType(enum debug_type xtype,
456 const char * typename);
457 extern unsigned int DEBUG_TypeDerefPointer(const DBG_VALUE *value,
458 struct datatype ** newtype);
459 extern int DEBUG_AddStructElement(struct datatype * dt,
460 char * name, struct datatype * type,
461 int offset, int size);
462 extern int DEBUG_SetStructSize(struct datatype * dt, int size);
463 extern int DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2);
464 extern int DEBUG_SetArrayParams(struct datatype * dt, int min, int max,
465 struct datatype * dt2);
466 extern void DEBUG_Print( const DBG_VALUE *addr, int count, char format, int level );
467 extern unsigned int DEBUG_FindStructElement(DBG_VALUE * addr,
468 const char * ele_name, int * tmpbuf);
469 extern struct datatype * DEBUG_GetPointerType(struct datatype * dt);
470 extern int DEBUG_GetObjectSize(struct datatype * dt);
471 extern unsigned int DEBUG_ArrayIndex(const DBG_VALUE * addr, DBG_VALUE * result,
472 int index);
473 extern struct datatype * DEBUG_FindOrMakePointerType(struct datatype * reftype);
474 extern long long int DEBUG_GetExprValue(const DBG_VALUE * addr, char ** format);
475 extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset,
476 int nbits, struct datatype * dt2);
477 extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
478 extern enum debug_type DEBUG_GetType(struct datatype * dt);
479 extern struct datatype * DEBUG_TypeCast(enum debug_type, const char *);
480 extern int DEBUG_PrintTypeCast(const struct datatype *);
481 extern int DEBUG_PrintType( const DBG_VALUE* addr );
483 /* debugger/winedbg.c */
484 #define DBG_CHN_MESG 1
485 #define DBG_CHN_ERR 2
486 #define DBG_CHN_WARN 4
487 #define DBG_CHN_FIXME 8
488 #define DBG_CHN_TRACE 16
489 extern void DEBUG_Output(int chn, const char* buffer, int len);
490 #ifdef __GNUC__
491 extern int DEBUG_Printf(int chn, const char* format, ...) __attribute__((format (printf,2,3)));
492 #else
493 extern int DEBUG_Printf(int chn, const char* format, ...);
494 #endif
495 extern DBG_INTVAR* DEBUG_GetIntVar(const char*);
496 extern BOOL DEBUG_Attach(DWORD pid, BOOL cofe);
497 extern void DEBUG_Run(const char* args);
498 extern DBG_PROCESS* DEBUG_GetProcess(DWORD pid);
499 extern DBG_THREAD* DEBUG_GetThread(DBG_PROCESS* p, DWORD tid);
500 extern int curr_frame;
502 /* Choose your allocator! */
503 #if 1
504 /* this one is libc's fast one */
505 extern void* DEBUG_XMalloc(size_t size);
506 extern void* DEBUG_XReAlloc(void *ptr, size_t size);
507 extern char* DEBUG_XStrDup(const char *str);
509 #define DBG_alloc(x) DEBUG_XMalloc(x)
510 #define DBG_realloc(x,y) DEBUG_XReAlloc(x,y)
511 #define DBG_free(x) free(x)
512 #define DBG_strdup(x) DEBUG_XStrDup(x)
513 #else
514 /* this one is slow (takes 5 minutes to load the debugger on my machine),
515 but is pretty crash-proof (can step through malloc() without problems,
516 malloc() arena (and other heaps) can be totally wasted and it'll still
517 work, etc... if someone could make optimized routines so it wouldn't
518 take so long to load, it could be made default) */
519 #define DBG_alloc(x) HeapAlloc(dbg_heap,0,x)
520 #define DBG_realloc(x,y) HeapRealloc(dbg_heap,0,x,y)
521 #define DBG_free(x) HeapFree(dbg_heap,0,x)
522 inline static LPSTR DBG_strdup( LPCSTR str )
524 INT len = strlen(str) + 1;
525 LPSTR p = DBG_alloc( len );
526 if (p) memcpy( p, str, len );
527 return p;
529 #define DBG_need_heap
530 extern HANDLE dbg_heap;
531 #endif
533 #define DEBUG_STATUS_OFFSET 0x80003000
534 #define DEBUG_STATUS_INTERNAL_ERROR (DEBUG_STATUS_OFFSET+0)
535 #define DEBUG_STATUS_NO_SYMBOL (DEBUG_STATUS_OFFSET+1)
536 #define DEBUG_STATUS_DIV_BY_ZERO (DEBUG_STATUS_OFFSET+2)
537 #define DEBUG_STATUS_BAD_TYPE (DEBUG_STATUS_OFFSET+3)
538 #define DEBUG_STATUS_NO_FIELD (DEBUG_STATUS_OFFSET+4)
540 extern DBG_INTVAR DEBUG_IntVars[];
542 #define DBG_IVARNAME(_var) DEBUG_IV_##_var
543 #define DBG_IVARSTRUCT(_var) DEBUG_IntVars[DBG_IVARNAME(_var)]
544 #define DBG_IVAR(_var) (*(DBG_IVARSTRUCT(_var).pval))
545 #define INTERNAL_VAR(_var,_val,_ref,_typ) DBG_IVARNAME(_var),
546 enum debug_int_var {
547 #include "intvar.h"
548 DBG_IV_LAST
550 #undef INTERNAL_VAR
552 #endif /* __WINE_DEBUGGER_H */