AArch64: Reformat inline-asm in elf_machine_load_address

This patch reformats the inline-asm in elf_machine_load_address so it is
easier to change only part of the inline-asm.  That is using string
concatenating instead of string continuation.

Also document why this inline-asm works - it depends on the 32bit
relocation being resolved at link time.

ChangeLog:

2014-11-21  Will Newton  <will.newton@linaro.org>
	    Andrew Pinski  <andrew.pinski@caviumnetworks.com>

	* sysdeps/aarch64/dl-machine.h (elf_machine_load_address):
	Refactor inline-asm.  Also add comment.
This commit is contained in:
Andrew Pinski 2014-10-27 00:59:42 -07:00 committed by Will Newton
parent 01194ba18d
commit 6d3db89b12
2 changed files with 15 additions and 9 deletions

View File

@ -1,6 +1,9 @@
2014-11-21 Will Newton <will.newton@linaro.org>
Andrew Pinski <andrew.pinski@caviumnetworks.com>
* sysdeps/aarch64/dl-machine.h (elf_machine_load_address):
Refactor inline-asm. Also add comment.
* sysdeps/aarch64/bits/link.h (la_aarch64_gnu_pltenter): Use
ElfW macro instead of hardcoded Elf64 types.
(la_aarch64_gnu_pltenter): Likewise.

View File

@ -52,19 +52,22 @@ elf_machine_load_address (void)
The choice of symbol is arbitrary. The static address we obtain
by constructing a non GOT reference to the symbol, the dynamic
address of the symbol we compute using adrp/add to compute the
symbol's address relative to the PC. */
symbol's address relative to the PC.
This depends on 32bit relocations being resolved at link time
and that the static address fits in the 32bits. */
ElfW(Addr) static_addr;
ElfW(Addr) dynamic_addr;
asm (" \n\
adrp %1, _dl_start; \n\
add %1, %1, #:lo12:_dl_start \n\
ldr %w0, 1f \n\
b 2f \n\
1: .word _dl_start \n\
2: \n\
" : "=r" (static_addr), "=r" (dynamic_addr));
asm (" \n"
" adrp %1, _dl_start; \n"
" add %1, %1, #:lo12:_dl_start \n"
" ldr %w0, 1f \n"
" b 2f \n"
"1: \n"
" .word _dl_start \n"
"2: \n"
: "=r" (static_addr), "=r" (dynamic_addr));
return dynamic_addr - static_addr;
}