Skip to content

Commit 2fb27a2

Browse files
committed
Merging r360862:
------------------------------------------------------------------------ r360862 | mstorsjo | 2019-05-15 23:49:20 -0700 (Wed, 15 May 2019) | 12 lines [PPC] Fix 32-bit build of libunwind Clang integrated assembler was unable to build libunwind PPC32 assembly code, present in functions used to save/restore register context. This change consists in replacing the assembly style used in libunwind source, to one that is compatible with both Clang integrated assembler as well as GNU assembler. Patch by Leandro Lupori! Differential Revision: https://reviews.llvm.org/D61792 ------------------------------------------------------------------------ llvm-svn: 363030
1 parent 213f2ed commit 2fb27a2

File tree

3 files changed

+254
-256
lines changed

3 files changed

+254
-256
lines changed

libunwind/src/UnwindRegistersRestore.S

+119-119
Original file line numberDiff line numberDiff line change
@@ -396,119 +396,119 @@ Lnovec:
396396
#elif defined(__ppc__)
397397

398398
DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_ppc6jumptoEv)
399-
;
400-
; void libunwind::Registers_ppc::jumpto()
401-
;
402-
; On entry:
403-
; thread_state pointer is in r3
404-
;
405-
406-
; restore integral registerrs
407-
; skip r0 for now
408-
; skip r1 for now
409-
lwz r2, 16(r3)
410-
; skip r3 for now
411-
; skip r4 for now
412-
; skip r5 for now
413-
lwz r6, 32(r3)
414-
lwz r7, 36(r3)
415-
lwz r8, 40(r3)
416-
lwz r9, 44(r3)
417-
lwz r10, 48(r3)
418-
lwz r11, 52(r3)
419-
lwz r12, 56(r3)
420-
lwz r13, 60(r3)
421-
lwz r14, 64(r3)
422-
lwz r15, 68(r3)
423-
lwz r16, 72(r3)
424-
lwz r17, 76(r3)
425-
lwz r18, 80(r3)
426-
lwz r19, 84(r3)
427-
lwz r20, 88(r3)
428-
lwz r21, 92(r3)
429-
lwz r22, 96(r3)
430-
lwz r23,100(r3)
431-
lwz r24,104(r3)
432-
lwz r25,108(r3)
433-
lwz r26,112(r3)
434-
lwz r27,116(r3)
435-
lwz r28,120(r3)
436-
lwz r29,124(r3)
437-
lwz r30,128(r3)
438-
lwz r31,132(r3)
439-
440-
; restore float registers
441-
lfd f0, 160(r3)
442-
lfd f1, 168(r3)
443-
lfd f2, 176(r3)
444-
lfd f3, 184(r3)
445-
lfd f4, 192(r3)
446-
lfd f5, 200(r3)
447-
lfd f6, 208(r3)
448-
lfd f7, 216(r3)
449-
lfd f8, 224(r3)
450-
lfd f9, 232(r3)
451-
lfd f10,240(r3)
452-
lfd f11,248(r3)
453-
lfd f12,256(r3)
454-
lfd f13,264(r3)
455-
lfd f14,272(r3)
456-
lfd f15,280(r3)
457-
lfd f16,288(r3)
458-
lfd f17,296(r3)
459-
lfd f18,304(r3)
460-
lfd f19,312(r3)
461-
lfd f20,320(r3)
462-
lfd f21,328(r3)
463-
lfd f22,336(r3)
464-
lfd f23,344(r3)
465-
lfd f24,352(r3)
466-
lfd f25,360(r3)
467-
lfd f26,368(r3)
468-
lfd f27,376(r3)
469-
lfd f28,384(r3)
470-
lfd f29,392(r3)
471-
lfd f30,400(r3)
472-
lfd f31,408(r3)
473-
474-
; restore vector registers if any are in use
475-
lwz r5,156(r3) ; test VRsave
476-
cmpwi r5,0
477-
beq Lnovec
478-
479-
subi r4,r1,16
480-
rlwinm r4,r4,0,0,27 ; mask low 4-bits
481-
; r4 is now a 16-byte aligned pointer into the red zone
482-
; the _vectorRegisters may not be 16-byte aligned so copy via red zone temp buffer
399+
//
400+
// void libunwind::Registers_ppc::jumpto()
401+
//
402+
// On entry:
403+
// thread_state pointer is in r3
404+
//
405+
406+
// restore integral registerrs
407+
// skip r0 for now
408+
// skip r1 for now
409+
lwz %r2, 16(%r3)
410+
// skip r3 for now
411+
// skip r4 for now
412+
// skip r5 for now
413+
lwz %r6, 32(%r3)
414+
lwz %r7, 36(%r3)
415+
lwz %r8, 40(%r3)
416+
lwz %r9, 44(%r3)
417+
lwz %r10, 48(%r3)
418+
lwz %r11, 52(%r3)
419+
lwz %r12, 56(%r3)
420+
lwz %r13, 60(%r3)
421+
lwz %r14, 64(%r3)
422+
lwz %r15, 68(%r3)
423+
lwz %r16, 72(%r3)
424+
lwz %r17, 76(%r3)
425+
lwz %r18, 80(%r3)
426+
lwz %r19, 84(%r3)
427+
lwz %r20, 88(%r3)
428+
lwz %r21, 92(%r3)
429+
lwz %r22, 96(%r3)
430+
lwz %r23,100(%r3)
431+
lwz %r24,104(%r3)
432+
lwz %r25,108(%r3)
433+
lwz %r26,112(%r3)
434+
lwz %r27,116(%r3)
435+
lwz %r28,120(%r3)
436+
lwz %r29,124(%r3)
437+
lwz %r30,128(%r3)
438+
lwz %r31,132(%r3)
439+
440+
// restore float registers
441+
lfd %f0, 160(%r3)
442+
lfd %f1, 168(%r3)
443+
lfd %f2, 176(%r3)
444+
lfd %f3, 184(%r3)
445+
lfd %f4, 192(%r3)
446+
lfd %f5, 200(%r3)
447+
lfd %f6, 208(%r3)
448+
lfd %f7, 216(%r3)
449+
lfd %f8, 224(%r3)
450+
lfd %f9, 232(%r3)
451+
lfd %f10,240(%r3)
452+
lfd %f11,248(%r3)
453+
lfd %f12,256(%r3)
454+
lfd %f13,264(%r3)
455+
lfd %f14,272(%r3)
456+
lfd %f15,280(%r3)
457+
lfd %f16,288(%r3)
458+
lfd %f17,296(%r3)
459+
lfd %f18,304(%r3)
460+
lfd %f19,312(%r3)
461+
lfd %f20,320(%r3)
462+
lfd %f21,328(%r3)
463+
lfd %f22,336(%r3)
464+
lfd %f23,344(%r3)
465+
lfd %f24,352(%r3)
466+
lfd %f25,360(%r3)
467+
lfd %f26,368(%r3)
468+
lfd %f27,376(%r3)
469+
lfd %f28,384(%r3)
470+
lfd %f29,392(%r3)
471+
lfd %f30,400(%r3)
472+
lfd %f31,408(%r3)
473+
474+
// restore vector registers if any are in use
475+
lwz %r5, 156(%r3) // test VRsave
476+
cmpwi %r5, 0
477+
beq Lnovec
483478

