PowerPC: Add systemtap static probe points in setjmp/longjmp
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Fri, 22 Nov 2013 12:36:54 +0000 (06:36 -0600)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Thu, 5 Dec 2013 13:44:07 +0000 (07:44 -0600)
This patch add static probes for setjmp/longjmp in the way gdb expects,fixing
the gdb.base/longjmp.exp gdb testcases.

It changes the symbol_name and use macros to to avoid change the probe names
and ending up adding more logic on GDB (since with the expected name
GDB work seamlessly).

13 files changed:
ChangeLog
sysdeps/powerpc/powerpc32/__longjmp-common.S
sysdeps/powerpc/powerpc32/__longjmp.S
sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
sysdeps/powerpc/powerpc32/fpu/__longjmp.S
sysdeps/powerpc/powerpc32/fpu/setjmp-common.S
sysdeps/powerpc/powerpc32/fpu/setjmp.S
sysdeps/powerpc/powerpc32/setjmp-common.S
sysdeps/powerpc/powerpc32/setjmp.S
sysdeps/powerpc/powerpc64/__longjmp-common.S
sysdeps/powerpc/powerpc64/setjmp-common.S
sysdeps/powerpc/powerpc64/setjmp.S
sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S

index dc38e52..440e6e7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2013-12-05  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+       * sysdeps/powerpc/powerpc32/__longjmp-common.S: Add "longjmp" and
+       "longjmp_target" static probes.
+       (__longjmp): Rename to __longjmp_symbol.
+       * sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S: Likewise.
+       * sysdeps/powerpc/powerpc32/__longjmp.S: Define __longjmp_symbol based
+       on which longjmp to generate.
+       * sysdeps/powerpc/powerpc32/fpu/__longjmp.S: Likewise.
+       * sysdeps/powerpc/powerpc32/fpu/setjmp-common.S: Add "setjmp" static
+       probe.
+       (__sigsetjmp): Rename to __sigsetjmp_symbol.
+       (__sigjmp_save): Rename to __sigjmp_save_symbol.
+       * sysdeps/powerpc/powerpc32/setjmp-common.S: Likewise.
+       * sysdeps/powerpc/powerpc32/fpu/setjmp.S: Define __sigsetjmp_symbol
+       and __sigjmp_save_symbol based on which sigsetjmp to generated.
+       * sysdeps/powerpc/powerpc32/setjmp.S: Likewise
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S: Define
+       __longjmp_symbol based on which __longjmp to generate.
+       * sysdeps/powerpc/powerpc64/setjmp-common.S: Add "setjmp" static
+       probe.
+       (setjmp): Rename to setjmp_symbol.
+       (__sigsetjmp): Rename to __sigsetjmp_symbol.
+       (_setjmp): Rename to _setjmp_symbol.
+       (__sigsetjmp): Rename to __sigsetjmp_symbol.
+       * sysdeps/powerpc/powerpc64/setjmp.S: Define setjmp_symbol,
+       _setjmp_symbol, __sigsetjmp_symbol, and __sigjmp_save_symbol based on
+       which setjmp to generate.
+       * sysdeps/powerpc/powerpc64/__longjmp-common.S: Add "longjmp" and
+       "longjmp_target" static probes.
+
 2013-12-05  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
        * benchtests/README: Add note about output arguments.
index df1d519..97c966d 100644 (file)
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
 # include <novmxsetjmp.h>
@@ -30,7 +31,7 @@
 # define LOAD_GP(N)    lwz r##N,((JB_GPRS+(N)-14)*4)(r3)
 #endif
 
-ENTRY (__longjmp)
+ENTRY (__longjmp_symbol)
 
 #if defined PTR_DEMANGLE || defined CHECK_SP
        lwz r24,(JB_GPR1*4)(r3)
@@ -58,20 +59,24 @@ ENTRY (__longjmp)
 # endif
        PTR_DEMANGLE2 (r0, r25)
 #endif
+       /* longjmp/longjmp_target probe expects longjmp first argument (4@3),
+          second argument (-4@4), and target address (4@0), respectively.  */
+       LIBC_PROBE (longjmp, 3, 4@3, -4@4, 4@0)
        mtlr r0
        LOAD_GP (21)
        LOAD_GP (22)
-       lwz r0,(JB_CR*4)(r3)
+       lwz r5,(JB_CR*4)(r3)
        LOAD_GP (23)
        LOAD_GP (24)
        LOAD_GP (25)
-       mtcrf 0xFF,r0
+       mtcrf 0xFF,r5
        LOAD_GP (26)
        LOAD_GP (27)
        LOAD_GP (28)
        LOAD_GP (29)
        LOAD_GP (30)
        LOAD_GP (31)
