diff options
Diffstat (limited to 'src/host/buildvm.c')
-rw-r--r-- | src/host/buildvm.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/src/host/buildvm.c b/src/host/buildvm.c index a12245fd..9ee47ada 100644 --- a/src/host/buildvm.c +++ b/src/host/buildvm.c | |||
@@ -18,8 +18,10 @@ | |||
18 | #include "lj_obj.h" | 18 | #include "lj_obj.h" |
19 | #include "lj_gc.h" | 19 | #include "lj_gc.h" |
20 | #include "lj_bc.h" | 20 | #include "lj_bc.h" |
21 | #if LJ_HASJIT | ||
21 | #include "lj_ir.h" | 22 | #include "lj_ir.h" |
22 | #include "lj_ircall.h" | 23 | #include "lj_ircall.h" |
24 | #endif | ||
23 | #include "lj_frame.h" | 25 | #include "lj_frame.h" |
24 | #include "lj_dispatch.h" | 26 | #include "lj_dispatch.h" |
25 | #if LJ_HASFFI | 27 | #if LJ_HASFFI |
@@ -59,10 +61,10 @@ static int collect_reloc(BuildCtx *ctx, uint8_t *addr, int idx, int type); | |||
59 | #include "../dynasm/dasm_x86.h" | 61 | #include "../dynasm/dasm_x86.h" |
60 | #elif LJ_TARGET_ARM | 62 | #elif LJ_TARGET_ARM |
61 | #include "../dynasm/dasm_arm.h" | 63 | #include "../dynasm/dasm_arm.h" |
64 | #elif LJ_TARGET_ARM64 | ||
65 | #include "../dynasm/dasm_arm64.h" | ||
62 | #elif LJ_TARGET_PPC | 66 | #elif LJ_TARGET_PPC |
63 | #include "../dynasm/dasm_ppc.h" | 67 | #include "../dynasm/dasm_ppc.h" |
64 | #elif LJ_TARGET_PPCSPE | ||
65 | #include "../dynasm/dasm_ppc.h" | ||
66 | #elif LJ_TARGET_MIPS | 68 | #elif LJ_TARGET_MIPS |
67 | #include "../dynasm/dasm_mips.h" | 69 | #include "../dynasm/dasm_mips.h" |
68 | #else | 70 | #else |
@@ -110,11 +112,11 @@ static const char *sym_decorate(BuildCtx *ctx, | |||
110 | if (p) { | 112 | if (p) { |
111 | #if LJ_TARGET_X86ORX64 | 113 | #if LJ_TARGET_X86ORX64 |
112 | if (!LJ_64 && (ctx->mode == BUILD_coffasm || ctx->mode == BUILD_peobj)) | 114 | if (!LJ_64 && (ctx->mode == BUILD_coffasm || ctx->mode == BUILD_peobj)) |
113 | name[0] = '@'; | 115 | name[0] = name[1] == 'R' ? '_' : '@'; /* Just for _RtlUnwind@16. */ |
114 | else | 116 | else |
115 | *p = '\0'; | 117 | *p = '\0'; |
116 | #elif (LJ_TARGET_PPC || LJ_TARGET_PPCSPE) && !LJ_TARGET_CONSOLE | 118 | #elif LJ_TARGET_PPC && !LJ_TARGET_CONSOLE |
117 | /* Keep @plt. */ | 119 | /* Keep @plt etc. */ |
118 | #else | 120 | #else |
119 | *p = '\0'; | 121 | *p = '\0'; |
120 | #endif | 122 | #endif |
@@ -179,6 +181,7 @@ static int build_code(BuildCtx *ctx) | |||
179 | ctx->nreloc = 0; | 181 | ctx->nreloc = 0; |
180 | 182 | ||
181 | ctx->globnames = globnames; | 183 | ctx->globnames = globnames; |
184 | ctx->extnames = extnames; | ||
182 | ctx->relocsym = (const char **)malloc(NRELOCSYM*sizeof(const char *)); | 185 | ctx->relocsym = (const char **)malloc(NRELOCSYM*sizeof(const char *)); |
183 | ctx->nrelocsym = 0; | 186 | ctx->nrelocsym = 0; |
184 | for (i = 0; i < (int)NRELOCSYM; i++) relocmap[i] = -1; | 187 | for (i = 0; i < (int)NRELOCSYM; i++) relocmap[i] = -1; |
@@ -249,6 +252,7 @@ BCDEF(BCNAME) | |||
249 | NULL | 252 | NULL |
250 | }; | 253 | }; |
251 | 254 | ||
255 | #if LJ_HASJIT | ||
252 | const char *const ir_names[] = { | 256 | const char *const ir_names[] = { |
253 | #define IRNAME(name, m, m1, m2) #name, | 257 | #define IRNAME(name, m, m1, m2) #name, |
254 | IRDEF(IRNAME) | 258 | IRDEF(IRNAME) |
@@ -289,7 +293,9 @@ static const char *const trace_errors[] = { | |||
289 | #include "lj_traceerr.h" | 293 | #include "lj_traceerr.h" |
290 | NULL | 294 | NULL |
291 | }; | 295 | }; |
296 | #endif | ||
292 | 297 | ||
298 | #if LJ_HASJIT | ||
293 | static const char *lower(char *buf, const char *s) | 299 | static const char *lower(char *buf, const char *s) |
294 | { | 300 | { |
295 | char *p = buf; | 301 | char *p = buf; |
@@ -300,6 +306,7 @@ static const char *lower(char *buf, const char *s) | |||
300 | *p = '\0'; | 306 | *p = '\0'; |
301 | return buf; | 307 | return buf; |
302 | } | 308 | } |
309 | #endif | ||
303 | 310 | ||
304 | /* Emit C source code for bytecode-related definitions. */ | 311 | /* Emit C source code for bytecode-related definitions. */ |
305 | static void emit_bcdef(BuildCtx *ctx) | 312 | static void emit_bcdef(BuildCtx *ctx) |
@@ -317,23 +324,26 @@ static void emit_bcdef(BuildCtx *ctx) | |||
317 | /* Emit VM definitions as Lua code for debug modules. */ | 324 | /* Emit VM definitions as Lua code for debug modules. */ |
318 | static void emit_vmdef(BuildCtx *ctx) | 325 | static void emit_vmdef(BuildCtx *ctx) |
319 | { | 326 | { |
327 | #if LJ_HASJIT | ||
320 | char buf[80]; | 328 | char buf[80]; |
329 | #endif | ||
321 | int i; | 330 | int i; |
322 | fprintf(ctx->fp, "-- This is a generated file. DO NOT EDIT!\n\n"); | 331 | fprintf(ctx->fp, "-- This is a generated file. DO NOT EDIT!\n\n"); |
323 | fprintf(ctx->fp, "module(...)\n\n"); | 332 | fprintf(ctx->fp, "return {\n\n"); |
324 | 333 | ||
325 | fprintf(ctx->fp, "bcnames = \""); | 334 | fprintf(ctx->fp, "bcnames = \""); |
326 | for (i = 0; bc_names[i]; i++) fprintf(ctx->fp, "%-6s", bc_names[i]); | 335 | for (i = 0; bc_names[i]; i++) fprintf(ctx->fp, "%-6s", bc_names[i]); |
327 | fprintf(ctx->fp, "\"\n\n"); | 336 | fprintf(ctx->fp, "\",\n\n"); |
328 | 337 | ||
338 | #if LJ_HASJIT | ||
329 | fprintf(ctx->fp, "irnames = \""); | 339 | fprintf(ctx->fp, "irnames = \""); |
330 | for (i = 0; ir_names[i]; i++) fprintf(ctx->fp, "%-6s", ir_names[i]); | 340 | for (i = 0; ir_names[i]; i++) fprintf(ctx->fp, "%-6s", ir_names[i]); |
331 | fprintf(ctx->fp, "\"\n\n"); | 341 | fprintf(ctx->fp, "\",\n\n"); |
332 | 342 | ||
333 | fprintf(ctx->fp, "irfpm = { [0]="); | 343 | fprintf(ctx->fp, "irfpm = { [0]="); |
334 | for (i = 0; irfpm_names[i]; i++) | 344 | for (i = 0; irfpm_names[i]; i++) |
335 | fprintf(ctx->fp, "\"%s\", ", lower(buf, irfpm_names[i])); | 345 | fprintf(ctx->fp, "\"%s\", ", lower(buf, irfpm_names[i])); |
336 | fprintf(ctx->fp, "}\n\n"); | 346 | fprintf(ctx->fp, "},\n\n"); |
337 | 347 | ||
338 | fprintf(ctx->fp, "irfield = { [0]="); | 348 | fprintf(ctx->fp, "irfield = { [0]="); |
339 | for (i = 0; irfield_names[i]; i++) { | 349 | for (i = 0; irfield_names[i]; i++) { |
@@ -343,17 +353,18 @@ static void emit_vmdef(BuildCtx *ctx) | |||
343 | if (p) *p = '.'; | 353 | if (p) *p = '.'; |
344 | fprintf(ctx->fp, "\"%s\", ", buf); | 354 | fprintf(ctx->fp, "\"%s\", ", buf); |
345 | } | 355 | } |
346 | fprintf(ctx->fp, "}\n\n"); | 356 | fprintf(ctx->fp, "},\n\n"); |
347 | 357 | ||
348 | fprintf(ctx->fp, "ircall = {\n[0]="); | 358 | fprintf(ctx->fp, "ircall = {\n[0]="); |
349 | for (i = 0; ircall_names[i]; i++) | 359 | for (i = 0; ircall_names[i]; i++) |
350 | fprintf(ctx->fp, "\"%s\",\n", ircall_names[i]); | 360 | fprintf(ctx->fp, "\"%s\",\n", ircall_names[i]); |
351 | fprintf(ctx->fp, "}\n\n"); | 361 | fprintf(ctx->fp, "},\n\n"); |
352 | 362 | ||
353 | fprintf(ctx->fp, "traceerr = {\n[0]="); | 363 | fprintf(ctx->fp, "traceerr = {\n[0]="); |
354 | for (i = 0; trace_errors[i]; i++) | 364 | for (i = 0; trace_errors[i]; i++) |
355 | fprintf(ctx->fp, "\"%s\",\n", trace_errors[i]); | 365 | fprintf(ctx->fp, "\"%s\",\n", trace_errors[i]); |
356 | fprintf(ctx->fp, "}\n\n"); | 366 | fprintf(ctx->fp, "},\n\n"); |
367 | #endif | ||
357 | } | 368 | } |
358 | 369 | ||
359 | /* -- Argument parsing ---------------------------------------------------- */ | 370 | /* -- Argument parsing ---------------------------------------------------- */ |
@@ -490,6 +501,7 @@ int main(int argc, char **argv) | |||
490 | case BUILD_vmdef: | 501 | case BUILD_vmdef: |
491 | emit_vmdef(ctx); | 502 | emit_vmdef(ctx); |
492 | emit_lib(ctx); | 503 | emit_lib(ctx); |
504 | fprintf(ctx->fp, "}\n\n"); | ||
493 | break; | 505 | break; |
494 | case BUILD_ffdef: | 506 | case BUILD_ffdef: |
495 | case BUILD_libdef: | 507 | case BUILD_libdef: |