Hello,

I noticed the operands to the relational operators (DW_OP_le, etc.) in
dwarf_eval_expr are reversed compared with the DWARF spec.

Attached is a patch to fix the issue.

Regards,
Chris January
VP Engineering
Allinea Software Ltd.

diff -r d08a70da6717 -r c440a8363211 src/dwarf/Gexpr.c
--- src/dwarf/Gexpr.c	Tue Jan 22 15:50:13 2013 +0000
+++ src/dwarf/Gexpr.c	Tue Jan 22 16:52:35 2013 +0000
@@ -574,42 +574,42 @@
 	  Debug (15, "OP_le\n");
 	  tmp1 = pop ();
 	  tmp2 = pop ();
-	  push (sword (as, tmp1) <= sword (as, tmp2));
+	  push (sword (as, tmp2) <= sword (as, tmp1));
 	  break;
 
 	case DW_OP_ge:
 	  Debug (15, "OP_ge\n");
 	  tmp1 = pop ();
 	  tmp2 = pop ();
-	  push (sword (as, tmp1) >= sword (as, tmp2));
+	  push (sword (as, tmp2) >= sword (as, tmp1));
 	  break;
 
 	case DW_OP_eq:
 	  Debug (15, "OP_eq\n");
 	  tmp1 = pop ();
 	  tmp2 = pop ();
-	  push (sword (as, tmp1) == sword (as, tmp2));
+	  push (sword (as, tmp2) == sword (as, tmp1));
 	  break;
 
 	case DW_OP_lt:
 	  Debug (15, "OP_lt\n");
 	  tmp1 = pop ();
 	  tmp2 = pop ();
-	  push (sword (as, tmp1) < sword (as, tmp2));
+	  push (sword (as, tmp2) < sword (as, tmp1));
 	  break;
 
 	case DW_OP_gt:
 	  Debug (15, "OP_gt\n");
 	  tmp1 = pop ();
 	  tmp2 = pop ();
-	  push (sword (as, tmp1) > sword (as, tmp2));
+	  push (sword (as, tmp2) > sword (as, tmp1));
 	  break;
 
 	case DW_OP_ne:
 	  Debug (15, "OP_ne\n");
 	  tmp1 = pop ();
 	  tmp2 = pop ();
-	  push (sword (as, tmp1) != sword (as, tmp2));
+	  push (sword (as, tmp2) != sword (as, tmp1));
 	  break;
 
 	case DW_OP_skip:
_______________________________________________
Libunwind-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/libunwind-devel

Reply via email to