+       LIBC_PROBE (longjmp_target, 3, 4@3, -4@4, 4@0)
        mr r3,r4
        blr
-END (__longjmp)
+END (__longjmp_symbol)
index 3ceeea7..8456cb5 100644 (file)
 
 #if defined NOT_IN_libc
 /* Build a non-versioned object for rtld-*.  */
+# define __longjmp_symbol __longjmp
 # include "__longjmp-common.S"
 
 #else /* !NOT_IN_libc */
 strong_alias (__vmx__longjmp, __longjmp);
-# define __longjmp  __vmx__longjmp
+# define __longjmp_symbol  __vmx__longjmp
 # include "__longjmp-common.S"
 
 # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
 #  define __NO_VMX__
 #  undef JB_SIZE
-#  undef __longjmp
-#  define __longjmp  __novmx__longjmp
+#  undef __longjmp_symbol
+#  define __longjmp_symbol  __novmx__longjmp
 #  include "__longjmp-common.S"
 # endif
 #endif /* !NOT_IN_libc */
index d02aa57..1361154 100644 (file)
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
 # include <novmxsetjmp.h>
@@ -25,7 +26,7 @@
 #endif
 
        .machine        "altivec"
-ENTRY (__longjmp)
+ENTRY (__longjmp_symbol)
 #ifndef __NO_VMX__
 # ifdef PIC
        mflr    r6
@@ -143,19 +144,22 @@ L(no_vmx):
 # endif
        PTR_DEMANGLE2 (r0, r25)
 #endif
+       /* longjmp/longjmp_target probe expects longjmp first argument (4@3),
+          second argument (-4@4), and target address (4@0), respectively.  */
+       LIBC_PROBE (longjmp, 3, 4@3, -4@4, 4@0)
        mtlr r0
        lwz r21,((JB_GPRS+7)*4)(r3)
        lfd fp21,((JB_FPRS+7*2)*4)(r3)
        lwz r22,((JB_GPRS+8)*4)(r3)
        lfd fp22,((JB_FPRS+8*2)*4)(r3)
-       lwz r0,(JB_CR*4)(r3)
+       lwz r5,(JB_CR*4)(r3)
        lwz r23,((JB_GPRS+9)*4)(r3)
        lfd fp23,((JB_FPRS+9*2)*4)(r3)
        lwz r24,((JB_GPRS+10)*4)(r3)
        lfd fp24,((JB_FPRS+10*2)*4)(r3)
        lwz r25,((JB_GPRS+11)*4)(r3)
        lfd fp25,((JB_FPRS+11*2)*4)(r3)
-       mtcrf 0xFF,r0
+       mtcrf 0xFF,r5
        lwz r26,((JB_GPRS+12)*4)(r3)
        lfd fp26,((JB_FPRS+12*2)*4)(r3)
        lwz r27,((JB_GPRS+13)*4)(r3)
@@ -168,6 +172,7 @@ L(no_vmx):
        lfd fp30,((JB_FPRS+16*2)*4)(r3)
        lwz r31,((JB_GPRS+17)*4)(r3)
        lfd fp31,((JB_FPRS+17*2)*4)(r3)
+       LIBC_PROBE (longjmp_target, 3, 4@3, -4@4, 4@0)
        mr r3,r4
        blr
-END (__longjmp)
+END (__longjmp_symbol)
index 27166c4..cbd42be 100644 (file)
 
 #if defined NOT_IN_libc
 /* Build a non-versioned object for rtld-*.  */
+# define __longjmp_symbol __longjmp
 # include "__longjmp-common.S"
 
 #else /* !NOT_IN_libc */
 /* Build a versioned object for libc.  */
 versioned_symbol (libc, __vmx__longjmp, __longjmp, GLIBC_2_3_4);
-# define __longjmp  __vmx__longjmp
+# define __longjmp_symbol  __vmx__longjmp
 # include "__longjmp-common.S"
 
 # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
 #  define __NO_VMX__
 #  undef JB_SIZE
 compat_symbol (libc, __novmx__longjmp, __longjmp, GLIBC_2_0);
-#  undef __longjmp
-#  define __longjmp  __novmx__longjmp
+#  undef __longjmp_symbol
+#  define __longjmp_symbol  __novmx__longjmp
 #  include "__longjmp-common.S"
 # endif
 #endif /* !NOT_IN_libc */
index f324406..08efd64 100644 (file)
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
 # include <novmxsetjmp.h>
