diff options
author | Mike Pall <mike> | 2013-05-16 14:40:22 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-05-16 14:40:22 +0200 |
commit | 2b94827e1d7f053e7ff0d724644f59a5b8ccff13 (patch) | |
tree | 49cfe90f401ef3b72b48a610363e5075bc77a81e | |
parent | fd616caf2691d8629aa9096216714ba9defd7748 (diff) | |
parent | 5dabdb2e70799bdd9973495e0e00946e4495eece (diff) | |
download | luajit-2b94827e1d7f053e7ff0d724644f59a5b8ccff13.tar.gz luajit-2b94827e1d7f053e7ff0d724644f59a5b8ccff13.tar.bz2 luajit-2b94827e1d7f053e7ff0d724644f59a5b8ccff13.zip |
Merge branch 'master' into v2.1
-rw-r--r-- | src/Makefile | 3 | ||||
-rw-r--r-- | src/lj_ccall.c | 62 | ||||
-rw-r--r-- | src/lj_ccallback.c | 4 | ||||
-rw-r--r-- | src/lj_err.c | 16 |
4 files changed, 74 insertions, 11 deletions
diff --git a/src/Makefile b/src/Makefile index b9101a74..fa5aed1c 100644 --- a/src/Makefile +++ b/src/Makefile | |||
@@ -479,7 +479,8 @@ TARGET_DEP= $(LIB_VMDEF) $(LUAJIT_SO) | |||
479 | 479 | ||
480 | ifeq (Windows,$(TARGET_SYS)) | 480 | ifeq (Windows,$(TARGET_SYS)) |
481 | TARGET_DYNCC= $(STATIC_CC) | 481 | TARGET_DYNCC= $(STATIC_CC) |
482 | LJVM_MODE= coffasm | 482 | LJVM_MODE= peobj |
483 | LJVM_BOUT= $(LJVM_O) | ||
483 | LUAJIT_T= luajit.exe | 484 | LUAJIT_T= luajit.exe |
484 | ifeq (cygwin,$(HOST_MSYS)) | 485 | ifeq (cygwin,$(HOST_MSYS)) |
485 | LUAJIT_SO= cyg$(TARGET_DLLNAME) | 486 | LUAJIT_SO= cyg$(TARGET_DLLNAME) |
diff --git a/src/lj_ccall.c b/src/lj_ccall.c index 34866dd2..a3ad1974 100644 --- a/src/lj_ccall.c +++ b/src/lj_ccall.c | |||
@@ -31,6 +31,26 @@ | |||
31 | 31 | ||
32 | #else | 32 | #else |
33 | 33 | ||
34 | #if LJ_TARGET_OSX | ||
35 | |||
36 | #define CCALL_HANDLE_STRUCTRET \ | ||
37 | /* Return structs of size 1, 2, 4 or 8 in registers. */ \ | ||
38 | cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \ | ||
39 | if (cc->retref) { \ | ||
40 | if (ngpr < maxgpr) \ | ||
41 | cc->gpr[ngpr++] = (GPRArg)dp; \ | ||
42 | else \ | ||
43 | cc->stack[nsp++] = (GPRArg)dp; \ | ||
44 | } else { /* Struct with single FP field ends up in FPR. */ \ | ||
45 | cc->resx87 = ccall_classify_struct(cts, ctr); \ | ||
46 | } | ||
47 | |||
48 | #define CCALL_HANDLE_STRUCTRET2 \ | ||
49 | if (cc->resx87) sp = (uint8_t *)&cc->fpr[0]; \ | ||
50 | memcpy(dp, sp, ctr->size); | ||
51 | |||
52 | #else | ||
53 | |||
34 | #define CCALL_HANDLE_STRUCTRET \ | 54 | #define CCALL_HANDLE_STRUCTRET \ |
35 | cc->retref = 1; /* Return all structs by reference (in reg or on stack). */ \ | 55 | cc->retref = 1; /* Return all structs by reference (in reg or on stack). */ \ |
36 | if (ngpr < maxgpr) \ | 56 | if (ngpr < maxgpr) \ |
@@ -38,6 +58,8 @@ | |||
38 | else \ | 58 | else \ |
39 | cc->stack[nsp++] = (GPRArg)dp; | 59 | cc->stack[nsp++] = (GPRArg)dp; |
40 | 60 | ||
61 | #endif | ||
62 | |||
41 | #define CCALL_HANDLE_COMPLEXRET \ | 63 | #define CCALL_HANDLE_COMPLEXRET \ |
42 | /* Return complex float in GPRs and complex double by reference. */ \ | 64 | /* Return complex float in GPRs and complex double by reference. */ \ |
43 | cc->retref = (sz > 8); \ | 65 | cc->retref = (sz > 8); \ |
@@ -102,9 +124,9 @@ | |||
102 | /* Windows/x64 argument registers are strictly positional (use ngpr). */ | 124 | /* Windows/x64 argument registers are strictly positional (use ngpr). */ |
103 | #define CCALL_HANDLE_REGARG \ | 125 | #define CCALL_HANDLE_REGARG \ |
104 | if (isfp) { \ | 126 | if (isfp) { \ |
105 | if (ngpr < 4) { dp = &cc->fpr[ngpr++]; nfpr = ngpr; goto done; } \ | 127 | if (ngpr < maxgpr) { dp = &cc->fpr[ngpr++]; nfpr = ngpr; goto done; } \ |
106 | } else { \ | 128 | } else { \ |
107 | if (ngpr < 4) { dp = &cc->gpr[ngpr++]; goto done; } \ | 129 | if (ngpr < maxgpr) { dp = &cc->gpr[ngpr++]; goto done; } \ |
108 | } | 130 | } |
109 | 131 | ||
110 | #elif LJ_TARGET_X64 | 132 | #elif LJ_TARGET_X64 |
@@ -413,6 +435,42 @@ | |||
413 | memcpy(dp, sp, ctr->size); /* Copy struct return value from GPRs. */ | 435 | memcpy(dp, sp, ctr->size); /* Copy struct return value from GPRs. */ |
414 | #endif | 436 | #endif |
415 | 437 | ||
438 | /* -- x86 OSX ABI struct classification ----------------------------------- */ | ||
439 | |||
440 | #if LJ_TARGET_X86 && LJ_TARGET_OSX | ||
441 | |||
442 | /* Check for struct with single FP field. */ | ||
443 | static int ccall_classify_struct(CTState *cts, CType *ct) | ||
444 | { | ||
445 | CTSize sz = ct->size; | ||
446 | if (!(sz == sizeof(float) || sz == sizeof(double))) return 0; | ||
447 | if ((ct->info & CTF_UNION)) return 0; | ||
448 | while (ct->sib) { | ||
449 | ct = ctype_get(cts, ct->sib); | ||
450 | if (ctype_isfield(ct->info)) { | ||
451 | CType *sct = ctype_rawchild(cts, ct); | ||
452 | if (ctype_isfp(sct->info)) { | ||
453 | if (sct->size == sz) | ||
454 | return (sz >> 2); /* Return 1 for float or 2 for double. */ | ||
455 | } else if (ctype_isstruct(sct->info)) { | ||
456 | if (sct->size) | ||
457 | return ccall_classify_struct(cts, sct); | ||
458 | } else { | ||
459 | break; | ||
460 | } | ||
461 | } else if (ctype_isbitfield(ct->info)) { | ||
462 | break; | ||
463 | } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) { | ||
464 | CType *sct = ctype_rawchild(cts, ct); | ||
465 | if (sct->size) | ||
466 | return ccall_classify_struct(cts, sct); | ||
467 | } | ||
468 | } | ||
469 | return 0; | ||
470 | } | ||
471 | |||
472 | #endif | ||
473 | |||
416 | /* -- x64 struct classification ------------------------------------------- */ | 474 | /* -- x64 struct classification ------------------------------------------- */ |
417 | 475 | ||
418 | #if LJ_TARGET_X64 && !LJ_ABI_WIN | 476 | #if LJ_TARGET_X64 && !LJ_ABI_WIN |
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c index a3a0d798..00109923 100644 --- a/src/lj_ccallback.c +++ b/src/lj_ccallback.c | |||
@@ -286,9 +286,9 @@ void lj_ccallback_mcode_free(CTState *cts) | |||
286 | /* Windows/x64 argument registers are strictly positional (use ngpr). */ | 286 | /* Windows/x64 argument registers are strictly positional (use ngpr). */ |
287 | #define CALLBACK_HANDLE_REGARG \ | 287 | #define CALLBACK_HANDLE_REGARG \ |
288 | if (isfp) { \ | 288 | if (isfp) { \ |
289 | if (ngpr < 4) { sp = &cts->cb.fpr[ngpr++]; nfpr = ngpr; goto done; } \ | 289 | if (ngpr < maxgpr) { sp = &cts->cb.fpr[ngpr++]; UNUSED(nfpr); goto done; } \ |
290 | } else { \ | 290 | } else { \ |
291 | if (ngpr < 4) { sp = &cts->cb.gpr[ngpr++]; goto done; } \ | 291 | if (ngpr < maxgpr) { sp = &cts->cb.gpr[ngpr++]; goto done; } \ |
292 | } | 292 | } |
293 | 293 | ||
294 | #elif LJ_TARGET_X64 | 294 | #elif LJ_TARGET_X64 |
diff --git a/src/lj_err.c b/src/lj_err.c index 8ff0a455..7ae87a82 100644 --- a/src/lj_err.c +++ b/src/lj_err.c | |||
@@ -386,12 +386,17 @@ typedef struct UndocumentedDispatcherContext { | |||
386 | ULONG Fill0; | 386 | ULONG Fill0; |
387 | } UndocumentedDispatcherContext; | 387 | } UndocumentedDispatcherContext; |
388 | 388 | ||
389 | #ifdef _MSC_VER | ||
390 | /* Another wild guess. */ | 389 | /* Another wild guess. */ |
391 | extern __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow); | 390 | extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow); |
391 | |||
392 | #ifdef MINGW_SDK_INIT | ||
393 | /* Workaround for broken MinGW64 declaration. */ | ||
394 | VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx"); | ||
395 | #define RtlUnwindEx RtlUnwindEx_FIXED | ||
392 | #endif | 396 | #endif |
393 | 397 | ||
394 | #define LJ_MSVC_EXCODE ((DWORD)0xe06d7363) | 398 | #define LJ_MSVC_EXCODE ((DWORD)0xe06d7363) |
399 | #define LJ_GCC_EXCODE ((DWORD)0x20474343) | ||
395 | 400 | ||
396 | #define LJ_EXCODE ((DWORD)0xe24c4a00) | 401 | #define LJ_EXCODE ((DWORD)0xe24c4a00) |
397 | #define LJ_EXCODE_MAKE(c) (LJ_EXCODE | (DWORD)(c)) | 402 | #define LJ_EXCODE_MAKE(c) (LJ_EXCODE | (DWORD)(c)) |
@@ -411,10 +416,9 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec, | |||
411 | } else { | 416 | } else { |
412 | void *cf2 = err_unwind(L, cf, 0); | 417 | void *cf2 = err_unwind(L, cf, 0); |
413 | if (cf2) { /* We catch it, so start unwinding the upper frames. */ | 418 | if (cf2) { /* We catch it, so start unwinding the upper frames. */ |
414 | if (rec->ExceptionCode == LJ_MSVC_EXCODE) { | 419 | if (rec->ExceptionCode == LJ_MSVC_EXCODE || |
415 | #ifdef _MSC_VER | 420 | rec->ExceptionCode == LJ_GCC_EXCODE) { |
416 | __DestructExceptionObject(rec, 1); | 421 | __DestructExceptionObject(rec, 1); |
417 | #endif | ||
418 | setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP)); | 422 | setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP)); |
419 | } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) { | 423 | } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) { |
420 | /* Don't catch access violations etc. */ | 424 | /* Don't catch access violations etc. */ |
@@ -427,7 +431,7 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec, | |||
427 | RtlUnwindEx(cf, (void *)((cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ? | 431 | RtlUnwindEx(cf, (void *)((cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ? |
428 | lj_vm_unwind_ff_eh : | 432 | lj_vm_unwind_ff_eh : |
429 | lj_vm_unwind_c_eh), | 433 | lj_vm_unwind_c_eh), |
430 | rec, (void *)errcode, ctx, dispatch->HistoryTable); | 434 | rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable); |
431 | /* RtlUnwindEx should never return. */ | 435 | /* RtlUnwindEx should never return. */ |
432 | } | 436 | } |
433 | } | 437 | } |