diff options
Diffstat (limited to 'src/buildvm_ppc.dasc')
-rw-r--r-- | src/buildvm_ppc.dasc | 76 |
1 files changed, 63 insertions, 13 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 0bcc5ad7..1cbf3a74 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -2527,7 +2527,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
2527 | |//-- FFI helper functions ----------------------------------------------- | 2527 | |//-- FFI helper functions ----------------------------------------------- |
2528 | |//----------------------------------------------------------------------- | 2528 | |//----------------------------------------------------------------------- |
2529 | | | 2529 | | |
2530 | |->vm_ffi_call: | 2530 | |->vm_ffi_call: // Call C function via FFI. |
2531 | | // Caveat: needs special frame unwinding, see below. | ||
2531 | #if LJ_HASFFI | 2532 | #if LJ_HASFFI |
2532 | | .type CCSTATE, CCallState, CARG1 | 2533 | | .type CCSTATE, CCallState, CARG1 |
2533 | | lwz TMP1, CCSTATE->spadj | 2534 | | lwz TMP1, CCSTATE->spadj |
@@ -2541,8 +2542,10 @@ static void build_subroutines(BuildCtx *ctx) | |||
2541 | | addic. CARG2, CARG2, -1 | 2542 | | addic. CARG2, CARG2, -1 |
2542 | | stwux sp, sp, TMP1 | 2543 | | stwux sp, sp, TMP1 |
2543 | | crnot 4*cr1+eq, 4*cr1+eq // For vararg calls. | 2544 | | crnot 4*cr1+eq, 4*cr1+eq // For vararg calls. |
2544 | | stw CCSTATE, -4(TMP2) | 2545 | | stw r14, -4(TMP2) |
2545 | | li TMP3, 0 | 2546 | | li TMP3, 0 |
2547 | | stw CCSTATE, -8(TMP2) | ||
2548 | | mr r14, TMP2 | ||
2546 | | la TMP1, CCSTATE->stack | 2549 | | la TMP1, CCSTATE->stack |
2547 | | slwi CARG2, CARG2, 2 | 2550 | | slwi CARG2, CARG2, 2 |
2548 | | blty >2 | 2551 | | blty >2 |
@@ -2574,18 +2577,20 @@ static void build_subroutines(BuildCtx *ctx) | |||
2574 | | lwz r10, CCSTATE->gpr[7] | 2577 | | lwz r10, CCSTATE->gpr[7] |
2575 | | lwz CARG1, CCSTATE->gpr[0] // Do this last, since CCSTATE is CARG1. | 2578 | | lwz CARG1, CCSTATE->gpr[0] // Do this last, since CCSTATE is CARG1. |
2576 | | bctrl | 2579 | | bctrl |
2577 | | lwz TMP2, 0(sp) | 2580 | | lwz CCSTATE:TMP1, -8(r14) |
2578 | | lwz CCSTATE:TMP1, -4(TMP2) | 2581 | | lwz TMP2, -4(r14) |
2579 | | lwz TMP0, 4(TMP2) | 2582 | | lwz TMP0, 4(r14) |
2580 | | stw CARG1, CCSTATE:TMP1->gpr[0] | 2583 | | stw CARG1, CCSTATE:TMP1->gpr[0] |
2581 | | stfd FARG1, CCSTATE:TMP1->fpr[0] | 2584 | | stfd FARG1, CCSTATE:TMP1->fpr[0] |
2582 | | stw CARG2, CCSTATE:TMP1->gpr[1] | 2585 | | stw CARG2, CCSTATE:TMP1->gpr[1] |
2583 | | mtlr TMP0 | 2586 | | mtlr TMP0 |
2584 | | stw CARG3, CCSTATE:TMP1->gpr[2] | 2587 | | stw CARG3, CCSTATE:TMP1->gpr[2] |
2585 | | mr sp, TMP2 | 2588 | | mr sp, r14 |
2586 | | stw CARG4, CCSTATE:TMP1->gpr[3] | 2589 | | stw CARG4, CCSTATE:TMP1->gpr[3] |
2590 | | mr r14, TMP2 | ||
2587 | | blr | 2591 | | blr |
2588 | #endif | 2592 | #endif |
2593 | |// Note: vm_ffi_call must be the last function in this object file! | ||
2589 | | | 2594 | | |
2590 | |//----------------------------------------------------------------------- | 2595 | |//----------------------------------------------------------------------- |
2591 | } | 2596 | } |
@@ -4665,6 +4670,7 @@ static int build_backend(BuildCtx *ctx) | |||
4665 | /* Emit pseudo frame-info for all assembler functions. */ | 4670 | /* Emit pseudo frame-info for all assembler functions. */ |
4666 | static void emit_asm_debug(BuildCtx *ctx) | 4671 | static void emit_asm_debug(BuildCtx *ctx) |
4667 | { | 4672 | { |
4673 | int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code); | ||
4668 | int i; | 4674 | int i; |
4669 | switch (ctx->mode) { | 4675 | switch (ctx->mode) { |
4670 | case BUILD_elfasm: | 4676 | case BUILD_elfasm: |
@@ -4692,7 +4698,7 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
4692 | "\t.byte 0xe\n\t.uleb128 %d\n" | 4698 | "\t.byte 0xe\n\t.uleb128 %d\n" |
4693 | "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" | 4699 | "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" |
4694 | "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n", | 4700 | "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n", |
4695 | (int)ctx->codesz, CFRAME_SIZE); | 4701 | fcofs, CFRAME_SIZE); |
4696 | for (i = 14; i <= 31; i++) | 4702 | for (i = 14; i <= 31; i++) |
4697 | fprintf(ctx->fp, | 4703 | fprintf(ctx->fp, |
4698 | "\t.byte %d\n\t.uleb128 %d\n" | 4704 | "\t.byte %d\n\t.uleb128 %d\n" |
@@ -4701,6 +4707,20 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
4701 | fprintf(ctx->fp, | 4707 | fprintf(ctx->fp, |
4702 | "\t.align 2\n" | 4708 | "\t.align 2\n" |
4703 | ".LEFDE0:\n\n"); | 4709 | ".LEFDE0:\n\n"); |
4710 | #if LJ_HASFFI | ||
4711 | fprintf(ctx->fp, | ||
4712 | ".LSFDE1:\n" | ||
4713 | "\t.long .LEFDE1-.LASFDE1\n" | ||
4714 | ".LASFDE1:\n" | ||
4715 | "\t.long .Lframe0\n" | ||
4716 | "\t.long lj_vm_ffi_call\n" | ||
4717 | "\t.long %d\n" | ||
4718 | "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" | ||
4719 | "\t.byte 0x8e\n\t.uleb128 2\n" | ||
4720 | "\t.byte 0xd\n\t.uleb128 0xe\n" | ||
4721 | "\t.align 2\n" | ||
4722 | ".LEFDE1:\n\n", (int)ctx->codesz - fcofs); | ||
4723 | #endif | ||
4704 | fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n"); | 4724 | fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n"); |
4705 | fprintf(ctx->fp, | 4725 | fprintf(ctx->fp, |
4706 | ".Lframe1:\n" | 4726 | ".Lframe1:\n" |
@@ -4720,17 +4740,17 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
4720 | "\t.align 2\n" | 4740 | "\t.align 2\n" |
4721 | ".LECIE1:\n\n"); | 4741 | ".LECIE1:\n\n"); |
4722 | fprintf(ctx->fp, | 4742 | fprintf(ctx->fp, |
4723 | ".LSFDE1:\n" | 4743 | ".LSFDE2:\n" |
4724 | "\t.long .LEFDE1-.LASFDE1\n" | 4744 | "\t.long .LEFDE2-.LASFDE2\n" |
4725 | ".LASFDE1:\n" | 4745 | ".LASFDE2:\n" |
4726 | "\t.long .LASFDE1-.Lframe1\n" | 4746 | "\t.long .LASFDE2-.Lframe1\n" |
4727 | "\t.long .Lbegin-.\n" | 4747 | "\t.long .Lbegin-.\n" |
4728 | "\t.long %d\n" | 4748 | "\t.long %d\n" |
4729 | "\t.uleb128 0\n" /* augmentation length */ | 4749 | "\t.uleb128 0\n" /* augmentation length */ |
4730 | "\t.byte 0xe\n\t.uleb128 %d\n" | 4750 | "\t.byte 0xe\n\t.uleb128 %d\n" |
4731 | "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" | 4751 | "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" |
4732 | "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n", | 4752 | "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n", |
4733 | (int)ctx->codesz, CFRAME_SIZE); | 4753 | fcofs, CFRAME_SIZE); |
4734 | for (i = 14; i <= 31; i++) | 4754 | for (i = 14; i <= 31; i++) |
4735 | fprintf(ctx->fp, | 4755 | fprintf(ctx->fp, |
4736 | "\t.byte %d\n\t.uleb128 %d\n" | 4756 | "\t.byte %d\n\t.uleb128 %d\n" |
@@ -4738,7 +4758,37 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
4738 | 0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i)); | 4758 | 0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i)); |
4739 | fprintf(ctx->fp, | 4759 | fprintf(ctx->fp, |
4740 | "\t.align 2\n" | 4760 | "\t.align 2\n" |
4741 | ".LEFDE1:\n\n"); | 4761 | ".LEFDE2:\n\n"); |
4762 | #if LJ_HASFFI | ||
4763 | fprintf(ctx->fp, | ||
4764 | ".Lframe2:\n" | ||
4765 | "\t.long .LECIE2-.LSCIE2\n" | ||
4766 | ".LSCIE2:\n" | ||
4767 | "\t.long 0\n" | ||
4768 | "\t.byte 0x1\n" | ||
4769 | "\t.string \"zR\"\n" | ||
4770 | "\t.uleb128 0x1\n" | ||
4771 | "\t.sleb128 -4\n" | ||
4772 | "\t.byte 65\n" | ||
4773 | "\t.uleb128 1\n" /* augmentation length */ | ||
4774 | "\t.byte 0x1b\n" /* pcrel|sdata4 */ | ||
4775 | "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n" | ||
4776 | "\t.align 2\n" | ||
4777 | ".LECIE2:\n\n"); | ||
4778 | fprintf(ctx->fp, | ||
4779 | ".LSFDE3:\n" | ||
4780 | "\t.long .LEFDE3-.LASFDE3\n" | ||
4781 | ".LASFDE3:\n" | ||
4782 | "\t.long .LASFDE3-.Lframe2\n" | ||
4783 | "\t.long lj_vm_ffi_call-.\n" | ||
4784 | "\t.long %d\n" | ||
4785 | "\t.uleb128 0\n" /* augmentation length */ | ||
4786 | "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" | ||
4787 | "\t.byte 0x8e\n\t.uleb128 2\n" | ||
4788 | "\t.byte 0xd\n\t.uleb128 0xe\n" | ||
4789 | "\t.align 2\n" | ||
4790 | ".LEFDE3:\n\n", (int)ctx->codesz - fcofs); | ||
4791 | #endif | ||
4742 | break; | 4792 | break; |
4743 | default: | 4793 | default: |
4744 | break; | 4794 | break; |