@@ -25,7 +26,7 @@
 #endif
 
        .machine        "altivec"
-ENTRY (__sigsetjmp)
+ENTRY (__sigsetjmp_symbol)
 
 #ifdef PTR_MANGLE
        mr   r5,r1
@@ -35,6 +36,9 @@ ENTRY (__sigsetjmp)
        stw  r1,(JB_GPR1*4)(3)
 #endif
        mflr r0
+       /* setjmp probe expects longjmp first argument (4@3), second argument
+          (-4@4), and target address (4@0), respectively.  */
+       LIBC_PROBE (setjmp, 3, 4@3, -4@4, 4@0)
        stw  r14,((JB_GPRS+0)*4)(3)
        stfd fp14,((JB_FPRS+0*2)*4)(3)
 #ifdef PTR_MANGLE
@@ -175,5 +179,5 @@ L(aligned_save_vmx):
        stvx    31,0,r6
 L(no_vmx):
 #endif
-       b __sigjmp_save@local
-END (__sigsetjmp)
+       b __sigjmp_save_symbol@local
+END (__sigsetjmp_symbol)
index 92acff1..566aa34 100644 (file)
 
 #if defined NOT_IN_libc
 /* Build a non-versioned object for rtld-*.  */
+# define __sigsetjmp_symbol __sigsetjmp
+# define __sigjmp_save_symbol __sigjmp_save
 # include "setjmp-common.S"
 
 #else /* !NOT_IN_libc */
 /* Build a versioned object for libc.  */
 versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
-# define __sigsetjmp __vmx__sigsetjmp
-# define __sigjmp_save __vmx__sigjmp_save
+# define __sigsetjmp_symbol __vmx__sigsetjmp
+# define __sigjmp_save_symbol __vmx__sigjmp_save
 # include "setjmp-common.S"
 
 # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
 #  define __NO_VMX__
-#  undef __sigsetjmp
-#  undef __sigjmp_save
+#  undef __sigsetjmp_symbol
+#  undef __sigjmp_save_symbol
 #  undef JB_SIZE
 compat_symbol (libc, __novmx__sigsetjmp, __sigsetjmp, GLIBC_2_0)
-#  define __sigsetjmp __novmx__sigsetjmp
-#  define __sigjmp_save __novmx__sigjmp_save
+#  define __sigsetjmp_symbol __novmx__sigsetjmp
+#  define __sigjmp_save_symbol __novmx__sigjmp_save
 #  include "setjmp-common.S"
 # endif
 #endif /* !NOT_IN_libc */
index 3fb65b5..0c77029 100644 (file)
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
 # include <novmxsetjmp.h>
@@ -30,7 +31,7 @@
 # define SAVE_GP(N)    stw r##N,((JB_GPRS+(N)-14)*4)(3)
 #endif
 
-ENTRY (__sigsetjmp)
+ENTRY (__sigsetjmp_symbol)
 
 #ifdef PTR_MANGLE
        mr   r5,r1
@@ -40,6 +41,9 @@ ENTRY (__sigsetjmp)
        stw  r1,(JB_GPR1*4)(3)
 #endif
        mflr r0
+       /* setjmp probe expects longjmp first argument (4@3), second argument
+          (-4@4), and target address (4@0), respectively.  */
+       LIBC_PROBE (setjmp, 3, 4@3, -4@4, 4@0)
        SAVE_GP (14)
 #ifdef PTR_MANGLE
        PTR_MANGLE2 (r0, r10)
@@ -69,6 +73,6 @@ ENTRY (__sigsetjmp)
        li   r3,0
        blr
 #else
-       b __sigjmp_save@local
+       b __sigjmp_save_symbol@local
 #endif
-END (__sigsetjmp)
+END (__sigsetjmp_symbol)
index 49b64ec..467d9c9 100644 (file)
 
 #if defined NOT_IN_libc
 /* Build a non-versioned object for rtld-*.  */
+# define __sigsetjmp_symbol __sigsetjmp
+# define __sigjmp_save_symbol __sigjmp_save
 # include "setjmp-common.S"
 
 #else /* !NOT_IN_libc */
 /* Build a versioned object for libc.  */
 versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
-# define __sigsetjmp __vmx__sigsetjmp
-# define __sigjmp_save __vmx__sigjmp_save
+# define __sigsetjmp_symbol __vmx__sigsetjmp
+# define __sigjmp_save_symbol __vmx__sigjmp_save
 # include "setjmp-common.S"
 
 # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
 #  define __NO_VMX__
