* hppa-tdep.c (hppa_fix_call_dummy): If FUN is a procedure label,
authorJeff Law <law@redhat.com>
Wed, 6 Apr 1994 00:56:36 +0000 (00:56 +0000)
committerJeff Law <law@redhat.com>
Wed, 6 Apr 1994 00:56:36 +0000 (00:56 +0000)
        then gets its real address into FUN and its GOT/DP value into %r19.

        * tm-hppa.h (CALL_DUMMY): Use %r20, not %r19 as a temporary.

gdb/ChangeLog
gdb/config/pa/tm-hppa.h
gdb/hppa-tdep.c

index 310a1d2ee592a98f6b4453228d7ecb3fb07c84d1..9e4981b92479336c9a4be93235bf3ca98d4c5333 100644 (file)
@@ -1,5 +1,10 @@
 Tue Apr  5 15:29:25 1994  Jeffrey A. Law  (law@snake.cs.utah.edu)
 
+       * hppa-tdep.c (hppa_fix_call_dummy): If FUN is a procedure label,
+       then gets its real address into FUN and its GOT/DP value into %r19.
+
+       * tm-hppa.h (CALL_DUMMY): Use %r20, not %r19 as a temporary.
+
        * hppa-tdep.c (frameless_function_invocation): If no unwind
        descriptor was found, then assume this was not a frameless
        function invocation.
index 54481e2b19133e64f91d11112699bc3e9851d30f..ad3c3a61abc26785b0973ff0b3297e6900158488 100644 (file)
@@ -344,8 +344,8 @@ call_dummy
        ldsid (0,r22), r4
        ldil 0, r1                      ; _sr4export will be placed here.
        ldo 0(r1), r1
-       ldsid (0,r1), r19
-       combt,=,n r3, r19, text_space   ; If target is in data space, do a
+       ldsid (0,r1), r20
+       combt,=,n r3, r20, text_space   ; If target is in data space, do a
        ble 0(sr5, r22)                 ; "normal" procedure call
        copy r31, r2
        break 4, 8 
@@ -388,7 +388,7 @@ text_space                          ; Otherwise, go through _sr4export,
 #define CALL_DUMMY {0x4BDA3FB9, 0x4BD93FB1, 0x4BD83FA9, 0x4BD73FA1,\
                     0x37C13FB9, 0x24201004, 0x2C391005, 0x24311006,\
                     0x2C291007, 0x22C00000, 0x36D60000, 0x02C010A4,\
-                    0x20200000, 0x34210000, 0x002010b3, 0x82642022,\
+                    0x20200000, 0x34210000, 0x002010b4, 0x82832022,\
                     0xe6c06000, 0x081f0242, 0x00010004, 0x00151820,\
                     0xe6c00002, 0xe4202000, 0x6bdf3fd1, 0x00010004,\
                     0x00151820, 0xe6c00002, 0x08000240, 0x08000240}
index 7729fdfd420a3c3e9939b1757f51c2b628964225..fa44b1250cad2968ee7b07bd577354272bc188f9 100644 (file)
@@ -1074,6 +1074,20 @@ hppa_fix_call_dummy (dummy, pc, fun, nargs, args, type, gcc_p)
 
   dyncall_addr = SYMBOL_VALUE_ADDRESS (msymbol);
 
+  /* FUN could be a procedure label, in which case we have to get
+     its real address and the value of its GOT/DP.  */
+  if (fun & 0x2)
+    {
+      /* Get the GOT/DP value for the target function.  It's
+        at *(fun+4).  Note the call dummy is *NOT* allowed to
+        trash %r19 before calling the target function.  */
+      write_register (19, read_memory_integer ((fun & ~0x3) + 4, 4));
+
+      /* Now get the real address for the function we are calling, it's
+        at *fun.  */
+      fun = (CORE_ADDR) read_memory_integer (fun & ~0x3, 4);
+    }
+
   /* If we are calling an import stub (eg calling into a dynamic library)
      then have sr4export call the magic __d_plt_call routine which is linked
      in from end.o.  (You can't use _sr4export to call the import stub as