diff options
Diffstat (limited to 'src/buildvm_arm.dasc')
-rw-r--r-- | src/buildvm_arm.dasc | 28 |
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. */ |
4004 | static void emit_asm_debug(BuildCtx *ctx) | 4006 | static 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; |