-#  undef __sigsetjmp
-#  undef __sigjmp_save
+#  undef __sigsetjmp_symbol
+#  undef __sigjmp_save_symbol
 #  undef JB_SIZE
 compat_symbol (libc, __novmx__sigsetjmp, __sigsetjmp, GLIBC_2_0)
-#  define __sigsetjmp __novmx__sigsetjmp
-#  define __sigjmp_save __novmx__sigjmp_save
+#  define __sigsetjmp_symbol __novmx__sigsetjmp
+#  define __sigjmp_save_symbol __novmx__sigjmp_save
 #  include "setjmp-common.S"
 # endif
 #endif /* !NOT_IN_libc */
index ce5a018..3c792b4 100644 (file)
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <stap-probe.h>
 #define _ASM
 #define _SETJMP_H
 #ifdef __NO_VMX__
@@ -147,20 +148,23 @@ L(no_vmx):
 #ifdef PTR_DEMANGLE
        PTR_DEMANGLE2 (r0, r25)
 #endif
+     /* longjmp/longjmp_target probe expects longjmp first argument (8@3),
+       second argument (-4@4), and target address (8@0), respectively.  */
+       LIBC_PROBE (longjmp, 3, 8@3, -4@4, 8@0)
        mtlr r0
 /*     std r2,FRAME_TOC_SAVE(r1)       Restore the TOC save area.  */
        ld r21,((JB_GPRS+7)*8)(r3)
        lfd fp21,((JB_FPRS+7)*8)(r3)
        ld r22,((JB_GPRS+8)*8)(r3)
        lfd fp22,((JB_FPRS+8)*8)(r3)
-       lwz r0,((JB_CR*8)+4)(r3)        /* 32-bit CR.  */
+       lwz r5,((JB_CR*8)+4)(r3)        /* 32-bit CR.  */
        ld r23,((JB_GPRS+9)*8)(r3)
        lfd fp23,((JB_FPRS+9)*8)(r3)
        ld r24,((JB_GPRS+10)*8)(r3)
        lfd fp24,((JB_FPRS+10)*8)(r3)
        ld r25,((JB_GPRS+11)*8)(r3)
        lfd fp25,((JB_FPRS+11)*8)(r3)
-       mtcrf 0xFF,r0
+       mtcrf 0xFF,r5
        ld r26,((JB_GPRS+12)*8)(r3)
        lfd fp26,((JB_FPRS+12)*8)(r3)
        ld r27,((JB_GPRS+13)*8)(r3)
@@ -173,6 +177,7 @@ L(no_vmx):
        lfd fp30,((JB_FPRS+16)*8)(r3)
        ld r31,((JB_GPRS+17)*8)(r3)
        lfd fp31,((JB_FPRS+17)*8)(r3)
+       LIBC_PROBE (longjmp_target, 3, 8@3, -4@4, 8@0)
        mr r3,r4
        blr
 END (__longjmp)
index 9e4fb02..6ab44d6 100644 (file)
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <stap-probe.h>
 #define _ASM
 #ifdef __NO_VMX__
 #include <novmxsetjmp.h>
 #endif
 
        .machine        "altivec"
-ENTRY (setjmp)
+ENTRY (setjmp_symbol)
        CALL_MCOUNT 1
        li r4,1                 /* Set second argument to 1.  */
-       b JUMPTARGET (GLUE(__sigsetjmp,_ent))
-END (setjmp)
+       b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
+END (setjmp_symbol)
 
 #if defined SHARED && !defined IS_IN_rtld && !defined __NO_VMX__
 /* When called from within libc we need a special version of _setjmp
@@ -57,20 +58,20 @@ ENTRY (__GI__setjmp)
        std r2,FRAME_TOC_SAVE(r1)               /* Save the callers TOC in the save area.  */
        CALL_MCOUNT 1
        li r4,0                 /* Set second argument to 0.  */
-       b JUMPTARGET (GLUE(__sigsetjmp,_ent))
+       b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
 END (__GI__setjmp)
 #endif
 
-ENTRY (_setjmp)
+ENTRY (_setjmp_symbol)
        CALL_MCOUNT 1
        li r4,0                 /* Set second argument to 0.  */
-       b JUMPTARGET (GLUE(__sigsetjmp,_ent))
-END (_setjmp)
-libc_hidden_def (_setjmp)
+       b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
+END (_setjmp_symbol)
+libc_hidden_def (_setjmp_symbol)
 
-ENTRY (__sigsetjmp)
+ENTRY (__sigsetjmp_symbol)
        CALL_MCOUNT 2
