diff --git a/valgrind-3.8.0-cfi_dw_ops.patch b/valgrind-3.8.0-cfi_dw_ops.patch new file mode 100644 index 0000000..254f50f --- /dev/null +++ b/valgrind-3.8.0-cfi_dw_ops.patch @@ -0,0 +1,175 @@ +--- 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 ); + diff --git a/valgrind.spec b/valgrind.spec index da17c77..854731d 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -52,6 +52,8 @@ Patch17: valgrind-3.8.0-bmi-conf-check.patch # insn is broken under memcheck. Patch18: valgrind-3.8.0-memcheck-mc_translate-Iop_8HLto16.patch +Patch19: valgrind-3.8.0-cfi_dw_ops.patch + Obsoletes: valgrind-callgrind %ifarch x86_64 ppc64 # Ensure glibc{,-devel} is installed for both multilib arches @@ -153,6 +155,8 @@ touch ./none/tests/amd64/bmi.stderr.exp %patch17 -p1 %patch18 -p1 +%patch19 -p1 + %build CC=gcc %ifarch x86_64 ppc64 @@ -262,10 +266,12 @@ echo ===============END TESTING=============== %endif %changelog -* Wed Sep 12 2012 Mark Wielaard +* Wed Sep 19 2012 Mark Wielaard - Add partial backport of upstream revision 12884 valgrind-3.8.0-memcheck-mc_translate-Iop_8HLto16.patch without it AVX2 VPBROADCASTB insn is broken under memcheck. +- Add valgrind-3.8.0-cfi_dw_ops.patch (KDE#307038) + DWARF2 CFI reader: unhandled DW_OP_ opcode 0x8 (DW_OP_const1u and friends) * Wed Sep 12 2012 Mark Wielaard 3.8.0-8 - Add configure fixup valgrind-3.8.0-bmi-conf-check.patch