lib2funcs.S (__gcc_plt_call): Load branch target to %r21.

* config/pa/lib2funcs.S (__gcc_plt_call): Load branch target to %r21.
	Load PIC register after branch target.  Fix white space.
	* config/pa/milli64.S ($$dyncall): Separate LINUX and non LINUX
	implementations.  Load PIC register after branch target.  Don't
	clobber function pointer when it points to function descriptor.
	Use nullification instead of branch in LINUX implementation.

From-SVN: r276925
This commit is contained in:
John David Anglin 2019-10-12 19:40:42 +00:00
parent a0f08eceae
commit 1aea083d4b
3 changed files with 30 additions and 14 deletions

View File

@ -1,3 +1,12 @@
2019-10-12 John David Anglin <danglin@gcc.gnu.org>
* config/pa/lib2funcs.S (__gcc_plt_call): Load branch target to %r21.
Load PIC register after branch target. Fix white space.
* config/pa/milli64.S ($$dyncall): Separate LINUX and non LINUX
implementations. Load PIC register after branch target. Don't
clobber function pointer when it points to function descriptor.
Use nullification instead of branch in LINUX implementation.
2019-10-03 John David Anglin <danglin@gcc.gnu.org>
* config/pa/fptr.c: Disable -Warray-bounds warning.

View File

@ -55,13 +55,13 @@ __gcc_plt_call
; An inline version of dyncall so we don't have to worry
; about long calls to millicode, PIC and other complexities.
bb,>=,n %r22,30,L$foo
depi 0,31,2,%r22
ldw 4(%r22),%r19
ldw 0(%r22),%r22
depi 0,31,2,%r22
ldw 0(%r22),%r21
ldw 4(%r22),%r19
L$foo
ldsid (%r22),%r1
mtsp %r1,%sr0
ble 0(%sr0,%r22)
ldsid (%r21),%r1
mtsp %r1,%sr0
ble 0(%sr0,%r21)
copy %r31,%r2
ldw -8(%r30),%r2

View File

@ -222,19 +222,26 @@ GSYM($$dyncall)
.proc
.callinfo millicode
.entry
bb,>=,n %r22,30,LREF(1) ; branch if not plabel address
depi 0,31,2,%r22 ; clear the two least significant bits
ldw 4(%r22),%r19 ; load new LTP value
ldw 0(%r22),%r22 ; load address of target
LSYM(1)
#ifdef LINUX
bv %r0(%r22) ; branch to the real target
extru,<> %r22,30,1,%r0 ; nullify if plabel bit set
bv,n %r0(%r22) ; branch to target
ldw -2(%r22),%r21 ; load address of target
bv %r0(%r21) ; branch to the real target
ldw 2(%r22),%r19 ; load new LTP value
#else
bb,>=,n %r22,30,LREF(1) ; branch if not plabel address
ldw -2(%r22),%r21 ; load address of target to r21
ldsid (%sr0,%r21),%r1 ; get the "space ident" selected by r21
ldw 2(%r22),%r19 ; load new LTP value
mtsp %r1,%sr0 ; move that space identifier into sr0
be 0(%sr0,%r21) ; branch to the real target
stw %r2,-24(%r30) ; save return address into frame marker
LSYM(1)
ldsid (%sr0,%r22),%r1 ; get the "space ident" selected by r22
mtsp %r1,%sr0 ; move that space identifier into sr0
be 0(%sr0,%r22) ; branch to the real target
#endif
be 0(%sr0,%r22) ; branch to the target
stw %r2,-24(%r30) ; save return address into frame marker
#endif
.exit
.procend
#endif