aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-05-25 10:18:12 +0200
committerMike Pall <mike>2013-05-25 10:18:12 +0200
commit5a261dd92c72d8f9d2aab0714ce9e051f0d70219 (patch)
treeee36a876cb6ef4229a426efa9083811037371507
parentd686217926b75e6f93044b190943ad098d103bfe (diff)
downloadluajit-5a261dd92c72d8f9d2aab0714ce9e051f0d70219.tar.gz
luajit-5a261dd92c72d8f9d2aab0714ce9e051f0d70219.tar.bz2
luajit-5a261dd92c72d8f9d2aab0714ce9e051f0d70219.zip
Fix compatibility issues with Illumos.
Thanks to Theo Schlossnagle.
-rw-r--r--src/lj_alloc.c17
-rw-r--r--src/luajit.c15
-rw-r--r--src/vm_x86.dasc4
3 files changed, 23 insertions, 13 deletions
diff --git a/src/lj_alloc.c b/src/lj_alloc.c
index 82b4e5b1..8f285d17 100644
--- a/src/lj_alloc.c
+++ b/src/lj_alloc.c
@@ -188,21 +188,24 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
188 return ptr; 188 return ptr;
189} 189}
190 190
191#elif LJ_TARGET_OSX || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) 191#elif LJ_TARGET_OSX || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__sun__)
192 192
193/* OSX and FreeBSD mmap() use a naive first-fit linear search. 193/* OSX and FreeBSD mmap() use a naive first-fit linear search.
194** That's perfect for us. Except that -pagezero_size must be set for OSX, 194** That's perfect for us. Except that -pagezero_size must be set for OSX,
195** otherwise the lower 4GB are blocked. And the 32GB RLIMIT_DATA needs 195** otherwise the lower 4GB are blocked. And the 32GB RLIMIT_DATA needs
196** to be reduced to 250MB on FreeBSD. 196** to be reduced to 250MB on FreeBSD.
197*/ 197*/
198#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) 198#if LJ_TARGET_OSX
199#include <sys/resource.h>
200#define MMAP_REGION_START ((uintptr_t)0x10000000)
201#else
202#define MMAP_REGION_START ((uintptr_t)0x10000) 199#define MMAP_REGION_START ((uintptr_t)0x10000)
200#else
201#define MMAP_REGION_START ((uintptr_t)0x10000000)
203#endif 202#endif
204#define MMAP_REGION_END ((uintptr_t)0x80000000) 203#define MMAP_REGION_END ((uintptr_t)0x80000000)
205 204
205#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
206#include <sys/resource.h>
207#endif
208
206static LJ_AINLINE void *CALL_MMAP(size_t size) 209static LJ_AINLINE void *CALL_MMAP(size_t size)
207{ 210{
208 int olderr = errno; 211 int olderr = errno;
@@ -227,6 +230,10 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
227 return p; 230 return p;
228 } 231 }
229 if (p != CMFAIL) munmap(p, size); 232 if (p != CMFAIL) munmap(p, size);
233#ifdef __sun__
234 alloc_hint += 0x1000000; /* Need near-exhaustive linear scan. */
235 if (alloc_hint + size < MMAP_REGION_END) continue;
236#endif
230 if (retry) break; 237 if (retry) break;
231 retry = 1; 238 retry = 1;
232 alloc_hint = MMAP_REGION_START; 239 alloc_hint = MMAP_REGION_START;
diff --git a/src/luajit.c b/src/luajit.c
index 37b0deb3..e0eacc42 100644
--- a/src/luajit.c
+++ b/src/luajit.c
@@ -499,15 +499,15 @@ static int handle_luainit(lua_State *L)
499 return dostring(L, init, "=" LUA_INIT); 499 return dostring(L, init, "=" LUA_INIT);
500} 500}
501 501
502struct Smain { 502static struct Smain {
503 char **argv; 503 char **argv;
504 int argc; 504 int argc;
505 int status; 505 int status;
506}; 506} smain;
507 507
508static int pmain(lua_State *L) 508static int pmain(lua_State *L)
509{ 509{
510 struct Smain *s = (struct Smain *)lua_touserdata(L, 1); 510 struct Smain *s = &smain;
511 char **argv = s->argv; 511 char **argv = s->argv;
512 int script; 512 int script;
513 int flags = 0; 513 int flags = 0;
@@ -556,17 +556,16 @@ static int pmain(lua_State *L)
556int main(int argc, char **argv) 556int main(int argc, char **argv)
557{ 557{
558 int status; 558 int status;
559 struct Smain s;
560 lua_State *L = lua_open(); /* create state */ 559 lua_State *L = lua_open(); /* create state */
561 if (L == NULL) { 560 if (L == NULL) {
562 l_message(argv[0], "cannot create state: not enough memory"); 561 l_message(argv[0], "cannot create state: not enough memory");
563 return EXIT_FAILURE; 562 return EXIT_FAILURE;
564 } 563 }
565 s.argc = argc; 564 smain.argc = argc;
566 s.argv = argv; 565 smain.argv = argv;
567 status = lua_cpcall(L, pmain, &s); 566 status = lua_cpcall(L, pmain, NULL);
568 report(L, status); 567 report(L, status);
569 lua_close(L); 568 lua_close(L);
570 return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; 569 return (status || smain.status) ? EXIT_FAILURE : EXIT_SUCCESS;
571} 570}
572 571
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc
index b4674e2b..f25dfd30 100644
--- a/src/vm_x86.dasc
+++ b/src/vm_x86.dasc
@@ -6152,7 +6152,11 @@ static void emit_asm_debug(BuildCtx *ctx)
6152 ".LEFDE1:\n\n", (int)ctx->codesz - fcofs); 6152 ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
6153#endif 6153#endif
6154#if (defined(__sun__) && defined(__svr4__)) 6154#if (defined(__sun__) && defined(__svr4__))
6155#if LJ_64
6156 fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n");
6157#else
6155 fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n"); 6158 fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");
6159#endif
6156#else 6160#else
6157 fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n"); 6161 fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");
6158#endif 6162#endif