(ELF_MACHINE_RUNTIME_TRAMPOLINE): Handle profiling.
authoraj <aj>
Fri, 29 Jun 2001 17:51:04 +0000 (17:51 +0000)
committeraj <aj>
Fri, 29 Jun 2001 17:51:04 +0000 (17:51 +0000)
sysdeps/powerpc/dl-machine.h

index f3f6a13..ace7aab 100644 (file)
@@ -102,6 +102,7 @@ elf_machine_load_address (void)
 /* This code is used in dl-runtime.c to call the `fixup' function
    and then redirect to the address it returns.  It is called
    from code built in the PLT by elf_machine_runtime_setup.  */
 /* This code is used in dl-runtime.c to call the `fixup' function
    and then redirect to the address it returns.  It is called
    from code built in the PLT by elf_machine_runtime_setup.  */
+#if !defined PROF
 #define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
        .section \".text\"      \n\
        .align 2        \n\
 #define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
        .section \".text\"      \n\
        .align 2        \n\
@@ -198,6 +199,59 @@ _dl_prof_resolve:  \n\
  # Undo '.section text'.\n\
        .previous       \n\
 ");
  # Undo '.section text'.\n\
        .previous       \n\
 ");
+#else
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
+       .section \".text\"      \n\
+       .align 2        \n\
+       .globl _dl_runtime_resolve      \n\
+       .globl _dl_prof_resolve \n\
+       .type _dl_runtime_resolve,@function     \n\
+       .type _dl_prof_resolve,@function        \n\
+_dl_runtime_resolve:   \n\
+_dl_prof_resolve:      \n\
+ # We need to save the registers used to pass parameters, and register 0,\n\
+ # which is used by _mcount; the registers are saved in a stack frame.\n\
+       stwu 1,-64(1)   \n\
+       stw 0,12(1)     \n\
+       stw 3,16(1)     \n\
+       stw 4,20(1)     \n\
+ # The code that calls this has put parameters for `fixup' in r12 and r11.\n\
+       mr 3,12 \n\
+       stw 5,24(1)     \n\
+       mr 4,11 \n\
+       stw 6,28(1)     \n\
+       mflr 0  \n\
+ # We also need to save some of the condition register fields.\n\
+       stw 7,32(1)     \n\
+       stw 0,48(1)     \n\
+       stw 8,36(1)     \n\
+       mfcr 0  \n\
+       stw 9,40(1)     \n\
+       stw 10,44(1)    \n\
+       stw 0,8(1)      \n\
+       bl fixup@local  \n\
+ # 'fixup' returns the address we want to branch to.\n\
+       mtctr 3 \n\
+ # Put the registers back...\n\
+       lwz 0,48(1)     \n\
+       lwz 10,44(1)    \n\
+       lwz 9,40(1)     \n\
+       mtlr 0  \n\
+       lwz 8,36(1)     \n\
+       lwz 0,8(1)      \n\
+       lwz 7,32(1)     \n\
+       lwz 6,28(1)     \n\
+       mtcrf 0xFF,0    \n\
+       lwz 5,24(1)     \n\
+       lwz 4,20(1)     \n\
+       lwz 3,16(1)     \n\
+       lwz 0,12(1)     \n\
+ # ...unwind the stack frame, and jump to the PLT entry we updated.\n\
+       addi 1,1,64     \n\
+       bctr    \n\
+       .size    _dl_runtime_resolve,.-_dl_runtime_resolve      \n\
+");
+#endif
 
 /* The actual _start code is in dl-start.S.  Use a really
    ugly bit of assembler to let dl-start.o see _dl_start.  */
 
 /* The actual _start code is in dl-start.S.  Use a really
    ugly bit of assembler to let dl-start.o see _dl_start.  */