Introduced DBG_VALUE struct to manipulate debugger/debuggee address space.
Added watch (hardware assisted debugging) and whatis (type of expr) commands.
Fixed some issues in local vars handling (stabs parsing & registers optimization).
diff --git a/debugger/debugger.h b/debugger/debugger.h
index 1f3d02c..104bfde 100644
--- a/debugger/debugger.h
+++ b/debugger/debugger.h
@@ -8,11 +8,12 @@
#define __WINE_DEBUGGER_H
#include <sys/types.h> /* u_long ... */
+#include <assert.h>
#include "windef.h"
#include "winbase.h"
#ifdef __i386__
-#define STEP_FLAG 0x100 /* single step flag */
+#define STEP_FLAG 0x00000100 /* single step flag */
#define V86_FLAG 0x00020000
#endif
@@ -46,11 +47,20 @@
typedef struct
{
- struct datatype * type;
- DWORD seg; /* 0xffffffff means current default segment (cs or ds) */
- DWORD off;
+ DWORD seg; /* 0xffffffff means current default segment (cs or ds) */
+ DWORD off;
} DBG_ADDR;
+#define DV_TARGET 0xF00D
+#define DV_HOST 0x50DA
+
+typedef struct
+{
+ struct datatype* type;
+ int cookie; /* DV_??? */
+ DBG_ADDR addr;
+} DBG_VALUE;
+
struct list_id
{
char * sourcefile;
@@ -101,15 +111,27 @@
* instr just after the call.
*/
};
-
+
+#define DBG_BREAK 0
+#define DBG_WATCH 1
+
typedef struct
{
DBG_ADDR addr;
- BYTE addrlen;
- BYTE opcode;
- WORD skipcount;
WORD enabled : 1,
- refcount;
+ type : 1,
+ is32 : 1,
+ refcount : 13;
+ WORD skipcount;
+ union {
+ BYTE opcode;
+ struct {
+ BYTE rw : 1,
+ len : 2;
+ BYTE reg;
+ DWORD oldval;
+ } w;
+ } u;
struct expr * condition;
} BREAKPOINT;
@@ -171,8 +193,8 @@
/* debugger/break.c */
extern void DEBUG_SetBreakpoints( BOOL set );
-extern int DEBUG_FindBreakpoint( const DBG_ADDR *addr );
-extern void DEBUG_AddBreakpoint( const DBG_ADDR *addr );
+extern void DEBUG_AddBreakpoint( const DBG_VALUE *addr );
+extern void DEBUG_AddWatchpoint( const DBG_VALUE *addr, int is_write );
extern void DEBUG_DelBreakpoint( int num );
extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
extern void DEBUG_InfoBreakpoints(void);
@@ -181,6 +203,7 @@
extern void DEBUG_SuspendExecution( void );
extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
extern BOOL DEBUG_IsFctReturn(void);
+extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
/* debugger/db_disasm.c */
extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
@@ -200,15 +223,11 @@
struct expr * DEBUG_ArrayExpr(struct expr *, struct expr * index);
struct expr * DEBUG_CallExpr(const char *, int nargs, ...);
struct expr * DEBUG_TypeCastExpr(struct datatype *, struct expr *);
-extern int DEBUG_ExprValue(const DBG_ADDR *, unsigned int *);
-extern DBG_ADDR DEBUG_EvalExpr(struct expr *);
+extern DBG_VALUE DEBUG_EvalExpr(struct expr *);
extern int DEBUG_DelDisplay(int displaynum);
-extern struct expr * DEBUG_CloneExpr(struct expr * exp);
+extern struct expr * DEBUG_CloneExpr(const struct expr * exp);
extern int DEBUG_FreeExpr(struct expr * exp);
-extern int DEBUG_DisplayExpr(struct expr * exp);
-
- /* more debugger/break.c */
-extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
+extern int DEBUG_DisplayExpr(const struct expr * exp);
/* debugger/display.c */
extern int DEBUG_DoDisplay(void);
@@ -219,15 +238,12 @@
/* debugger/hash.c */
extern struct name_hash * DEBUG_AddSymbol( const char *name,
- const DBG_ADDR *addr,
- const char * sourcefile,
+ const DBG_VALUE *addr,
+ const char *sourcefile,
int flags);
-extern struct name_hash * DEBUG_AddInvSymbol( const char *name,
- const DBG_ADDR *addr,
- const char * sourcefile);
extern BOOL DEBUG_GetSymbolValue( const char * name, const int lineno,
- DBG_ADDR *addr, int );
-extern BOOL DEBUG_SetSymbolValue( const char * name, const DBG_ADDR *addr );
+ DBG_VALUE *addr, int );
+extern BOOL DEBUG_SetSymbolValue( const char * name, const DBG_VALUE *addr );
extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
struct name_hash ** rtn,
unsigned int ebp,
@@ -235,7 +251,7 @@
extern void DEBUG_ReadSymbolTable( const char * filename );
extern int DEBUG_LoadEntryPoints( const char * prefix );
extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num,
- unsigned long offset );
+ unsigned long offset );
extern struct wine_locals *
DEBUG_AddLocal( struct name_hash * func, int regno,
int offset,
@@ -250,14 +266,14 @@
extern int DEBUG_GetSymbolAddr(struct name_hash * sym, DBG_ADDR * addr);
extern int DEBUG_cmp_sym(const void * p1, const void * p2);
extern BOOL DEBUG_GetLineNumberAddr( struct name_hash *, const int lineno,
- DBG_ADDR *addr, int bp_flag );
+ DBG_ADDR *addr, int bp_flag );
extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
struct datatype * type);
BOOL DEBUG_Normalize(struct name_hash * nh );
/* debugger/info.c */
-extern void DEBUG_PrintBasic( const DBG_ADDR *addr, int count, char format );
+extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );
extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr,
int addrlen, int flag );
extern void DEBUG_Help(void);
@@ -282,7 +298,7 @@
/* debugger/memory.c */
extern int DEBUG_ReadMemory( const DBG_ADDR *address );
extern void DEBUG_WriteMemory( const DBG_ADDR *address, int value );
-extern void DEBUG_ExamineMemory( const DBG_ADDR *addr, int count, char format);
+extern void DEBUG_ExamineMemory( const DBG_VALUE *addr, int count, char format);
extern void DEBUG_InvalLinAddr( void* addr );
#ifdef __i386__
extern void DEBUG_GetCurrentAddress( DBG_ADDR * );
@@ -311,7 +327,8 @@
/* debugger/stabs.c */
extern int DEBUG_ReadExecutableDbgInfo(void);
-extern int DEBUG_ParseStabs(char * addr, unsigned int load_offset, unsigned int staboff, int stablen, unsigned int strtaboff, int strtablen);
+extern int DEBUG_ParseStabs(char * addr, unsigned int load_offset, unsigned int staboff,
+ int stablen, unsigned int strtaboff, int strtablen);
/* debugger/msc.c */
extern int DEBUG_RegisterDebugInfo( HMODULE, const char *);
@@ -325,8 +342,7 @@
extern void DEBUG_InitTypes(void);
extern struct datatype * DEBUG_NewDataType(enum debug_type xtype,
const char * typename);
-extern unsigned int
-DEBUG_TypeDerefPointer(const DBG_ADDR * addr, struct datatype ** newtype);
+extern unsigned int DEBUG_TypeDerefPointer(const DBG_VALUE *value, struct datatype ** newtype);
extern int DEBUG_AddStructElement(struct datatype * dt,
char * name, struct datatype * type,
int offset, int size);
@@ -334,20 +350,21 @@
extern int DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2);
extern int DEBUG_SetArrayParams(struct datatype * dt, int min, int max,
struct datatype * dt2);
-extern void DEBUG_Print( const DBG_ADDR *addr, int count, char format, int level );
-extern unsigned int DEBUG_FindStructElement(DBG_ADDR * addr,
+extern void DEBUG_Print( const DBG_VALUE *addr, int count, char format, int level );
+extern unsigned int DEBUG_FindStructElement(DBG_VALUE * addr,
const char * ele_name, int * tmpbuf);
extern struct datatype * DEBUG_GetPointerType(struct datatype * dt);
extern int DEBUG_GetObjectSize(struct datatype * dt);
-extern unsigned int DEBUG_ArrayIndex(const DBG_ADDR * addr, DBG_ADDR * result, int index);
+extern unsigned int DEBUG_ArrayIndex(const DBG_VALUE * addr, DBG_VALUE * result, int index);
extern struct datatype * DEBUG_FindOrMakePointerType(struct datatype * reftype);
-extern long long int DEBUG_GetExprValue(const DBG_ADDR * addr, char ** format);
+extern long long int DEBUG_GetExprValue(const DBG_VALUE * addr, char ** format);
extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset,
int nbits, struct datatype * dt2);
extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
extern enum debug_type DEBUG_GetType(struct datatype * dt);
extern struct datatype * DEBUG_TypeCast(enum debug_type, const char *);
-extern int DEBUG_PrintTypeCast(struct datatype *);
+extern int DEBUG_PrintTypeCast(const struct datatype *);
+extern int DEBUG_PrintType( const DBG_VALUE* addr );
/* debugger/source.c */
extern void DEBUG_ShowDir(void);
@@ -355,7 +372,7 @@
extern void DEBUG_List(struct list_id * line1, struct list_id * line2,
int delta);
extern void DEBUG_NukePath(void);
-extern void DEBUG_Disassemble( const DBG_ADDR *, const DBG_ADDR*, int offset );
+extern void DEBUG_Disassemble( const DBG_VALUE *, const DBG_VALUE*, int offset );
/* debugger/external.c */
extern void DEBUG_ExternalDebugger(void);
@@ -390,6 +407,10 @@
extern HANDLE dbg_heap;
#endif
-#define DEBUG_STATUS_NO_SYMBOL 0x80003000
+#define DEBUG_STATUS_OFFSET 0x80003000
+#define DEBUG_STATUS_INTERNAL_ERROR (DEBUG_STATUS_OFFSET+0)
+#define DEBUG_STATUS_NO_SYMBOL (DEBUG_STATUS_OFFSET+1)
+#define DEBUG_STATUS_DIV_BY_ZERO (DEBUG_STATUS_OFFSET+2)
+#define DEBUG_STATUS_BAD_TYPE (DEBUG_STATUS_OFFSET+3)
#endif /* __WINE_DEBUGGER_H */