|
From: <sv...@va...> - 2008-02-26 17:24:03
|
Author: sewardj
Date: 2008-02-26 17:23:54 +0000 (Tue, 26 Feb 2008)
New Revision: 7478
Log:
In ML_(evaluate_Dwarf3_Expr): apply the relevant .data segment bias
when evaluating DW_OP_addr. This makes variable identification work
much better in shared libraries (which have nonzero biases). Most of
the change is merely plumbing, to get the data_bias to the place where
it is needed.
Modified:
branches/DATASYMS/coregrind/m_debuginfo/d3basics.c
branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
branches/DATASYMS/coregrind/m_debuginfo/priv_d3basics.h
branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
branches/DATASYMS/coregrind/m_debuginfo/tytypes.c
Modified: branches/DATASYMS/coregrind/m_debuginfo/d3basics.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/d3basics.c 2008-02-26 16:07:41 UTC (rev 7477)
+++ branches/DATASYMS/coregrind/m_debuginfo/d3basics.c 2008-02-26 17:23:54 UTC (rev 7478)
@@ -402,6 +402,7 @@
priv_d3basics.h. */
GXResult ML_(evaluate_Dwarf3_Expr) ( UChar* expr, UWord exprszB,
GExpr* fbGX, RegSummary* regs,
+ Addr data_bias,
Bool push_initial_zero )
{
# define N_EXPR_STACK 20
@@ -496,16 +497,19 @@
opcode = *expr++;
switch (opcode) {
case DW_OP_addr:
- /* FIXME: surely this is an svma? Should be t- or d-
- biased before being pushed? */
- PUSH( *(Addr*)expr );
+ /* Presumably what is given in the Dwarf3 is a SVMA (how
+ could it be otherwise?) So we add the data bias on
+ before pushing the result. FIXME: how can we be sure
+ the data bias is intended, not the text bias? I don't
+ know. */
+ PUSH( *(Addr*)expr + data_bias );
expr += sizeof(Addr);
break;
case DW_OP_fbreg:
if (!fbGX)
FAIL("evaluate_Dwarf3_Expr: DW_OP_fbreg with "
"no expr for fbreg present");
- fbval = ML_(evaluate_GX)(fbGX, NULL, regs);
+ fbval = ML_(evaluate_GX)(fbGX, NULL, regs, data_bias);
/* Convert fbval into something we can use. If we got a
Value, no problem. However, as per D3 spec sec 3.3.5
(Low Level Information) sec 2, we could also get a
@@ -599,7 +603,8 @@
/* Evaluate a so-called Guarded (DWARF3) expression. See detailed
description in priv_d3basics.h. */
-GXResult ML_(evaluate_GX)( GExpr* gx, GExpr* fbGX, RegSummary* regs )
+GXResult ML_(evaluate_GX)( GExpr* gx, GExpr* fbGX,
+ RegSummary* regs, Addr data_bias )
{
GXResult res;
Addr aMin, aMax;
@@ -631,7 +636,7 @@
/* Assert this is the first guard. */
vg_assert(nGuards == 1);
res = ML_(evaluate_Dwarf3_Expr)(
- p, (UWord)nbytes, fbGX, regs,
+ p, (UWord)nbytes, fbGX, regs, data_bias,
False/*push_initial_zero*/ );
/* Now check there are no more guards. */
p += (UWord)nbytes;
@@ -641,7 +646,7 @@
if (aMin <= regs->ip && regs->ip <= aMax) {
/* found a matching range. Evaluate the expression. */
return ML_(evaluate_Dwarf3_Expr)(
- p, (UWord)nbytes, fbGX, regs,
+ p, (UWord)nbytes, fbGX, regs, data_bias,
False/*push_initial_zero*/ );
}
}
Modified: branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-26 16:07:41 UTC (rev 7477)
+++ branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-26 17:23:54 UTC (rev 7478)
@@ -1595,7 +1595,8 @@
static Bool data_address_is_in_var ( /*OUT*/UWord* offset,
DiVariable* var,
RegSummary* regs,
- Addr data_addr )
+ Addr data_addr,
+ Addr data_bias )
{
MaybeUWord muw;
SizeT var_szB;
@@ -1626,7 +1627,7 @@
return False;
}
- res = ML_(evaluate_GX)( var->gexpr, var->fbGX, regs );
+ res = ML_(evaluate_GX)( var->gexpr, var->fbGX, regs, data_bias );
if (show) {
VG_(printf)("VVVV: -> ");
@@ -1897,7 +1898,8 @@
for (j = 0; j < VG_(sizeXA)( vars ); j++) {
DiVariable* var = (DiVariable*)VG_(indexXA)( vars, j );
SizeT offset;
- if (data_address_is_in_var( &offset, var, ®s, data_addr )) {
+ if (data_address_is_in_var( &offset, var, ®s, data_addr,
+ di->data_bias )) {
OffT residual_offset = 0;
XArray* described = ML_(describe_type)( &residual_offset,
var->type, offset );
@@ -1996,7 +1998,7 @@
fail. */
if (data_address_is_in_var( &offset, var,
NULL/* RegSummary* */,
- data_addr )) {
+ data_addr, di->data_bias )) {
OffT residual_offset = 0;
XArray* described = ML_(describe_type)( &residual_offset,
var->type, offset );
Modified: branches/DATASYMS/coregrind/m_debuginfo/priv_d3basics.h
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/priv_d3basics.h 2008-02-26 16:07:41 UTC (rev 7477)
+++ branches/DATASYMS/coregrind/m_debuginfo/priv_d3basics.h 2008-02-26 17:23:54 UTC (rev 7478)
@@ -621,7 +621,8 @@
computed, then fbGX can provide an expression for it. If fbGX is
NULL but the frame base is still needed, then evaluation of gx as a
whole will fail. */
-GXResult ML_(evaluate_GX)( GExpr* gx, GExpr* fbGX, RegSummary* regs );
+GXResult ML_(evaluate_GX)( GExpr* gx, GExpr* fbGX,
+ RegSummary* regs, Addr data_bias );
/* This is a subsidiary of ML_(evaluate_GX), which just evaluates a
single standard DWARF3 expression. Conventions w.r.t regs and fbGX
@@ -632,6 +633,7 @@
recursive. */
GXResult ML_(evaluate_Dwarf3_Expr) ( UChar* expr, UWord exprszB,
GExpr* fbGX, RegSummary* regs,
+ Addr data_bias,
Bool push_initial_zero );
#endif /* ndef __PRIV_D3BASICS_H */
Modified: branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c 2008-02-26 16:07:41 UTC (rev 7477)
+++ branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c 2008-02-26 17:23:54 UTC (rev 7478)
@@ -84,6 +84,13 @@
different DIEs (generally a declarer and a definer). We punt on
these. Could do better here.
+ The 'data_bias' argument passed to the expression evaluator
+ (ML_(evaluate_Dwarf3_Expr)) should really be changed to a
+ MaybeUWord, to make it clear when we do vs don't know what it is
+ for the evaluation of an expression. At the moment zero is passed
+ for this parameter in the don't know case. That's a bit fragile
+ and obscure; using a MaybeUWord would be clearer.
+
POTENTIAL PERFORMANCE IMPROVEMENTS:
The number of type entities that end up in the list of TyAdmins
Modified: branches/DATASYMS/coregrind/m_debuginfo/tytypes.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/tytypes.c 2008-02-26 16:07:41 UTC (rev 7477)
+++ branches/DATASYMS/coregrind/m_debuginfo/tytypes.c 2008-02-26 17:23:54 UTC (rev 7478)
@@ -473,10 +473,18 @@
field = *(TyField**)VG_(indexXA)( fields, i );
vg_assert(field);
vg_assert(field->loc);
+ /* Re data_bias in this call, we should really send in
+ a legitimate value. But the expression is expected
+ to be a constant expression, evaluation of which
+ will not need to use DW_OP_addr and hence we can
+ avoid the trouble of plumbing the data bias through
+ to this point (if, indeed, it has any meaning; from
+ which DebugInfo would we take the data bias? */
res = ML_(evaluate_Dwarf3_Expr)(
field->loc->bytes, field->loc->nbytes,
NULL/*fbGX*/, NULL/*RegSummary*/,
- True/*push_initial_zero*/ );
+ 0/*data_bias*/,
+ True/*push_initial_zero*/);
if (0) {
VG_(printf)("QQQ ");
ML_(pp_GXResult)(res);
|