479+
subi %r4, %r1, 16
480+
rlwinm %r4, %r4, 0, 0, 27 // mask low 4-bits
481+
// r4 is now a 16-byte aligned pointer into the red zone
482+
// the _vectorRegisters may not be 16-byte aligned so copy via red zone temp buffer
483+
484484

485485
#define LOAD_VECTOR_UNALIGNEDl(_index) \
486-
andis. r0,r5,(1<<(15-_index)) @\
487-
beq Ldone ## _index @\
488-
lwz r0, 424+_index*16(r3) @\
489-
stw r0, 0(r4) @\
490-
lwz r0, 424+_index*16+4(r3) @\
491-
stw r0, 4(r4) @\
492-
lwz r0, 424+_index*16+8(r3) @\
493-
stw r0, 8(r4) @\
494-
lwz r0, 424+_index*16+12(r3)@\
495-
stw r0, 12(r4) @\
496-
lvx v ## _index,0,r4 @\
497-
Ldone ## _index:
486+
andis. %r0, %r5, (1<<(15-_index)) SEPARATOR \
487+
beq Ldone ## _index SEPARATOR \
488+
lwz %r0, 424+_index*16(%r3) SEPARATOR \
489+
stw %r0, 0(%r4) SEPARATOR \
490+
lwz %r0, 424+_index*16+4(%r3) SEPARATOR \
491+
stw %r0, 4(%r4) SEPARATOR \
492+
lwz %r0, 424+_index*16+8(%r3) SEPARATOR \
493+
stw %r0, 8(%r4) SEPARATOR \
494+
lwz %r0, 424+_index*16+12(%r3) SEPARATOR \
495+
stw %r0, 12(%r4) SEPARATOR \
496+
lvx %v ## _index, 0, %r4 SEPARATOR \
497+
Ldone ## _index:
498498

