+2016-11-16  Kevin Buettner  <kevinb@redhat.com>
+
+       * gdb.python/py-recurse-unwind.c (main): Add loop.
+       * gdb.python/py-recurse-unwind.py (TestUnwinder): Add calls
+       to read_register() and gdb.parse_and_eval().  Make each code
+       call a separate case that can be individually tested.
+       * gdb.python/py-recurse-unwind.exp (cont_and_backtrace): New
+       proc. Call cont_and_backtrace for each of the code paths that
+       we want to test in the unwinder.
+
 2016-11-15  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
        * gdb.dwarf2/bitfield-parent-optimized-out.exp: Fix DWARF code for
 
     return 0
 }
 
-gdb_breakpoint "ccc"
 
-gdb_continue_to_breakpoint "ccc"
-
-# If the unwinder is active, the usage count will increment while
-# running to the breakpoint.  Reset it prior to doing the backtrace.
-gdb_test_no_output "python TestUnwinder.reset_count()"
-
-# The python based unwinder should be called a number of times while
-# generating the backtrace, but its sniffer always returns None.  So
-# it doesn't really contribute to generating any of the frames below.
-#
-# But that's okay.  Our goal here is to make sure that GDB doesn't
-# get hung up in potentially infinite recursion when invoking the
-# Python-based unwinder.
-
-gdb_test_sequence "bt"  "backtrace" {
-    "\\r\\n#0 .* ccc \\(arg=789\\) at "
-    "\\r\\n#1 .* bbb \\(arg=456\\) at "
-    "\\r\\n#2 .* aaa \\(arg=123\\) at "
-    "\\r\\n#3 .* main \\(.*\\) at"
+proc cont_and_backtrace { tst } {
+
+    with_test_prefix $tst {
+       gdb_breakpoint "ccc"
+
+       # We're testing different code paths within the unwinder's sniffer.
+       # Set the current path to be tested here.
+       gdb_test_no_output "python TestUnwinder.set_test(\"$tst\")" \
+                          "set code path within python unwinder to $tst"
+
+       # If the unwinder is active, the usage count will increment while
+       # running to the breakpoint.  Reset it prior to doing the backtrace.
+       gdb_test_no_output "python TestUnwinder.reset_count()" \
+                          "reset count"
+
+       gdb_continue_to_breakpoint "ccc"
+
+       # The python based unwinder should be called a number of times while
+       # generating the backtrace, but its sniffer always returns None.  So
+       # it doesn't really contribute to generating any of the frames below.
+       #
+       # But that's okay.  Our goal here is to make sure that GDB doesn't
+       # get hung up in potentially infinite recursion when invoking the
+       # Python-based unwinder.
+
+       gdb_test_sequence "bt"  "backtrace" {
+           "\\r\\n#0 .* ccc \\(arg=789\\) at "
+           "\\r\\n#1 .* bbb \\(arg=456\\) at "
+           "\\r\\n#2 .* aaa \\(arg=123\\) at "
+           "\\r\\n#3 .* main \\(.*\\) at"
+       }
+
+       # Test that the python-based unwinder / sniffer was actually called
+       # during generation of the backtrace.
+       gdb_test "python print(TestUnwinder.count > 0)" "True" \
+                "python unwinder called"
+    }
 }
 
-# Test that the python-based unwinder / sniffer was actually called
-# during generation of the backtrace.
-gdb_test "python print(TestUnwinder.count > 0)" "True"
+cont_and_backtrace "check_undefined_symbol"
+cont_and_backtrace "check_user_reg_pc"
+cont_and_backtrace "check_pae_pc"
 
     def inc_count (cls):
         cls.count += 1
 
+    test = 'check_undefined_symbol'
+
+    @classmethod
+    def set_test (cls, test) :
+       cls.test = test
+
     def __init__(self):
         Unwinder.__init__(self, "test unwinder")
         self.recurse_level = 0
 
     def __call__(self, pending_frame):
 
-
         if self.recurse_level > 0:
             gdb.write("TestUnwinder: Recursion detected - returning early.\n")
             return None
         self.recurse_level += 1
         TestUnwinder.inc_count()
 
-        try:
-            val = gdb.parse_and_eval("undefined_symbol")
+        if TestUnwinder.test == 'check_user_reg_pc' :
+
+            pc = pending_frame.read_register('pc')
+            pc_as_int = int(pc.cast(gdb.lookup_type('int')))
+            # gdb.write("In unwinder: pc=%x\n" % pc_as_int)
+
+        elif TestUnwinder.test == 'check_pae_pc' :
+
+            pc = gdb.parse_and_eval('$pc')
+            pc_as_int = int(pc.cast(gdb.lookup_type('int')))
+            # gdb.write("In unwinder: pc=%x\n" % pc_as_int)
+
+        elif TestUnwinder.test == 'check_undefined_symbol' :
+
+            try:
+                val = gdb.parse_and_eval("undefined_symbol")
 
-        except Exception as arg:
-            pass
+            except Exception as arg:
+                pass
 
         self.recurse_level -= 1