From: Tom Hughes Date: Tue, 5 Jul 2011 09:22:32 +0000 (+0000) Subject: Implement some extra DWARF ops that gcc 4.6.1 seems to use. Fixes #275284. X-Git-Tag: svn/VALGRIND_3_7_0~381 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=233e49f342de7224d10329db2e802cdab3389424;p=thirdparty%2Fvalgrind.git Implement some extra DWARF ops that gcc 4.6.1 seems to use. Fixes #275284. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11856 --- diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c index e000468d73..4177a3a482 100644 --- a/coregrind/m_debuginfo/debuginfo.c +++ b/coregrind/m_debuginfo/debuginfo.c @@ -1880,6 +1880,14 @@ UWord evalCfiExpr ( XArray* exprs, Int ix, case Cop_Sub: return wL - wR; case Cop_And: return wL & wR; case Cop_Mul: return wL * wR; + case Cop_Shl: return wL << wR; + case Cop_Shr: return wL >> wR; + case Cop_Eq: return wL == wR ? 1 : 0; + case Cop_Ge: return wL >= wR ? 1 : 0; + case Cop_Gt: return wL > wR ? 1 : 0; + case Cop_Le: return wL <= wR ? 1 : 0; + case Cop_Lt: return wL < wR ? 1 : 0; + case Cop_Ne: return wL != wR ? 1 : 0; default: goto unhandled; } /*NOTREACHED*/ diff --git a/coregrind/m_debuginfo/priv_storage.h b/coregrind/m_debuginfo/priv_storage.h index 949ae7459f..7921a3f9a0 100644 --- a/coregrind/m_debuginfo/priv_storage.h +++ b/coregrind/m_debuginfo/priv_storage.h @@ -249,7 +249,15 @@ typedef Cop_Add=0x321, Cop_Sub, Cop_And, - Cop_Mul + Cop_Mul, + Cop_Shl, + Cop_Shr, + Cop_Eq, + Cop_Ge, + Cop_Gt, + Cop_Le, + Cop_Lt, + Cop_Ne } CfiOp; diff --git a/coregrind/m_debuginfo/readdwarf.c b/coregrind/m_debuginfo/readdwarf.c index 807964a1b7..870d77ecbc 100644 --- a/coregrind/m_debuginfo/readdwarf.c +++ b/coregrind/m_debuginfo/readdwarf.c @@ -2899,6 +2899,22 @@ static Int dwarfexpr_to_dag ( UnwindContext* ctx, op = Cop_And; opname = "and"; goto binop; case DW_OP_mul: op = Cop_Mul; opname = "mul"; goto binop; + case DW_OP_shl: + op = Cop_Shl; opname = "shl"; goto binop; + case DW_OP_shr: + op = Cop_Shr; opname = "shr"; goto binop; + case DW_OP_eq: + op = Cop_Eq; opname = "eq"; goto binop; + case DW_OP_ge: + op = Cop_Ge; opname = "ge"; goto binop; + case DW_OP_gt: + op = Cop_Gt; opname = "gt"; goto binop; + case DW_OP_le: + op = Cop_Le; opname = "le"; goto binop; + case DW_OP_lt: + op = Cop_Lt; opname = "lt"; goto binop; + case DW_OP_ne: + op = Cop_Ne; opname = "ne"; goto binop; binop: POP( ix ); POP( ix2 ); diff --git a/coregrind/m_debuginfo/storage.c b/coregrind/m_debuginfo/storage.c index 6dcd9e050b..8b4060a8d6 100644 --- a/coregrind/m_debuginfo/storage.c +++ b/coregrind/m_debuginfo/storage.c @@ -603,6 +603,14 @@ static void ppCfiOp ( CfiOp op ) case Cop_Sub: VG_(printf)("-"); break; case Cop_And: VG_(printf)("&"); break; case Cop_Mul: VG_(printf)("*"); break; + case Cop_Shl: VG_(printf)("<<"); break; + case Cop_Shr: VG_(printf)(">>"); break; + case Cop_Eq: VG_(printf)("=="); break; + case Cop_Ge: VG_(printf)(">="); break; + case Cop_Gt: VG_(printf)(">"); break; + case Cop_Le: VG_(printf)("<="); break; + case Cop_Lt: VG_(printf)("<"); break; + case Cop_Ne: VG_(printf)("!="); break; default: vg_assert(0); } }