499499
#define LOAD_VECTOR_UNALIGNEDh(_index) \
500-
andi. r0,r5,(1<<(31-_index)) @\
501-
beq Ldone ## _index @\
502-
lwz r0, 424+_index*16(r3) @\
503-
stw r0, 0(r4) @\
504-
lwz r0, 424+_index*16+4(r3) @\
505-
stw r0, 4(r4) @\
506-
lwz r0, 424+_index*16+8(r3) @\
507-
stw r0, 8(r4) @\
508-
lwz r0, 424+_index*16+12(r3)@\
509-
stw r0, 12(r4) @\
510-
lvx v ## _index,0,r4 @\
511-
Ldone ## _index:
500+
andi. %r0, %r5, (1<<(31-_index)) SEPARATOR \
501+
beq Ldone ## _index SEPARATOR \
502+
lwz %r0, 424+_index*16(%r3) SEPARATOR \
503+
stw %r0, 0(%r4) SEPARATOR \
504+
lwz %r0, 424+_index*16+4(%r3) SEPARATOR \
505+
stw %r0, 4(%r4) SEPARATOR \
506+
lwz %r0, 424+_index*16+8(%r3) SEPARATOR \
507+
stw %r0, 8(%r4) SEPARATOR \
508+
lwz %r0, 424+_index*16+12(%r3) SEPARATOR \
509+
stw %r0, 12(%r4) SEPARATOR \
510+
lvx %v ## _index, 0, %r4 SEPARATOR \
511+
Ldone ## _index:
512512

513513

514514
LOAD_VECTOR_UNALIGNEDl(0)
@@ -545,17 +545,17 @@ Ldone ## _index:
545545
LOAD_VECTOR_UNALIGNEDh(31)
546546

547547
Lnovec:
548-
lwz r0, 136(r3) ; __cr
549-
mtocrf 255,r0
550-
lwz r0, 148(r3) ; __ctr
551-
mtctr r0
552-
lwz r0, 0(r3) ; __ssr0
553-
mtctr r0
554-
lwz r0, 8(r3) ; do r0 now
555-
lwz r5,28(r3) ; do r5 now
556-
lwz r4,24(r3) ; do r4 now
557-
lwz r1,12(r3) ; do sp now
558-
lwz r3,20(r3) ; do r3 last
548+
lwz %r0, 136(%r3) // __cr
549+
mtcr %r0
550+
lwz %r0, 148(%r3) // __ctr
551+
mtctr %r0
552+
lwz %r0, 0(%r3) // __ssr0
553+
mtctr %r0
554+
lwz %r0, 8(%r3) // do r0 now
555+
lwz %r5, 28(%r3) // do r5 now
556+
lwz %r4, 24(%r3) // do r4 now
557+
lwz %r1, 12(%r3) // do sp now
558+
lwz %r3, 20(%r3) // do r3 last
559559
bctr
560560

561561
#elif defined(__arm64__) || defined(__aarch64__)

0 commit comments

Comments
 (0)