-JUMPTARGET(GLUE(__sigsetjmp,_ent)):
+JUMPTARGET(GLUE(__sigsetjmp_symbol,_ent)):
 #ifdef PTR_MANGLE
        mr   r5, r1
        PTR_MANGLE (r5, r6)
@@ -85,6 +86,9 @@ JUMPTARGET(GLUE(__sigsetjmp,_ent)):
 #else
        std  r2,(JB_GPR2*8)(3)
 #endif
+       /* setjmp probe expects longjmp first argument (8@3), second argument
+          (-4@4), and target address (8@0), respectively.  */
+       LIBC_PROBE (setjmp, 3, 8@3, -4@4, 8@0)
        std  r14,((JB_GPRS+0)*8)(3)
        stfd fp14,((JB_FPRS+0)*8)(3)
 #ifdef PTR_MANGLE
@@ -213,18 +217,18 @@ L(no_vmx):
        li      r3,0
        blr
 #elif defined SHARED
-       b       JUMPTARGET (__sigjmp_save)
+       b       JUMPTARGET (__sigjmp_save_symbol)
 #else
        mflr    r0
        std     r0,FRAME_LR_SAVE(r1)
        stdu    r1,-FRAME_MIN_SIZE(r1)
        cfi_adjust_cfa_offset(FRAME_MIN_SIZE)
        cfi_offset(lr,FRAME_LR_SAVE)
-       bl      JUMPTARGET (__sigjmp_save)
+       bl      JUMPTARGET (__sigjmp_save_symbol)
        nop
        ld      r0,FRAME_MIN_SIZE+FRAME_LR_SAVE(r1)
        addi    r1,r1,FRAME_MIN_SIZE
        mtlr    r0
        blr
 #endif
-END (__sigsetjmp)
+END (__sigsetjmp_symbol)
index 0a3b2fc..5c6baf5 100644 (file)
 
 #if defined NOT_IN_libc
 /* Build a non-versioned object for rtld-*.  */
+# define setjmp_symbol setjmp
+# define _setjmp_symbol _setjmp
+# define __sigsetjmp_symbol __sigsetjmp
+# define __sigjmp_save_symbol __sigjmp_save
 # include "setjmp-common.S"
 
 #else /* !NOT_IN_libc */
 versioned_symbol (libc, __vmxsetjmp, setjmp, GLIBC_2_3_4)
 versioned_symbol (libc, __vmx_setjmp, _setjmp, GLIBC_2_3_4)
 versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
-# define setjmp __vmxsetjmp
-# define _setjmp __vmx_setjmp
-# define __sigsetjmp __vmx__sigsetjmp
-# define __sigjmp_save __vmx__sigjmp_save
+# define setjmp_symbol __vmxsetjmp
+# define _setjmp_symbol __vmx_setjmp
+# define __sigsetjmp_symbol __vmx__sigsetjmp
+# define __sigjmp_save_symbol __vmx__sigjmp_save
 # include "setjmp-common.S"
 strong_alias (__vmxsetjmp, __vmx__setjmp)
 strong_alias (__vmx__sigsetjmp, __setjmp)
 
 # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)
-#  undef setjmp
-#  undef _setjmp
-#  undef __sigsetjmp
-#  undef __sigjmp_save
+#  undef setjmp_symbol
+#  undef _setjmp_symbol
+#  undef __sigsetjmp_symbol
+#  undef __sigjmp_save_symbol
 #  undef JB_SIZE
 #  define __NO_VMX__
 compat_symbol (libc, __novmxsetjmp, setjmp, GLIBC_2_3)
 compat_symbol (libc, __novmx_setjmp,_setjmp, GLIBC_2_3);
 compat_symbol (libc, __novmx__sigsetjmp,__sigsetjmp, GLIBC_2_3)
-#  define setjmp __novmxsetjmp
-#  define _setjmp __novmx_setjmp
-#  define __sigsetjmp __novmx__sigsetjmp
-#  define __sigjmp_save __novmx__sigjmp_save
+#  define setjmp_symbol __novmxsetjmp
+#  define _setjmp_symbol __novmx_setjmp
+#  define __sigsetjmp_symbol __novmx__sigsetjmp
+#  define __sigjmp_save_symbol __novmx__sigjmp_save
 #  include "setjmp-common.S"
 strong_alias (__novmxsetjmp, __novmx__setjmp)
 # endif
index 978370e..6e88b61 100644 (file)
@@ -24,7 +24,7 @@
        .string "longjmp causes uninitialized stack frame"
        .text
 
-#define __longjmp ____longjmp_chk
+#define __longjmp_symbol ____longjmp_chk
 
 #ifdef PIC
 #  define LOAD_ARG \