This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
RE: [Patch, MIPS] Modify dl-machine.h for mips32r6/mips64r6
- From: Steve Ellcey <sellcey at imgtec dot com>
- To: Matthew Fortune <Matthew dot Fortune at imgtec dot com>
- Cc: "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>
- Date: Tue, 23 Dec 2014 16:07:41 -0800
- Subject: RE: [Patch, MIPS] Modify dl-machine.h for mips32r6/mips64r6
- Authentication-results: sourceware.org; auth=none
- References: <67afeb7f-c91f-4702-bf3e-97d9d22bd9b7 at BAMAIL02 dot ba dot imgtec dot org> <6D39441BF12EF246A7ABCE6654B0235320F8CD68 at LEMAIL01 dot le dot imgtec dot org>
- Reply-to: <sellcey at imgtec dot com>
On Fri, 2014-12-19 at 13:54 -0800, Matthew Fortune wrote:
> I never got to reviewing this internally. We should switch this to using
> ADDIUPC.
>
> The goal of this code I believe is to determine the relative offset from the
> static and dynamic locations of ld.so.
>
> " STRINGXP (PTR_LA) " %0, 0f\n"
> 0: addiupc <reg>, 0
> " STRINGXP (PTR_SUBU) " %0, <reg>, %0\n"
>
> We should also do something similar with the other case.
>
> Thanks,
> Matthew
How does this look Matthew? There were no regressions in testing. I
have also fixed the preprocessor indentation issues that Joseph pointed
out and I added an include of <sysdep.h> so that __mips_isa_rev is
always defined.
Steve Ellcey
sellcey@imgtec.com
2014-12-23 Steve Ellcey <sellcey@imgtec.com>
* sysdeps/mips/dl-machine.h (elf_machine_load_address): Replace
bltzal with addiupc.
(RTLD_START): Ditto.
diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h
index 5000d2a..c69fdd8 100644
--- a/sysdeps/mips/dl-machine.h
+++ b/sysdeps/mips/dl-machine.h
@@ -30,6 +30,7 @@
#endif
#include <sgidefs.h>
+#include <sysdep.h>
#include <sys/asm.h>
#include <dl-tls.h>
@@ -138,9 +139,14 @@ elf_machine_load_address (void)
#ifndef __mips16
asm (" .set noreorder\n"
" " STRINGXP (PTR_LA) " %0, 0f\n"
+# if __mips_isa_rev < 6
" bltzal $0, 0f\n"
" nop\n"
"0: " STRINGXP (PTR_SUBU) " %0, $31, %0\n"
+# else
+ "0: addiupc $31, 0\n"
+ " " STRINGXP (PTR_SUBU) " %0, $31, %0\n"
+# endif
" .set reorder\n"
: "=r" (addr)
: /* No inputs */
@@ -241,6 +247,13 @@ do { \
and not just plain _start. */
#ifndef __mips16
+# if __mips_isa_rev < 6
+# define LCOFF STRINGXP(.Lcof2)
+# define LOAD_31 STRINGXP(bltzal $8) "," STRINGXP(.Lcof2)
+# else
+# define LCOFF STRINGXP(.Lcof1)
+# define LOAD_31 "addiupc $31, 0"
+# endif
# define RTLD_START asm (\
".text\n\
" _RTLD_PROLOGUE(ENTRY_POINT) "\
@@ -255,9 +268,9 @@ do { \
move $4, $29\n\
" STRINGXP(PTR_SUBIU) " $29, 16\n\
\n\
- " STRINGXP(PTR_LA) " $8, .Lcoff\n\
- bltzal $8, .Lcoff\n\
-.Lcoff: " STRINGXP(PTR_SUBU) " $8, $31, $8\n\
+ " STRINGXP(PTR_LA) " $8, " LCOFF "\n\
+.Lcof1: " LOAD_31 "\n\
+.Lcof2: " STRINGXP(PTR_SUBU) " $8, $31, $8\n\
\n\
" STRINGXP(PTR_LA) " $25, _dl_start\n\
" STRINGXP(PTR_ADDU) " $25, $8\n\