aboutsummaryrefslogtreecommitdiff
path: root/src/buildvm_arm.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildvm_arm.dasc')
-rw-r--r--src/buildvm_arm.dasc28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc
index 9b40ad18..29c616e0 100644
--- a/src/buildvm_arm.dasc
+++ b/src/buildvm_arm.dasc
@@ -2178,7 +2178,8 @@ static void build_subroutines(BuildCtx *ctx)
2178 |//-- FFI helper functions ----------------------------------------------- 2178 |//-- FFI helper functions -----------------------------------------------
2179 |//----------------------------------------------------------------------- 2179 |//-----------------------------------------------------------------------
2180 | 2180 |
2181 |->vm_ffi_call: 2181 |->vm_ffi_call: // Call C function via FFI.
2182 | // Caveat: needs special frame unwinding, see below.
2182#if LJ_HASFFI 2183#if LJ_HASFFI
2183 | .type CCSTATE, CCallState, r4 2184 | .type CCSTATE, CCallState, r4
2184 | push {CCSTATE, r5, r11, lr} 2185 | push {CCSTATE, r5, r11, lr}
@@ -2207,6 +2208,7 @@ static void build_subroutines(BuildCtx *ctx)
2207 | str CRET2, CCSTATE->gpr[1] 2208 | str CRET2, CCSTATE->gpr[1]
2208 | pop {CCSTATE, r5, r11, pc} 2209 | pop {CCSTATE, r5, r11, pc}
2209#endif 2210#endif
2211 |// Note: vm_ffi_call must be the last function in this object file!
2210 | 2212 |
2211 |//----------------------------------------------------------------------- 2213 |//-----------------------------------------------------------------------
2212} 2214}
@@ -4003,6 +4005,7 @@ static int build_backend(BuildCtx *ctx)
4003/* Emit pseudo frame-info for all assembler functions. */ 4005/* Emit pseudo frame-info for all assembler functions. */
4004static void emit_asm_debug(BuildCtx *ctx) 4006static void emit_asm_debug(BuildCtx *ctx)
4005{ 4007{
4008 int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
4006 int i; 4009 int i;
4007 switch (ctx->mode) { 4010 switch (ctx->mode) {
4008 case BUILD_elfasm: 4011 case BUILD_elfasm:
@@ -4028,13 +4031,30 @@ static void emit_asm_debug(BuildCtx *ctx)
4028 "\t.long .Lbegin\n" 4031 "\t.long .Lbegin\n"
4029 "\t.long %d\n" 4032 "\t.long %d\n"
4030 "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ 4033 "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */
4031 "\t.byte 0x8e\n\t.uleb128 1\n", /* Restore lr. */ 4034 "\t.byte 0x8e\n\t.uleb128 1\n", /* offset lr */
4032 (int)ctx->codesz, CFRAME_SIZE); 4035 fcofs, CFRAME_SIZE);
4033 for (i = 11; i >= 4; i--) /* Restore r4-r11. */ 4036 for (i = 11; i >= 4; i--) /* offset r4-r11 */
4034 fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 2+(11-i)); 4037 fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 2+(11-i));
4035 fprintf(ctx->fp, 4038 fprintf(ctx->fp,
4036 "\t.align 2\n" 4039 "\t.align 2\n"
4037 ".LEFDE0:\n\n"); 4040 ".LEFDE0:\n\n");
4041#if LJ_HASFFI
4042 fprintf(ctx->fp,
4043 ".LSFDE1:\n"
4044 "\t.long .LEFDE1-.LASFDE1\n"
4045 ".LASFDE1:\n"
4046 "\t.long .Lframe0\n"
4047 "\t.long lj_vm_ffi_call\n"
4048 "\t.long %d\n"
4049 "\t.byte 0xe\n\t.uleb128 16\n" /* def_cfa_offset */
4050 "\t.byte 0x8e\n\t.uleb128 1\n" /* offset lr */
4051 "\t.byte 0x8b\n\t.uleb128 2\n" /* offset r11 */
4052 "\t.byte 0x85\n\t.uleb128 3\n" /* offset r5 */
4053 "\t.byte 0x84\n\t.uleb128 4\n" /* offset r4 */
4054 "\t.byte 0xd\n\t.uleb128 0xb\n" /* def_cfa_register r11 */
4055 "\t.align 2\n"
4056 ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
4057#endif
4038 break; 4058 break;
4039 default: 4059 default:
4040 break; 4060 break;