]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix microMIPS glibc by avoiding hardcoded instruction length assumptions.
authorJoseph Myers <joseph@codesourcery.com>
Fri, 29 Jan 2010 01:54:52 +0000 (01:54 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 29 Jan 2010 01:54:52 +0000 (01:54 +0000)
microMIPS is a variable-length encoding of the MIPS32 instruction set
(plus some extra instructions).  As it supports almost all of MIPS32,
assembly sources in glibc do not generally need changes to work with
microMIPS, but dl-trampoline.c contains some code with a hardcoded
assumption that three instructions occupy twelve bytes.  This patch
fixes this code for microMIPS by using the difference between two
labels to let the assembler calculate the relevant length.

ChangeLog.mips
sysdeps/mips/dl-trampoline.c

index 5795926d3596ea3502f154806ce5537c93357534..6d47986f68939e3b081f11fd718a15d1be7e4850 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/mips/dl-trampoline.c (_dl_runtime_resolve,
+       _dl_runtime_pltresolve): Calculate offset from start of function
+       to .cpload instead of hardcoding instruction size.
+
 2010-01-11  Joseph Myers  <joseph@codesourcery.com>
 
        * sysdeps/unix/sysv/linux/mips/bits/stat.h: Fix double-inclusion
index ff58b0d5e2970b1e34ae7526960aafbdb9a3030e..2c9414035c09a6d933457421eb46b28f616e2102 100644 (file)
@@ -278,13 +278,13 @@ _dl_runtime_resolve:\n\
        .frame  $29, " STRINGXP(ELF_DL_FRAME_SIZE) ", $31\n\
        .set noreorder\n\
        # Save GP.\n\
-       move    $3, $28\n\
+1:     move    $3, $28\n\
        # Save arguments and sp value in stack.\n\
        " STRINGXP(PTR_SUBIU) "  $29, " STRINGXP(ELF_DL_FRAME_SIZE) "\n\
        # Modify t9 ($25) so as to point .cpload instruction.\n\
-       " IFABIO32(STRINGXP(PTR_ADDIU) "        $25, 12\n") "\
+       " IFABIO32(STRINGXP(PTR_ADDIU) "        $25, (2f-1b)\n") "\
        # Compute GP.\n\
-       " STRINGXP(SETUP_GP) "\n\
+2:     " STRINGXP(SETUP_GP) "\n\
        " STRINGXV(SETUP_GP64 (0, _dl_runtime_resolve)) "\n\
        .set reorder\n\
        # Save slot call pc.\n\
@@ -334,13 +334,13 @@ _dl_runtime_pltresolve:\n\
        .frame  $29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) ", $31\n\
        .set noreorder\n\
        # Save arguments and sp value in stack.\n\
-       " STRINGXP(PTR_SUBIU) " $29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) "\n\
+1:     " STRINGXP(PTR_SUBIU) " $29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) "\n\
        " IFABIO32(STRINGXP(PTR_L) "    $13, " STRINGXP(PTRSIZE) "($28)") "\n\
        " IFNEWABI(STRINGXP(PTR_L) "    $13, " STRINGXP(PTRSIZE) "($14)") "\n\
        # Modify t9 ($25) so as to point .cpload instruction.\n\
-       " IFABIO32(STRINGXP(PTR_ADDIU) "        $25, 12\n") "\
+       " IFABIO32(STRINGXP(PTR_ADDIU) "        $25, (2f-1b)\n") "\
        # Compute GP.\n\
-       " STRINGXP(SETUP_GP) "\n\
+2:     " STRINGXP(SETUP_GP) "\n\
        " STRINGXV(SETUP_GP64 (0, _dl_runtime_pltresolve)) "\n\
        .set reorder\n\
        " IFABIO32(STRINGXP(CPRESTORE(32))) "\n\