Eric Pouech : dbghelp:
Add support for deref operation in location computation.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Nov 27 12:52:01 CST 2006
Module: wine
Branch: master
Commit: 4202a49b75846392c370674f6816897b29bb2ff7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4202a49b75846392c370674f6816897b29bb2ff7
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Fri Nov 24 22:18:04 2006 +0100
dbghelp: Add support for deref operation in location computation.
---
dlls/dbghelp/dwarf.c | 41 +++++++++++++++++++++++++++++++++++------
1 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index b8b05c4..93c011f 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -626,7 +626,7 @@ reg: fop 31
static enum location_error
compute_location(dwarf2_traverse_context_t* ctx, struct location* loc,
- const struct location* frame)
+ HANDLE hproc, const struct location* frame)
{
unsigned long stack[64];
unsigned stk;
@@ -720,6 +720,34 @@ compute_location(dwarf2_traverse_context
piece_found = TRUE;
}
break;
+ case DW_OP_deref:
+ if (!stk)
+ {
+ FIXME("Unexpected empty stack\n");
+ return loc_err_internal;
+ }
+ if (loc->reg != Wine_DW_no_register)
+ {
+ WARN("Too complex expression for deref\n");
+ return loc_err_too_complex;
+ }
+ if (hproc)
+ {
+ DWORD addr = stack[stk--];
+ DWORD deref;
+
+ if (!ReadProcessMemory(hproc, (void*)addr, &deref, sizeof(deref), NULL))
+ {
+ WARN("Couldn't read memory at %lx\n", addr);
+ return loc_err_cant_read;
+ }
+ stack[++stk] = deref;
+ }
+ else
+ {
+ loc->kind = loc_dwarf2_block;
+ }
+ break;
default:
FIXME("Unhandled attr op: %x\n", op);
return loc_err_internal;
@@ -765,7 +793,7 @@ static BOOL dwarf2_compute_location_attr
lctx.end_data = xloc.u.block.ptr + xloc.u.block.size;
lctx.word_size = ctx->word_size;
- err = compute_location(&lctx, loc, frame);
+ err = compute_location(&lctx, loc, NULL, frame);
if (err < 0)
{
loc->kind = loc_error;
@@ -1932,7 +1960,8 @@ static BOOL dwarf2_lookup_loclist(const
return FALSE;
}
-static enum location_error loc_compute_frame(const struct module* module,
+static enum location_error loc_compute_frame(struct process* pcs,
+ const struct module* module,
const struct symt_function* func,
DWORD ip, struct location* frame)
{
@@ -1960,7 +1989,7 @@ static enum location_error loc_compute_f
module->dwarf2_info->debug_loc.address + pframe->offset,
ip, &lctx))
return loc_err_out_of_scope;
- if ((err = compute_location(&lctx, frame, NULL)) < 0) return err;
+ if ((err = compute_location(&lctx, frame, pcs->handle, NULL)) < 0) return err;
if (frame->kind >= loc_user)
{
WARN("Couldn't compute runtime frame location\n");
@@ -1998,7 +2027,7 @@ static void dwarf2_location_compute(stru
/* instruction pointer relative to compiland's start */
ip = pcs->ctx_frame.InstructionOffset - ((struct symt_compiland*)func->container)->address;
- if ((err = loc_compute_frame(module, func, ip, &frame)) == 0)
+ if ((err = loc_compute_frame(pcs, module, func, ip, &frame)) == 0)
{
switch (loc->kind)
{
@@ -2021,7 +2050,7 @@ static void dwarf2_location_compute(stru
}
do_compute:
/* now get the variable */
- err = compute_location(&lctx, loc, &frame);
+ err = compute_location(&lctx, loc, pcs->handle, &frame);
break;
case loc_register:
case loc_regrel:
More information about the wine-cvs
mailing list