Add and use sysdeps/i386/link-defines.sym
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 7 Jul 2015 12:23:24 +0000 (05:23 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 7 Jul 2015 12:23:40 +0000 (05:23 -0700)
Define macros for fields in La_i86_regs and La_i86_retval and use them
in dl-trampoline.S, instead of hardcoded values.

* sysdeps/i386/Makefile (gen-as-const-headers)[elf]: Add
link-defines.sym.
* sysdeps/i386/dl-trampoline.S: Include <link-defines.h>.
(_dl_runtime_profile): Use LONG_DOUBLE_SIZE, LRV_SIZE,
LRV_EAX_OFFSET, LRV_EDX_OFFSET, LRV_ST0_OFFSET, LRV_ST1_OFFSET
and LR_SIZE.
* sysdeps/i386/link-defines.sym: New file.

ChangeLog
sysdeps/i386/Makefile
sysdeps/i386/dl-trampoline.S
sysdeps/i386/link-defines.sym [new file with mode: 0644]

index 7348ef4..35347e2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2015-07-07  H.J. Lu  <hongjiu.lu@intel.com>
 
+       * sysdeps/i386/Makefile (gen-as-const-headers)[elf]: Add
+       link-defines.sym.
+       * sysdeps/i386/dl-trampoline.S: Include <link-defines.h>.
+       (_dl_runtime_profile): Use LONG_DOUBLE_SIZE, LRV_SIZE,
+       LRV_EAX_OFFSET, LRV_EDX_OFFSET, LRV_ST0_OFFSET, LRV_ST1_OFFSET
+       and LR_SIZE.
+       * sysdeps/i386/link-defines.sym: New file.
+
+2015-07-07  H.J. Lu  <hongjiu.lu@intel.com>
+
        * sysdeps/i386/Makefile (tests)[elf]: Add tst-audit3.
        (modules-names): Add tst-auditmod3a tst-auditmod3b.
        ($(objpfx)tst-audit3): New rule.
index 910edff..11f425d 100644 (file)
@@ -33,6 +33,7 @@ sysdep-CFLAGS += -mpreferred-stack-boundary=4
 else
 ifeq ($(subdir),csu)
 sysdep-CFLAGS += -mpreferred-stack-boundary=4
+gen-as-const-headers += link-defines.sym
 else
 # Likewise, any function which calls user callbacks
 uses-callbacks += -mpreferred-stack-boundary=4
index f11972c..7c72b03 100644 (file)
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <link-defines.h>
 
        .text
        .globl _dl_runtime_resolve
@@ -161,24 +162,32 @@ _dl_runtime_profile:
            +4      free
           %esp     free
        */
-       subl $20, %esp
-       cfi_adjust_cfa_offset (20)
-       movl %eax, (%esp)
-       movl %edx, 4(%esp)
-       fstpt 8(%esp)
-       fstpt 20(%esp)
+#if LONG_DOUBLE_SIZE != 12
+# error "long double size must be 12 bytes"
+#endif
+       # Allocate space for La_i86_retval and subtract 12 free bytes.
+       subl $(LRV_SIZE - 12), %esp
+       cfi_adjust_cfa_offset (LRV_SIZE - 12)
+       movl %eax, LRV_EAX_OFFSET(%esp)
+       movl %edx, LRV_EDX_OFFSET(%esp)
+       fstpt LRV_ST0_OFFSET(%esp)
+       fstpt LRV_ST1_OFFSET(%esp)
        pushl %esp
        cfi_adjust_cfa_offset (4)
-       leal 36(%esp), %ecx
-       movl 56(%esp), %eax
-       movl 60(%esp), %edx
+       # Address of La_i86_regs area.
+       leal (LRV_SIZE + 4)(%esp), %ecx
+       # PLT2
+       movl (LRV_SIZE + 4 + LR_SIZE)(%esp), %eax
+       # PLT1
+       movl (LRV_SIZE + 4 + LR_SIZE + 4)(%esp), %edx
        call _dl_call_pltexit
-       movl (%esp), %eax
-       movl 4(%esp), %edx
-       fldt 20(%esp)
-       fldt 8(%esp)
-       addl $60, %esp
-       cfi_adjust_cfa_offset (-60)
+       movl LRV_EAX_OFFSET(%esp), %eax
+       movl LRV_EDX_OFFSET(%esp), %edx
+       fldt LRV_ST1_OFFSET(%esp)
+       fldt LRV_ST0_OFFSET(%esp)
+       # Restore stack before return.
+       addl $(LRV_SIZE + 4 + LR_SIZE + 4), %esp
+       cfi_adjust_cfa_offset (-(LRV_SIZE + 4 + LR_SIZE + 4))
        ret
        cfi_endproc
        .size _dl_runtime_profile, .-_dl_runtime_profile
diff --git a/sysdeps/i386/link-defines.sym b/sysdeps/i386/link-defines.sym
new file mode 100644 (file)
index 0000000..a63dcb9
--- /dev/null
@@ -0,0 +1,18 @@
+#include "link.h"
+#include <stddef.h>
+
+--
+LONG_DOUBLE_SIZE       sizeof (long double)
+
+LR_SIZE                        sizeof (struct La_i86_regs)
+LR_EDX_OFFSET          offsetof (struct La_i86_regs, lr_edx)
+LR_ECX_OFFSET          offsetof (struct La_i86_regs, lr_ecx)
+LR_EAX_OFFSET          offsetof (struct La_i86_regs, lr_eax)
+LR_EBP_OFFSET          offsetof (struct La_i86_regs, lr_ebp)
+LR_ESP_OFFSET          offsetof (struct La_i86_regs, lr_esp)
+
+LRV_SIZE               sizeof (struct La_i86_retval)
+LRV_EAX_OFFSET         offsetof (struct La_i86_retval, lrv_eax)
+LRV_EDX_OFFSET         offsetof (struct La_i86_retval, lrv_edx)
+LRV_ST0_OFFSET         offsetof (struct La_i86_retval, lrv_st0)
+LRV_ST1_OFFSET         offsetof (struct La_i86_retval, lrv_st1)