Fix microMIPS glibc by avoiding hardcoded instruction length assumptions.

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.
This commit is contained in:
Joseph Myers 2010-01-29 01:54:52 +00:00
parent fdefc0e1f1
commit 54b7103af4
2 changed files with 12 additions and 6 deletions

View 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

View 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\