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> 2019-10-03 John David Anglin <danglin@gcc.gnu.org>
* config/pa/fptr.c: Disable -Warray-bounds warning. * 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 ; An inline version of dyncall so we don't have to worry
; about long calls to millicode, PIC and other complexities. ; about long calls to millicode, PIC and other complexities.
bb,>=,n %r22,30,L$foo bb,>=,n %r22,30,L$foo
depi 0,31,2,%r22 depi 0,31,2,%r22
ldw 4(%r22),%r19 ldw 0(%r22),%r21
ldw 0(%r22),%r22 ldw 4(%r22),%r19
L$foo L$foo
ldsid (%r22),%r1 ldsid (%r21),%r1
mtsp %r1,%sr0 mtsp %r1,%sr0
ble 0(%sr0,%r22) ble 0(%sr0,%r21)
copy %r31,%r2 copy %r31,%r2
ldw -8(%r30),%r2 ldw -8(%r30),%r2

View File

@ -222,19 +222,26 @@ GSYM($$dyncall)
.proc .proc
.callinfo millicode .callinfo millicode
.entry .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 #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 #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 ldsid (%sr0,%r22),%r1 ; get the "space ident" selected by r22
mtsp %r1,%sr0 ; move that space identifier into sr0 mtsp %r1,%sr0 ; move that space identifier into sr0
be 0(%sr0,%r22) ; branch to the real target be 0(%sr0,%r22) ; branch to the target
#endif
stw %r2,-24(%r30) ; save return address into frame marker stw %r2,-24(%r30) ; save return address into frame marker
#endif
.exit .exit
.procend .procend
#endif #endif