diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 3 | ||||
| -rw-r--r-- | src/buildvm_asm.c | 60 | ||||
| -rw-r--r-- | src/buildvm_x64.h | 45 | ||||
| -rw-r--r-- | src/buildvm_x64win.h | 45 | ||||
| -rw-r--r-- | src/buildvm_x86.dasc | 45 | ||||
| -rw-r--r-- | src/buildvm_x86.h | 45 | ||||
| -rw-r--r-- | src/lj_err.c | 4 |
7 files changed, 216 insertions, 31 deletions
diff --git a/src/Makefile b/src/Makefile index 96039ba0..da9d143b 100644 --- a/src/Makefile +++ b/src/Makefile | |||
| @@ -299,8 +299,7 @@ ifeq (Windows,$(HOST_SYS)) | |||
| 299 | endif | 299 | endif |
| 300 | ifeq (Windows,$(TARGET_SYS)) | 300 | ifeq (Windows,$(TARGET_SYS)) |
| 301 | TARGET_DYNCC= $(STATIC_CC) | 301 | TARGET_DYNCC= $(STATIC_CC) |
| 302 | LJVM_BOUT= $(LJVM_O) | 302 | LJVM_MODE= coffasm |
| 303 | LJVM_MODE= peobj | ||
| 304 | LUAJIT_SO= $(TARGET_DLLNAME) | 303 | LUAJIT_SO= $(TARGET_DLLNAME) |
| 305 | LUAJIT_T= luajit.exe | 304 | LUAJIT_T= luajit.exe |
| 306 | ifneq ($(HOST_SYS),$(TARGET_SYS)) | 305 | ifneq ($(HOST_SYS),$(TARGET_SYS)) |
diff --git a/src/buildvm_asm.c b/src/buildvm_asm.c index bd835ebc..2d0ba3b5 100644 --- a/src/buildvm_asm.c +++ b/src/buildvm_asm.c | |||
| @@ -33,14 +33,14 @@ static void emit_asm_reloc(BuildCtx *ctx, int type, const char *sym) | |||
| 33 | fprintf(ctx->fp, "\t.long %s\n", sym); | 33 | fprintf(ctx->fp, "\t.long %s\n", sym); |
| 34 | break; | 34 | break; |
| 35 | case BUILD_coffasm: | 35 | case BUILD_coffasm: |
| 36 | fprintf(ctx->fp, "\t.def _%s; .scl 3; .type 32; .endef\n", sym); | 36 | fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", sym); |
| 37 | if (type) | 37 | if (type) |
| 38 | fprintf(ctx->fp, "\t.long _%s-.-4\n", sym); | 38 | fprintf(ctx->fp, "\t.long %s-.-4\n", sym); |
| 39 | else | 39 | else |
| 40 | fprintf(ctx->fp, "\t.long _%s\n", sym); | 40 | fprintf(ctx->fp, "\t.long %s\n", sym); |
| 41 | break; | 41 | break; |
| 42 | default: /* BUILD_machasm for relative relocations handled below. */ | 42 | default: /* BUILD_machasm for relative relocations handled below. */ |
| 43 | fprintf(ctx->fp, "\t.long _%s\n", sym); | 43 | fprintf(ctx->fp, "\t.long %s\n", sym); |
| 44 | break; | 44 | break; |
| 45 | } | 45 | } |
| 46 | } | 46 | } |
| @@ -70,7 +70,7 @@ err: | |||
| 70 | exit(1); | 70 | exit(1); |
| 71 | } | 71 | } |
| 72 | emit_asm_bytes(ctx, cp, n); | 72 | emit_asm_bytes(ctx, cp, n); |
| 73 | fprintf(ctx->fp, "\t%s _%s\n", opname, sym); | 73 | fprintf(ctx->fp, "\t%s %s\n", opname, sym); |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | /* Emit an assembler label. */ | 76 | /* Emit an assembler label. */ |
| @@ -87,15 +87,15 @@ static void emit_asm_label(BuildCtx *ctx, const char *name, int size, int isfunc | |||
| 87 | name, name, name, isfunc ? "function" : "object", name, size, name); | 87 | name, name, name, isfunc ? "function" : "object", name, size, name); |
| 88 | break; | 88 | break; |
| 89 | case BUILD_coffasm: | 89 | case BUILD_coffasm: |
| 90 | fprintf(ctx->fp, "\n\t.globl _%s\n", name); | 90 | fprintf(ctx->fp, "\n\t.globl %s\n", name); |
| 91 | if (isfunc) | 91 | if (isfunc) |
| 92 | fprintf(ctx->fp, "\t.def _%s; .scl 3; .type 32; .endef\n", name); | 92 | fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", name); |
| 93 | fprintf(ctx->fp, "_%s:\n", name); | 93 | fprintf(ctx->fp, "%s:\n", name); |
| 94 | break; | 94 | break; |
| 95 | case BUILD_machasm: | 95 | case BUILD_machasm: |
| 96 | fprintf(ctx->fp, | 96 | fprintf(ctx->fp, |
| 97 | "\n\t.private_extern _%s\n" | 97 | "\n\t.private_extern %s\n" |
| 98 | "_%s:\n", name, name); | 98 | "%s:\n", name, name); |
| 99 | break; | 99 | break; |
| 100 | default: | 100 | default: |
| 101 | break; | 101 | break; |
| @@ -126,13 +126,22 @@ void emit_asm(BuildCtx *ctx) | |||
| 126 | char name[80]; | 126 | char name[80]; |
| 127 | int32_t prev; | 127 | int32_t prev; |
| 128 | int i, pi, rel; | 128 | int i, pi, rel; |
| 129 | #if LJ_64 | ||
| 130 | const char *symprefix = ctx->mode == BUILD_machasm ? "_" : ""; | ||
| 131 | int keepfc = 0; | ||
| 132 | #else | ||
| 133 | const char *symprefix = ctx->mode != BUILD_elfasm ? "_" : ""; | ||
| 134 | /* Keep fastcall suffix for COFF on WIN32. */ | ||
| 135 | int keepfc = (ctx->mode == BUILD_coffasm); | ||
| 136 | #endif | ||
| 129 | 137 | ||
| 130 | fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch); | 138 | fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch); |
| 131 | fprintf(ctx->fp, "\t.text\n"); | 139 | fprintf(ctx->fp, "\t.text\n"); |
| 132 | emit_asm_align(ctx, 4); | 140 | emit_asm_align(ctx, 4); |
| 133 | 141 | ||
| 134 | emit_asm_label(ctx, LABEL_ASM_BEGIN, 0, 0); | 142 | sprintf(name, "%s" LABEL_ASM_BEGIN, symprefix); |
| 135 | if (ctx->mode == BUILD_elfasm) | 143 | emit_asm_label(ctx, name, 0, 0); |
| 144 | if (ctx->mode != BUILD_machasm) | ||
| 136 | fprintf(ctx->fp, ".Lbegin:\n"); | 145 | fprintf(ctx->fp, ".Lbegin:\n"); |
| 137 | 146 | ||
| 138 | i = 0; | 147 | i = 0; |
| @@ -148,10 +157,10 @@ void emit_asm(BuildCtx *ctx) | |||
| 148 | int32_t stop = next; | 157 | int32_t stop = next; |
| 149 | if (pi >= ctx->npc) { | 158 | if (pi >= ctx->npc) { |
| 150 | char *p; | 159 | char *p; |
| 151 | sprintf(name, LABEL_PREFIX "%s", ctx->globnames[pi-ctx->npc]); | 160 | sprintf(name, "%s" LABEL_PREFIX "%s", symprefix, |
| 152 | /* Always strip fastcall suffix. Wrong for (unused) COFF on Win32. */ | 161 | ctx->globnames[pi-ctx->npc]); |
| 153 | p = strchr(name, '@'); | 162 | p = strchr(name, '@'); |
| 154 | if (p) *p = '\0'; | 163 | if (p) { if (keepfc) name[0] = '@'; else *p = '\0'; } |
| 155 | emit_asm_label(ctx, name, size, 1); | 164 | emit_asm_label(ctx, name, size, 1); |
| 156 | #if LJ_HASJIT | 165 | #if LJ_HASJIT |
| 157 | } else { | 166 | } else { |
| @@ -160,25 +169,21 @@ void emit_asm(BuildCtx *ctx) | |||
| 160 | pi == BC_JLOOP || pi == BC_IFORL || pi == BC_IITERL || | 169 | pi == BC_JLOOP || pi == BC_IFORL || pi == BC_IITERL || |
| 161 | pi == BC_ILOOP)) { | 170 | pi == BC_ILOOP)) { |
| 162 | #endif | 171 | #endif |
| 163 | sprintf(name, LABEL_PREFIX_BC "%s", bc_names[pi]); | 172 | sprintf(name, "%s" LABEL_PREFIX_BC "%s", symprefix, bc_names[pi]); |
| 164 | emit_asm_label(ctx, name, size, 1); | 173 | emit_asm_label(ctx, name, size, 1); |
| 165 | } | 174 | } |
| 166 | while (rel < ctx->nreloc && ctx->reloc[rel].ofs < stop) { | 175 | while (rel < ctx->nreloc && ctx->reloc[rel].ofs < stop) { |
| 167 | BuildReloc *r = &ctx->reloc[rel]; | 176 | BuildReloc *r = &ctx->reloc[rel]; |
| 168 | int n = r->ofs - prev; | 177 | int n = r->ofs - prev; |
| 169 | const char *sym = ctx->extnames[r->sym]; | 178 | char *p; |
| 170 | const char *p = strchr(sym, '@'); | 179 | sprintf(name, "%s%s", symprefix, ctx->extnames[r->sym]); |
| 171 | if (p) { | 180 | p = strchr(name, '@'); |
| 172 | /* Always strip fastcall suffix. Wrong for (unused) COFF on Win32. */ | 181 | if (p) { if (keepfc) name[0] = '@'; else *p = '\0'; } |
| 173 | strncpy(name, sym, p-sym); | ||
| 174 | name[p-sym] = '\0'; | ||
| 175 | sym = name; | ||
| 176 | } | ||
| 177 | if (ctx->mode == BUILD_machasm && r->type != 0) { | 182 | if (ctx->mode == BUILD_machasm && r->type != 0) { |
| 178 | emit_asm_reloc_mach(ctx, ctx->code+prev, n, sym); | 183 | emit_asm_reloc_mach(ctx, ctx->code+prev, n, name); |
| 179 | } else { | 184 | } else { |
| 180 | emit_asm_bytes(ctx, ctx->code+prev, n); | 185 | emit_asm_bytes(ctx, ctx->code+prev, n); |
| 181 | emit_asm_reloc(ctx, r->type, sym); | 186 | emit_asm_reloc(ctx, r->type, name); |
| 182 | } | 187 | } |
| 183 | prev += n+4; | 188 | prev += n+4; |
| 184 | rel++; | 189 | rel++; |
| @@ -203,7 +208,8 @@ void emit_asm(BuildCtx *ctx) | |||
| 203 | } | 208 | } |
| 204 | emit_asm_align(ctx, 5); | 209 | emit_asm_align(ctx, 5); |
| 205 | 210 | ||
| 206 | emit_asm_label(ctx, LABEL_OP_OFS, 2*ctx->npc, 0); | 211 | sprintf(name, "%s" LABEL_OP_OFS, symprefix); |
| 212 | emit_asm_label(ctx, name, 2*ctx->npc, 0); | ||
| 207 | for (i = 0; i < ctx->npc; i++) | 213 | for (i = 0; i < ctx->npc; i++) |
| 208 | fprintf(ctx->fp, "\t.short %d\n", ctx->sym_ofs[i]); | 214 | fprintf(ctx->fp, "\t.short %d\n", ctx->sym_ofs[i]); |
| 209 | 215 | ||
diff --git a/src/buildvm_x64.h b/src/buildvm_x64.h index 76c640da..615b9b82 100644 --- a/src/buildvm_x64.h +++ b/src/buildvm_x64.h | |||
| @@ -2252,6 +2252,51 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
| 2252 | "\t.align " SZPTR "\n" | 2252 | "\t.align " SZPTR "\n" |
| 2253 | ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE); | 2253 | ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE); |
| 2254 | break; | 2254 | break; |
| 2255 | case BUILD_coffasm: | ||
| 2256 | fprintf(ctx->fp, "\t.section .eh_frame,\"dr\"\n"); | ||
| 2257 | fprintf(ctx->fp, | ||
| 2258 | "\t.def %slj_err_unwind_dwarf; .scl 2; .type 32; .endef\n", | ||
| 2259 | LJ_32 ? "_" : ""); | ||
| 2260 | fprintf(ctx->fp, | ||
| 2261 | "Lframe1:\n" | ||
| 2262 | "\t.long LECIE1-LSCIE1\n" | ||
| 2263 | "LSCIE1:\n" | ||
| 2264 | "\t.long 0\n" | ||
| 2265 | "\t.byte 0x1\n" | ||
| 2266 | "\t.string \"zP\"\n" | ||
| 2267 | "\t.uleb128 0x1\n" | ||
| 2268 | "\t.sleb128 -" SZPTR "\n" | ||
| 2269 | "\t.byte " REG_RA "\n" | ||
| 2270 | "\t.uleb128 5\n" /* augmentation length */ | ||
| 2271 | "\t.byte 0x00\n" /* absptr */ | ||
| 2272 | "\t.long %slj_err_unwind_dwarf\n" | ||
| 2273 | "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n" | ||
| 2274 | "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n" | ||
| 2275 | "\t.align " SZPTR "\n" | ||
| 2276 | "LECIE1:\n\n", LJ_32 ? "_" : ""); | ||
| 2277 | fprintf(ctx->fp, | ||
| 2278 | "LSFDE1:\n" | ||
| 2279 | "\t.long LEFDE1-LASFDE1\n" | ||
| 2280 | "LASFDE1:\n" | ||
| 2281 | "\t.long LASFDE1-Lframe1\n" | ||
| 2282 | "\t.long %slj_vm_asm_begin\n" | ||
| 2283 | "\t.long %d\n" | ||
| 2284 | "\t.uleb128 0\n" /* augmentation length */ | ||
| 2285 | "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ | ||
| 2286 | #if LJ_64 | ||
| 2287 | "\t.byte 0x86\n\t.uleb128 0x2\n" /* offset rbp */ | ||
| 2288 | "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ | ||
| 2289 | "\t.byte 0x8f\n\t.uleb128 0x4\n" /* offset r15 */ | ||
| 2290 | "\t.byte 0x8e\n\t.uleb128 0x5\n" /* offset r14 */ | ||
| 2291 | #else | ||
| 2292 | "\t.byte 0x85\n\t.uleb128 0x2\n" /* offset ebp */ | ||
| 2293 | "\t.byte 0x87\n\t.uleb128 0x3\n" /* offset edi */ | ||
| 2294 | "\t.byte 0x86\n\t.uleb128 0x4\n" /* offset esi */ | ||
| 2295 | "\t.byte 0x83\n\t.uleb128 0x5\n" /* offset ebx */ | ||
| 2296 | #endif | ||
| 2297 | "\t.align " SZPTR "\n" | ||
| 2298 | "LEFDE1:\n\n", LJ_32 ? "_" : "", (int)ctx->codesz, CFRAME_SIZE); | ||
| 2299 | break; | ||
| 2255 | case BUILD_machasm: | 2300 | case BUILD_machasm: |
| 2256 | fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); | 2301 | fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); |
| 2257 | fprintf(ctx->fp, | 2302 | fprintf(ctx->fp, |
diff --git a/src/buildvm_x64win.h b/src/buildvm_x64win.h index e4cb8851..2ea21bb8 100644 --- a/src/buildvm_x64win.h +++ b/src/buildvm_x64win.h | |||
| @@ -2248,6 +2248,51 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
| 2248 | "\t.align " SZPTR "\n" | 2248 | "\t.align " SZPTR "\n" |
| 2249 | ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE); | 2249 | ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE); |
| 2250 | break; | 2250 | break; |
| 2251 | case BUILD_coffasm: | ||
| 2252 | fprintf(ctx->fp, "\t.section .eh_frame,\"dr\"\n"); | ||
| 2253 | fprintf(ctx->fp, | ||
| 2254 | "\t.def %slj_err_unwind_dwarf; .scl 2; .type 32; .endef\n", | ||
| 2255 | LJ_32 ? "_" : ""); | ||
| 2256 | fprintf(ctx->fp, | ||
| 2257 | "Lframe1:\n" | ||
| 2258 | "\t.long LECIE1-LSCIE1\n" | ||
| 2259 | "LSCIE1:\n" | ||
| 2260 | "\t.long 0\n" | ||
| 2261 | "\t.byte 0x1\n" | ||
| 2262 | "\t.string \"zP\"\n" | ||
| 2263 | "\t.uleb128 0x1\n" | ||
| 2264 | "\t.sleb128 -" SZPTR "\n" | ||
| 2265 | "\t.byte " REG_RA "\n" | ||
| 2266 | "\t.uleb128 5\n" /* augmentation length */ | ||
| 2267 | "\t.byte 0x00\n" /* absptr */ | ||
| 2268 | "\t.long %slj_err_unwind_dwarf\n" | ||
| 2269 | "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n" | ||
| 2270 | "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n" | ||
| 2271 | "\t.align " SZPTR "\n" | ||
| 2272 | "LECIE1:\n\n", LJ_32 ? "_" : ""); | ||
| 2273 | fprintf(ctx->fp, | ||
| 2274 | "LSFDE1:\n" | ||
| 2275 | "\t.long LEFDE1-LASFDE1\n" | ||
| 2276 | "LASFDE1:\n" | ||
| 2277 | "\t.long LASFDE1-Lframe1\n" | ||
| 2278 | "\t.long %slj_vm_asm_begin\n" | ||
| 2279 | "\t.long %d\n" | ||
| 2280 | "\t.uleb128 0\n" /* augmentation length */ | ||
| 2281 | "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ | ||
| 2282 | #if LJ_64 | ||
| 2283 | "\t.byte 0x86\n\t.uleb128 0x2\n" /* offset rbp */ | ||
| 2284 | "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ | ||
| 2285 | "\t.byte 0x8f\n\t.uleb128 0x4\n" /* offset r15 */ | ||
| 2286 | "\t.byte 0x8e\n\t.uleb128 0x5\n" /* offset r14 */ | ||
| 2287 | #else | ||
| 2288 | "\t.byte 0x85\n\t.uleb128 0x2\n" /* offset ebp */ | ||
| 2289 | "\t.byte 0x87\n\t.uleb128 0x3\n" /* offset edi */ | ||
| 2290 | "\t.byte 0x86\n\t.uleb128 0x4\n" /* offset esi */ | ||
| 2291 | "\t.byte 0x83\n\t.uleb128 0x5\n" /* offset ebx */ | ||
| 2292 | #endif | ||
| 2293 | "\t.align " SZPTR "\n" | ||
| 2294 | "LEFDE1:\n\n", LJ_32 ? "_" : "", (int)ctx->codesz, CFRAME_SIZE); | ||
| 2295 | break; | ||
| 2251 | case BUILD_machasm: | 2296 | case BUILD_machasm: |
| 2252 | fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); | 2297 | fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); |
| 2253 | fprintf(ctx->fp, | 2298 | fprintf(ctx->fp, |
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index 1878613e..4e4ccc49 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc | |||
| @@ -4920,6 +4920,51 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
| 4920 | "\t.align " SZPTR "\n" | 4920 | "\t.align " SZPTR "\n" |
| 4921 | ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE); | 4921 | ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE); |
| 4922 | break; | 4922 | break; |
| 4923 | case BUILD_coffasm: | ||
| 4924 | fprintf(ctx->fp, "\t.section .eh_frame,\"dr\"\n"); | ||
| 4925 | fprintf(ctx->fp, | ||
| 4926 | "\t.def %slj_err_unwind_dwarf; .scl 2; .type 32; .endef\n", | ||
| 4927 | LJ_32 ? "_" : ""); | ||
| 4928 | fprintf(ctx->fp, | ||
| 4929 | "Lframe1:\n" | ||
| 4930 | "\t.long LECIE1-LSCIE1\n" | ||
| 4931 | "LSCIE1:\n" | ||
| 4932 | "\t.long 0\n" | ||
| 4933 | "\t.byte 0x1\n" | ||
| 4934 | "\t.string \"zP\"\n" | ||
| 4935 | "\t.uleb128 0x1\n" | ||
| 4936 | "\t.sleb128 -" SZPTR "\n" | ||
| 4937 | "\t.byte " REG_RA "\n" | ||
| 4938 | "\t.uleb128 5\n" /* augmentation length */ | ||
| 4939 | "\t.byte 0x00\n" /* absptr */ | ||
| 4940 | "\t.long %slj_err_unwind_dwarf\n" | ||
| 4941 | "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n" | ||
| 4942 | "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n" | ||
| 4943 | "\t.align " SZPTR "\n" | ||
| 4944 | "LECIE1:\n\n", LJ_32 ? "_" : ""); | ||
| 4945 | fprintf(ctx->fp, | ||
| 4946 | "LSFDE1:\n" | ||
| 4947 | "\t.long LEFDE1-LASFDE1\n" | ||
| 4948 | "LASFDE1:\n" | ||
| 4949 | "\t.long LASFDE1-Lframe1\n" | ||
| 4950 | "\t.long %slj_vm_asm_begin\n" | ||
| 4951 | "\t.long %d\n" | ||
| 4952 | "\t.uleb128 0\n" /* augmentation length */ | ||
| 4953 | "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ | ||
| 4954 | #if LJ_64 | ||
| 4955 | "\t.byte 0x86\n\t.uleb128 0x2\n" /* offset rbp */ | ||
| 4956 | "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ | ||
| 4957 | "\t.byte 0x8f\n\t.uleb128 0x4\n" /* offset r15 */ | ||
| 4958 | "\t.byte 0x8e\n\t.uleb128 0x5\n" /* offset r14 */ | ||
| 4959 | #else | ||
| 4960 | "\t.byte 0x85\n\t.uleb128 0x2\n" /* offset ebp */ | ||
| 4961 | "\t.byte 0x87\n\t.uleb128 0x3\n" /* offset edi */ | ||
| 4962 | "\t.byte 0x86\n\t.uleb128 0x4\n" /* offset esi */ | ||
| 4963 | "\t.byte 0x83\n\t.uleb128 0x5\n" /* offset ebx */ | ||
| 4964 | #endif | ||
| 4965 | "\t.align " SZPTR "\n" | ||
| 4966 | "LEFDE1:\n\n", LJ_32 ? "_" : "", (int)ctx->codesz, CFRAME_SIZE); | ||
| 4967 | break; | ||
| 4923 | case BUILD_machasm: | 4968 | case BUILD_machasm: |
| 4924 | fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); | 4969 | fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); |
| 4925 | fprintf(ctx->fp, | 4970 | fprintf(ctx->fp, |
diff --git a/src/buildvm_x86.h b/src/buildvm_x86.h index 68f27f93..e98d2622 100644 --- a/src/buildvm_x86.h +++ b/src/buildvm_x86.h | |||
| @@ -2403,6 +2403,51 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
| 2403 | "\t.align " SZPTR "\n" | 2403 | "\t.align " SZPTR "\n" |
| 2404 | ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE); | 2404 | ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE); |
| 2405 | break; | 2405 | break; |
| 2406 | case BUILD_coffasm: | ||
| 2407 | fprintf(ctx->fp, "\t.section .eh_frame,\"dr\"\n"); | ||
| 2408 | fprintf(ctx->fp, | ||
| 2409 | "\t.def %slj_err_unwind_dwarf; .scl 2; .type 32; .endef\n", | ||
| 2410 | LJ_32 ? "_" : ""); | ||
| 2411 | fprintf(ctx->fp, | ||
| 2412 | "Lframe1:\n" | ||
| 2413 | "\t.long LECIE1-LSCIE1\n" | ||
| 2414 | "LSCIE1:\n" | ||
| 2415 | "\t.long 0\n" | ||
| 2416 | "\t.byte 0x1\n" | ||
| 2417 | "\t.string \"zP\"\n" | ||
| 2418 | "\t.uleb128 0x1\n" | ||
| 2419 | "\t.sleb128 -" SZPTR "\n" | ||
| 2420 | "\t.byte " REG_RA "\n" | ||
| 2421 | "\t.uleb128 5\n" /* augmentation length */ | ||
| 2422 | "\t.byte 0x00\n" /* absptr */ | ||
| 2423 | "\t.long %slj_err_unwind_dwarf\n" | ||
| 2424 | "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n" | ||
| 2425 | "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n" | ||
| 2426 | "\t.align " SZPTR "\n" | ||
| 2427 | "LECIE1:\n\n", LJ_32 ? "_" : ""); | ||
| 2428 | fprintf(ctx->fp, | ||
| 2429 | "LSFDE1:\n" | ||
| 2430 | "\t.long LEFDE1-LASFDE1\n" | ||
| 2431 | "LASFDE1:\n" | ||
| 2432 | "\t.long LASFDE1-Lframe1\n" | ||
| 2433 | "\t.long %slj_vm_asm_begin\n" | ||
| 2434 | "\t.long %d\n" | ||
| 2435 | "\t.uleb128 0\n" /* augmentation length */ | ||
| 2436 | "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ | ||
| 2437 | #if LJ_64 | ||
| 2438 | "\t.byte 0x86\n\t.uleb128 0x2\n" /* offset rbp */ | ||
| 2439 | "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ | ||
| 2440 | "\t.byte 0x8f\n\t.uleb128 0x4\n" /* offset r15 */ | ||
| 2441 | "\t.byte 0x8e\n\t.uleb128 0x5\n" /* offset r14 */ | ||
| 2442 | #else | ||
| 2443 | "\t.byte 0x85\n\t.uleb128 0x2\n" /* offset ebp */ | ||
| 2444 | "\t.byte 0x87\n\t.uleb128 0x3\n" /* offset edi */ | ||
| 2445 | "\t.byte 0x86\n\t.uleb128 0x4\n" /* offset esi */ | ||
| 2446 | "\t.byte 0x83\n\t.uleb128 0x5\n" /* offset ebx */ | ||
| 2447 | #endif | ||
| 2448 | "\t.align " SZPTR "\n" | ||
| 2449 | "LEFDE1:\n\n", LJ_32 ? "_" : "", (int)ctx->codesz, CFRAME_SIZE); | ||
| 2450 | break; | ||
| 2406 | case BUILD_machasm: | 2451 | case BUILD_machasm: |
| 2407 | fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); | 2452 | fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); |
| 2408 | fprintf(ctx->fp, | 2453 | fprintf(ctx->fp, |
diff --git a/src/lj_err.c b/src/lj_err.c index 5ec81302..56ca0c37 100644 --- a/src/lj_err.c +++ b/src/lj_err.c | |||
| @@ -63,7 +63,7 @@ | |||
| 63 | ** EXT is mandatory on POSIX/x64 since the interpreter doesn't save r12/r13. | 63 | ** EXT is mandatory on POSIX/x64 since the interpreter doesn't save r12/r13. |
| 64 | */ | 64 | */ |
| 65 | 65 | ||
| 66 | #if defined(__ELF__) || defined(__MACH__) | 66 | #if defined(__GNUC__) |
| 67 | #if LJ_TARGET_X86 | 67 | #if LJ_TARGET_X86 |
| 68 | #ifdef LUAJIT_UNWIND_EXTERNAL | 68 | #ifdef LUAJIT_UNWIND_EXTERNAL |
| 69 | #define LJ_UNWIND_EXT 1 | 69 | #define LJ_UNWIND_EXT 1 |
| @@ -532,7 +532,7 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
| 532 | 532 | ||
| 533 | /* -- External frame unwinding -------------------------------------------- */ | 533 | /* -- External frame unwinding -------------------------------------------- */ |
| 534 | 534 | ||
| 535 | #if defined(__ELF__) || defined(__MACH__) | 535 | #if defined(__GNUC__) |
| 536 | 536 | ||
| 537 | #include <unwind.h> | 537 | #include <unwind.h> |
| 538 | 538 | ||
