aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-05-16 14:40:22 +0200
committerMike Pall <mike>2013-05-16 14:40:22 +0200
commit2b94827e1d7f053e7ff0d724644f59a5b8ccff13 (patch)
tree49cfe90f401ef3b72b48a610363e5075bc77a81e
parentfd616caf2691d8629aa9096216714ba9defd7748 (diff)
parent5dabdb2e70799bdd9973495e0e00946e4495eece (diff)
downloadluajit-2b94827e1d7f053e7ff0d724644f59a5b8ccff13.tar.gz
luajit-2b94827e1d7f053e7ff0d724644f59a5b8ccff13.tar.bz2
luajit-2b94827e1d7f053e7ff0d724644f59a5b8ccff13.zip
Merge branch 'master' into v2.1
-rw-r--r--src/Makefile3
-rw-r--r--src/lj_ccall.c62
-rw-r--r--src/lj_ccallback.c4
-rw-r--r--src/lj_err.c16
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
480ifeq (Windows,$(TARGET_SYS)) 480ifeq (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. */
443static 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. */
391extern __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow); 390extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);
391
392#ifdef MINGW_SDK_INIT
393/* Workaround for broken MinGW64 declaration. */
394VOID 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 }