--- valgrind-3.8.0/coregrind/m_debuginfo/readdwarf.c (revision 12990)
+++ valgrind-3.8.0/coregrind/m_debuginfo/readdwarf.c (working copy)
@@ -2733,6 +2733,7 @@
Word sw;
UWord uw;
CfiOp op;
+ CfiUnop uop;
HChar* opname;
Int sp; /* # of top element: valid is -1 .. N_EXPR_STACK-1 */
@@ -2778,7 +2779,7 @@
break;
}
- op = 0; opname = NULL; /* excessively conservative */
+ op = 0; uop = 0; opname = NULL; /* excessively conservative */
opcode = *expr++;
switch (opcode) {
@@ -2836,6 +2837,15 @@
VG_(printf)("DW_OP_const4s: %ld", sw);
break;
+ case DW_OP_const2s:
+ /* push: 16-bit signed immediate */
+ sw = read_le_s_encoded_literal( expr, 4 );
+ expr += 2;
+ PUSH( ML_(CfiExpr_Const)( dst, (UWord)sw ) );
+ if (ddump_frames)
+ VG_(printf)("DW_OP_const2s: %ld", sw);
+ break;
+
case DW_OP_const1s:
/* push: 8-bit signed immediate */
sw = read_le_s_encoded_literal( expr, 1 );
@@ -2845,6 +2855,46 @@
VG_(printf)("DW_OP_const1s: %ld", sw);
break;
+ case DW_OP_const1u:
+ /* push: 8-bit unsigned immediate */
+ uw = read_le_u_encoded_literal( expr, 1 );
+ expr += 1;
+ PUSH( ML_(CfiExpr_Const)( dst, uw ) );
+ if (ddump_frames)
+ VG_(printf)("DW_OP_const1: %lu", uw);
+ break;
+
+ case DW_OP_const2u:
+ /* push: 16-bit unsigned immediate */
+ uw = read_le_u_encoded_literal( expr, 2 );
+ expr += 2;
+ PUSH( ML_(CfiExpr_Const)( dst, uw ) );
+ if (ddump_frames)
+ VG_(printf)("DW_OP_const2: %lu", uw);
+ break;
+
+ case DW_OP_const4u:
+ /* push: 32-bit unsigned immediate */
+ uw = read_le_u_encoded_literal( expr, 4 );
+ expr += 4;
+ PUSH( ML_(CfiExpr_Const)( dst, uw ) );
+ if (ddump_frames)
+ VG_(printf)("DW_OP_const4: %lu", uw);
+ break;
+
+ case DW_OP_abs:
+ uop = Cunop_Abs; opname = "abs"; goto unop;
+ case DW_OP_neg:
+ uop = Cunop_Neg; opname = "neg"; goto unop;
+ case DW_OP_not:
+ uop = Cunop_Not; opname = "not"; goto unop;
+ unop:
+ POP( ix );
+ PUSH( ML_(CfiExpr_Unop)( dst, uop, ix ) );
+ if (ddump_frames)
+ VG_(printf)("DW_OP_%s", opname);
+ break;
+
case DW_OP_minus:
op = Cop_Sub; opname = "minus"; goto binop;
case DW_OP_plus:
--- valgrind-3.8.0/coregrind/m_debuginfo/debuginfo.c (revision 12990)
+++ valgrind-3.8.0/coregrind/m_debuginfo/debuginfo.c (working copy)
@@ -2051,7 +2051,7 @@
UWord evalCfiExpr ( XArray* exprs, Int ix,
CfiExprEvalContext* eec, Bool* ok )
{
- UWord wL, wR;
+ UWord w, wL, wR;
Addr a;
CfiExpr* e;
vg_assert(sizeof(Addr) == sizeof(UWord));
@@ -2118,6 +2118,16 @@
}
/* let's hope it doesn't trap! */
return ML_(read_UWord)((void *)a);
+ case Cex_Unop:
+ w = evalCfiExpr( exprs, e->Cex.Unop.ix, eec, ok );
+ if (!(*ok)) return 0;
+ switch (e->Cex.Unop.op) {
+ case Cunop_Abs: return (Word) w < 0 ? - w : w;
+ case Cunop_Neg: return - (Word) w;
+ case Cunop_Not: return ~ w;
+ default: goto unhandled;
+ }
+ /*NOTREACHED*/
default:
goto unhandled;
}
--- valgrind-3.8.0/coregrind/m_debuginfo/storage.c (revision 12990)
+++ valgrind-3.8.0/coregrind/m_debuginfo/storage.c (working copy)
@@ -595,6 +595,16 @@
e.Cex.Binop.ixR = ixR;
return (Int)VG_(addToXA)( dst, &e );
}
+Int ML_(CfiExpr_Unop)( XArray* dst, CfiUnop op, Int ix )
+{
+ CfiExpr e;
+ VG_(memset)( &e, 0, sizeof(e) );
+ e.tag = Cex_Unop;
+ e.Cex.Unop.op = op;
+ e.Cex.Unop.ix = ix;
+ return (Int)VG_(addToXA)( dst, &e );
+}
+
Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg )
{
CfiExpr e;
--- valgrind-3.8.0/coregrind/m_debuginfo/priv_storage.h (revision 12990)
+++ valgrind-3.8.0/coregrind/m_debuginfo/priv_storage.h (working copy)
@@ -296,6 +296,14 @@
typedef
enum {
+ Cunop_Abs=0x231,
+ Cunop_Neg,
+ Cunop_Not
+ }
+ CfiUnop;
+
+typedef
+ enum {
Creg_IA_SP=0x213,
Creg_IA_BP,
Creg_IA_IP,
@@ -315,7 +323,8 @@
Cex_Const,
Cex_Binop,
Cex_CfiReg,
- Cex_DwReg
+ Cex_DwReg,
+ Cex_Unop
}
CfiExprTag;
@@ -342,6 +351,10 @@
struct {
Int reg;
} DwReg;
+ struct {
+ CfiUnop op;
+ Int ix;
+ } Unop;
}
Cex;
}
@@ -353,6 +366,7 @@
extern Int ML_(CfiExpr_Binop) ( XArray* dst, CfiOp op, Int ixL, Int ixR );
extern Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg );
extern Int ML_(CfiExpr_DwReg) ( XArray* dst, Int reg );
+extern Int ML_(CfiExpr_Unop) ( XArray* dst, CfiUnop op, Int ix );
extern void ML_(ppCfiExpr)( XArray* src, Int ix );